uC/OS-II的任务管理(在文件OS_task.C中)

uC/OS-II的任务管理(在文件OS_task.C中)

 

uC/OS-II的任务的创建

      uC/OS-II是通过任务控制块来管理任务的,因此创建任务的工作实质上是给任务的代码分配一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务。当然还要使刚创建的任务进入就绪状态,并接着引发一次任务调度

      uC/OS-II有两个用来创建任务的函数OSTaskCreate()OSTaskCreateExt()其中函数OSTaskCreateExt()OSTaskCreate ()的扩展,并提供一些附加功能。用户可根据需要使用这两个函数之一来完成任务的创建工作。

      OSTaskCreate ()函数主要完成3项工作:任务堆栈的初始化,任务控制块的初始化和任务调度。任务代码的指针并不是存放在任务控制块中的,而是存放在任务堆栈里面。

      一般来说,任务可在调用函数OSStart()启动任务调度之前来创建,也可在任务中来创建。但是,uC/OS-II有一个规定:在调用启动任务函数OSStart()之前,必须已经创建了最少一个任务。因此,习惯上在调用函数OSStart()之前先创建一个任务,并赋予它最高的优先级别,从而使它成为其实任务;然后在这个起始任务中,再创建其他各任务。

      需要注意的是,uC/OS-II不允许在中断服务程序中创建任务。

 

任务的挂起和恢复

      uC/OS-II中,用户任务可通过调用系统函数提供的函数OSTaskSuspend()来挂起自身或者空闲任务以外的其他任务。用函数OSTaskSuspend()挂起任务,只能在其他任务中通过调用恢复函数OSTaskResume()使其恢复为就绪状态。

      INT8U OSTaskSuspend(INT8U prio);

      INT8U OSTaskResume (INT8U prio);

 

任务优先级别的修改

      INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)

 

任务的删除

      所谓删除一个任务,就是把该任务置于睡眠状态。具体做法是:把当初分配给被删除任务的任务控制块从任务控制块链表中删除,并归还给空任务控制块链表,然后在就绪任务表中把该任务的就绪状态置0于是该任务就不能再被调度器调度了

#if OS_TASK_DEL_EN

INT8U OSTaskDel (INT8U prio);

有时任务会占用一些动态分配的内存或信号量之类的资源。这时,如果有其他任务把这个任务删除了,那么被删除任务所占用的一些资源就会因为没有被释放而丢失,这是任何系统都无法接受的。因此,在删除一个占用资源的任务时一定要谨慎。具体的办法是:提出删除任务请求的任务只负责提出删除任务请求,而删除工作则由被删除任务自己来完成。这样,被删除任务就可以根据自身的具体情况来决定何时删除自身,从而使其拥有机会在删除自身之前把占用的资源释放掉。

      显然,如果想使提出删除任务请求的任务和被删除任务之间,能够像上述方式来执行删除工作,则它们双方必须有某种通信方法。uC/OS-II在所有任务控制块中都设置了一个成员OSTCBDelReq来作为这个联络信号。当任务A要删除任务B时,任务A就把任务B的任务控制块中的OSTCBDelReq的值设为OS_TASK_DEL_REQ,这样,当任务B发现自己的任务控制块中成员OSTCBDelReq的值为OS_TASK_DEL_REQ时,它就会在合适的时候删除自身了。

      为了完成上述任务,uC/OS-II提供了一个双方都能调用的函数——请求删除任务函数

#if OS_TASK_DEL_EN

INT8U OSTaskDelReq (INT8U prio)

 

查询任务信息

      有时,在应用程序运行时需要了解一个任务的指针,堆栈等信息,这时就可以通过调用OSTaskQuery()来获取选定的任务的信息。

INT8U OSTaskQuery (INT8U prio, OS_TCB *pdata)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值