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的使用权而进入挂起状。在中断返回的时候,若该任务还是最高优先级的,则恢复运行。
如果不是这样,就回到就绪态。
4:任务切换:-----Context Switch
任务切换时暂停一个任务的运行,云更新另一个处于就绪态的任务,暂停一个任务,以后又能恢复运行,必须考虑将这个任务的信息保存,而恢复运行的时候需要将这些信息恢复到运行环境。
因此,任务切换必须做环境的保存和恢复的操作。
环境的保存和恢复与任务有关,业余任务运行的硬件环境有关(PC和ARM有不同的寄存器,所以不同,因此涉及到汇编语言实现的最底层代码。---因此需要一定的计算机原理或者嵌入式系统的基本知识。
多任务的关键在于.如何将调度,ucos采用的是可剥夺优先级调度算法。
多任务下,个任务还要按照一定的次序运行,因此存在同步问题,因此引入了信号量的改年来进行同步。
人物间有相互通信的需求,因此操作系统需要有邮箱、消息等用于通信的数据结构,以便多任务通信。
多个任务可能真多有限的资源而不发生冲突,因此操作系统还需要管理各任务,使他们能够充分利用资源而不发生冲突,因此又产生了互斥,死锁等概念。
void usertask1(void *pParam)
{
int sum;
for( ; ; )
{
printf("\ntask% call add2(1,2)\n",1);
sum=add2(1,2);
printf("\ntask% call add2(1,2) solution is %d\n",1,sum);
}
}
void usertask2(void *pParam)
{
int sum;
for( ; ; )
{
printf("\ntask% call add2(100,200)\n",2);
sum=add2(100,200);
printf("\ntask% call add2(100,200) solution is %d\n",2,sum);
}
}
|