UCOS任务管理

◆ 建立任务,在UCOS中有两个函数OSTaskCreate()和OSTaskCreateExt()可以建立任务,我先前写任务时,几乎不用 OSTaskCreateExt(),因为它的参数太多,而ADS最多支持4个参数的函数,否则其它的参数会通过栈来存取,会增加CPU的工作量;而 OSTaskCreate()恰好是4个变量的参数,分别是指向任务函数的指针,传递给任务函数的参数,分配给任务的堆栈的栈顶指针以及分配给任务的优先级。其建立任务的过程简述如下,先关中断,检查分配给该任务的优先级是否可用,发现可用,就用,并把该优先级标志为已用,在开中断,接下来进行任务堆栈初始化;任务控制块的初始化,如果初始化成功,则把任务数加1,否则把该优先级所在的就绪表置0。

◆ 堆栈检验-OSTaskStkChk(),该功能函数在ARM中很少用,因为用它,必须使用OSTaskCreateExt()来创建任务,它的基本思想就是跟住任务堆栈栈底的指针和栈顶指针来计算空闲栈空间的。然后把空闲的和已用的空间大小保存在一个结构体中。

◆ 删除任务-OSTaskDel(),删除任务并不是把任务的代码给删除了,而是将任务处于休眠状; 它首先要检查系统是否处于中断状态,如果是,显然是不能删除任务的,因为它一是比较乱费时间,使系统的实时性能大打折扣,二它可能有些资源还没有释放,总 的来说就是怕出现死锁。还要检查将要删除的任务是否是空闲任务,因为空闲任务是不能删除的,不过统计任务倒是可以,当然可以删除自己也可以删除别人。其具 体的删除思路,首先把任务从就绪列表中去除【如果处于就绪列表中】,当然如果处于其它的比如说事件,邮箱等等待表中,也要把他们给删除,避免死锁;同时任 务的时钟节拍延迟清0,以增强其余任务的实时性,同时把该任务的控制块中的OSTCBStat标志为OS_STAT_RDY,防止待会开中断时其它任务调 用OSTaskResume()。接下来一系列的语句就是把要删除的任务控制块放回空任务控制块链表中。

◆ 请求删除任务-OSTaskDelReq(),因为有些时候,任务会占用一些内存缓冲区或信号量一类的资源,这时如果另一个任务试图删除该任 务,这些资源会因为没有被释放而丢失,造成数据丢失,是嵌入式系统无法接受的,这时我们可以通过该功能函数实现,就是说某一任务释放完自己所占用的内存资 源后在向系统发送请求删除自己的信号,由其它任务来删除,这样可以保存系统内存资源不被丢失。

◆ 改变任务的优先级-OSTaskChangePrio(),故名之意就是在系统中动态的改变任务的优先级,它有两个参数,旧的优先级和新的优先 级。其具体思路,首先检测旧优先级是不是空闲任务的,因为空闲任务我们是动不得的;然后把新优先级在就绪表中置1,表示该优先级已经有任务占有啦,然后按 照就绪表的结构以及算法把相应的数据算出来,最后把就优先级的任务控制块中关于优先级的参数全部更新;如果该任务还包括时间控制块,那么它也要做相应的更新,其步骤与任务控制块一样的思路,最后进行任务调度。

◆ 挂起任务-OSTaskSuspend(),要恢复挂起任务只能通过OSTaskResume()功能函数来恢复。首先空闲任务是不能挂起的, 同时挂起的任务必须存在,还要把挂起任务的任务控制块的从就绪列表清除后,且把任务控制块中标记状态标志的参数设为挂起,如果挂起的是自身,还要进行任务 调度,才能挂起自身。

◆ 恢复任务-OSTaskResume(),恢复挂起的任务。

posted on 2013-03-08 13:22  AI_JJ  阅读(289)  评论(0)    收藏  举报

导航