实时操作系统的任务

1、任务简介
任务是程序的动态表现,在操作系统中体现为线程,是程序的一次执行过程。程序是静止的,存在于ROM、硬盘等设备中。任务是运动的,存在于内存或闪存中,有睡眠、就绪、运行、阻塞、挂起等多种状态。相同程序的多次执行时允许的,这样就形成了多个优先级不同的任务,每个任务都相互独立。

典型的任务运行方式是循环。

标准的任务结构代码如下:(用户任务)

void   usertask(void *pParam)   //参数是指针类型的
{
   int  i=*((int *)pParam);  
//将指针强制转换为指向整数类型的指针,然后取改指针所指的内容,将它赋值给一个局部变量i
for( ; ; )                          //进入无限循环
printf("\n\r%d\n",i++);          //在循环体打印输出当前的计数值i
OSTimeDly(OS_TICKS_PER_SEC);    //调用操作系统演示函数,延时1s。1s后又可以获得运行,继续循环
}

注:OSTimeDly首先将本任务阻塞掉,这样,即使该任务优先级最高,也可以让低优先级的任务获得运行的机会。操作系统1s后使这个任务重新就绪,重新得到运行。

2、多任务
优点:可以大大提高cpu的利用率,使应用程序分成多个程序模块,实现模块化,应用程序更易于设计和维护。

例如:在ARM采集处理系统中,同时采集16路信号,又同时对多信号进行处理和传输,
可以创建16个任务负责16路信号的采集,创建一个任务对信号进行处理,再创建一个任务负责数据的传输。

int main(int argc, char **argv)
{
int  p[2];
p[0]=0;
p[1]=100;

OSInit();         //对uc/osII 内核进行初始化
OSTaskCreate(TaskStart,0,&TaskStk[0][TASK_STK_SIZE-1],TaskStart_Prio);  
//创建一个设置时钟中断的任务
OSTaskCreate(usertask,p,&TaskStk[2][TASK_STK_SIZE-1],5);  
//创建用户任务,任务代码是例1的usertask,参数是p,即指向p[0]的指针,优先级是5
OSTaskCreate(usertask,p+1,&TaskStk[3][TASK_STK_SIZE-1],6);
//创建用户任务,任务代码是例1的usertask,参数是p+1,即指向p[1]的指针,优先级是6
  
OSStart();     /开始启动多任务
return 0;
}

分析:

两个用户任务的优先级虽然不同,但是都执行延时操作,也就是说主动放弃cpu,因此可以轮流运行。(如果没有执行延时操作,把自己阻塞起来,在高优先级任务结束前,低优先级的任务是不能得到运行的)

运行结果: 第一个任务的参数是0,从0开始计数,第二个任务的参数是100,从100开始计数。两个任务轮流输出结果到屏幕,多任务被调度运行了。

任务转态之间的转换
在这里插入图片描述
1:睡眠态
在调用 OSTaskCreate() 任务创建函数)创建之前,处于睡眠状态。 睡眠状态的任务是不会运行的,操作系统也不会为他设置运行而准备的数据结构,没有给它配置任务模块。

2:就绪态
当操作系统调用 OSTaskCreate() 创建一个任务后,任务进入就绪态。图中可以看到,任务也可以从其他状态进入就绪态。

处于就绪态的任务 :操作系统已经为其运行配置好了任务控制模块等数据结构。
当没有比它优先级更高的任务或者优先级更高的任务处于阻塞态的时候,就可以被系统调度进入运行态,操作系统是调用任务切换函数完成的。

3:运行态
运行态是任务真正占有cpu,得到运行。这时运行的代码就是任务的代码,如usertask。
处于运行态的任务如果运行完成,就会进入睡眠态。
如果更高优先级的任务抢占了cpu,就会转到就绪态。

如果 因为等待某一事件,例如等待1s的时间,OSTimeDly(OS_TICKS_PER_SEC);需要暂时放弃cpu的使用权而让其他任务得到运行,就进入阻塞态。

当由于中断的到来而使cpu进入中断服务函数ISR,必然使正在运行过得任务放弃cpu而转入中断服务程序,这是被中断的程序就会被挂起而进入挂起态。

4:阻塞态
阻塞态对于操作系统的调度、任务的协调运行时很重要的。
图中所示:并不是只有一个高优先级的任务在运行,是因为usertask在没有事情可做,在等待1s的时候,不是强行运行代码,而使把自己阻塞起来,使操作系统可以调度其他的任务。OSTimeDly(OS_TICKS_PER_SEC);

当任务在等待某些还没有被释放的资源或等待一定时间的时候,要阻塞起来,等到条件满足的时候再重新回到就绪态,又能被操作系统调度以进入运行态。这是实时操作系统必须实现的功能之一。
注意:错误:一些不理解操作系统的读者编程时候,在等待的时候常常使用for循环,不停的执行代码而使cpu的利用率暴增,使系统的运行,甚至造成死机,十分恶劣。这样不可取。

5:挂起态
当任务在运行时,因为中断的发生(例如定时器中断每个时钟滴答)中断一次,被剥夺cpu的使用权而进入挂起状。在中断返回的时候,若该任务还是最高优先级的,则恢复运行。
如果不是这样,就回到就绪态。


来源:嵌入式实时操作系统uC/OS原理与实践 ---- 卢有亮

猜你喜欢

转载自blog.csdn.net/weixin_41536025/article/details/89355226