- 1、本文档共92页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章 ?C/OS-II在ARM系统中的应用与开发; ; ; ; ; ; ;一个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU完全只属于该程序自己。
任务切换
Context switch在有些书中被翻译成上下文切换,实际含义是任务切换,或CPU寄存器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(context),即CPU寄存器中的全部内容。这些内容保存在任务的当前状况保存区(task’s context storage area),也就是任务自己的栈区之中。入栈工作完成以后,就把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这一过程叫做任务切换。
; ; ; ; ; ; ;2、任务的管理;两个函数OSTaskCreate()和OSTaskCreateExt()原型如下:
INT8U OSTaskCreate(
void (*task)(void *pd); //指向任务的指针
void * pdata; //传递给任务的参数
OS_STK * ptos;//指向任务堆栈栈顶的指针
INT8U prio //任务的优先级
)
;INT8U OSTaskCreateExt
(
void (*task)(void *pd); //指向任务的指针
void * pdata; //传递给任务的参数
OS_STK * ptos; //指向任务堆栈栈顶的指针
INT8U prio //任务的优先级
INT16U id //任务的标识
OS_STK * pbos; //指向任务堆栈栈低的指针
INT32U stk_siaze; //任务堆栈容量
void * pext; //指向附加数据域的指针
INT16U opt //用于设定操作选项
)
在调用任务建立函数后, μC/OS-II内核会首先从TCB()任务控制块)空闲列表内申请一个空的TCB指针;然后根据用户给出的参数初始化任务堆栈,并在内部的任务就绪表中标记该任务为就绪状态;最后返回。;(2)任务堆栈
在μC/OS-II中,每个任务都有自己的堆栈空间。堆栈必须声明为OS_STK类型,并且由连续的内存空间组成。可以静态分配堆栈空间(在编译时分配),也可以动态分配堆栈空间(在运行时分配),这两种声明方式都应放置在函数外面。
任务所需堆栈的容量由应用程序确定。但必须考虑到任务调用的所有函数的嵌套情况、任务调用的所有函数为局部变量分配的所有内存的数目,以及所有可能的中断服务子程序嵌套对堆栈的需求。此外,堆栈必须能够保存CPU所有的寄存器。
μC/OS-II提供了堆栈检验函数OSTaskStkChk(),用来确定任务实际需要的堆栈空间的大小。这样能够避免为任务分配过多的堆栈空间,从而减少应用程序代码所需的RAM数量。调用堆栈检验函数后,所得到的只是一个大致的堆栈使用情况,并不能说明堆栈使用的全部实际情况。为了适应系统以后的升级和扩展,应该多分配10%~100%的堆栈空间。;(3)任务的挂起和恢复;(4)任务的删除
删除一个任务,就是把该任务置于睡眠状态,任务的代码不再被uC/OS-II使用,而并不是说任务的代码被删除了。调用OSTaskDel()后,先进行条件判断,当所有的条件都满足后,就会从所有可能的uC/OS-II的数据结构中去除任务的任务控制块OS_TCB,这样就不会被其他的任务或中断服务子程序置于就绪态,即任务置于休眠状态。
函数原型如下:
INT8U OSTaskDel(INT8U prio)
可删除任务自身或者除了空闲任务之外的其他任务。删除自己参数为: OS_PRIO_SELF
直接调用这样的删除任务,可能出现某些问题,如果任务拥有一些动态的内存或者信号量之类的资源,那么如果它被删除了,它的资源就不会被释放而丢失,会造成同样使用资源的其他任务进入死等待,出现错误情况。要慎重使用。提供了一个可以在请求删除方和被删除方通信完成删除的函数。原型如下:
INT8U OSTaskDelReq(INT8U prio) 返回是否被删除和是否有要删除自己的要求。被删除方调用得知要删除自己,释放资源后,在删除自己。;(5)其他任务管理函数;3、任务间同步与通信的管理;(1)事件控制块
文档评论(0)