2008-11-6
任务管理
任务建立
用户可以通过传递任务地址和其它参数到以下两个函数之一来建立任务:OSTaskCreate()
或 OSTaskCreateExt()。
注意事项
任务可以在多任务调度开始前建立,也可以在其它任务的执行过程中被建立。在开始多任务调度(即调用OSStart())前,用户必须建立至少一个任务。任务不能由中断服务程序(ISR)来建立。
任务堆栈大小确定
任务所需的堆栈的容量是由应用程序指定的。用户在指定堆栈大小的时候必须考虑用户的任务所调用的所有函数的嵌套情况,任务所调用的所有函数会分配的局部变量的数目,以及所有可能的中断服务例程嵌套的堆栈需求。另外,用户的堆栈必须能储存所有的CPU寄存器。
堆栈增长方向
堆栈从上往下递减:
OS_STK_GROWTH == 1
堆栈从下往上递增:
OS_STK_GROWTH == 0
任务控制块中部分成员:
.OSTCBStkBottom是指向任务栈底的指针。如果微处理器的栈指针是递减的,即栈存储器从高地址向低地址方向分配,则OSTCBStkBottom指向任务使用的栈空间的最低地址。类似地,如果微处理器的栈是从低地址向高地址递增型的,则OSTCBStkBottom指向任务可以使用的栈空间的最高地址。函数OSTaskStkChk()要用到变量OSTCBStkBottom,在运行中检验栈空间的使用情况。用户可以用它来确定任务实际需要的栈空间。这个功能只有当用户在任务建立时允许使用OSTaskCreateExt()函数时才能实现。这就要求用户将OS_TASK_CREATE_EXT_EN设为1,以便允许该功能。
.OSTCBX, .OSTCBY, .OSTCBBitX和 .OSTCBBitY用于加速任务进入就绪态的过程或进入等待事件发生状态的过程(避免在运行中去计算这些值)。这些值是在任务建立时算好的,或者是在改变任务优先级时算出的。这些值的算法见程序清单L3.4。
程序清单
L 3.4
任务控制块OS_TCB中几个成员的算法
|
OSTCBY
|
= priority >> 3;//组
|
OSTCBBitY
|
= OSMapTbl[priority >> 3];//组掩码
|
OSTCBX
|
= priority & 0x07;//位
|
OSTCBBitX
|
= OSMapTbl[priority & 0x07];//位掩码
|
任务的优先级表是用“组位码”表示的。优先级的值的高3位表示组,低3位表示位。
任务删除操作:OSTaskDel
确保用户所要删除的任务并非是空闲任务,因为删除空闲任务是不允许的。可以删除statistic任务。
确保用户不是在ISR例程中去试图删除一个任务,因为这也是不被允许的。
OSTaskDel()分两步完成该移除任务以减少中断响应时间:首先,如果任务处于就绪表中,它会直接被移除[L4.11(6)]。如果任务处于邮箱、消息队列或信号量的等待表中,它就从自己所处的表中被移除[L4.11(7)]。接着,OSTaskDel()将任务的时钟延迟数清零,以确保自己重新允许中断的时候,ISR例程不会使该任务就绪[L4.11(8)]。最后,OSTaskDel()置任务的.OSTCBStat标志为OS_STAT_RDY。注意,OSTaskDel()并不是试图使任务处于就绪状态,而是阻止其它任务或ISR例程让该任务重新开始执行(即避免其它任务或ISR调用OSTaskResume()[L4.11(9)])。接下来,OSTaskDel()重新允许中断以减少中断的响应时间[L4.11(11)]。这样,OSTaskDel()就能处理中断服务了,但由于它增加了OSLockNesting,ISR执行完后会返回到被中断任务,从而继续任务的删除工作。现在,OSTaskDel()可以继续执行删除任务的操作了。在OSTaskDel()重新关中断后,它通过锁定嵌套计数器(OSLockNesting)减一以重新允许任务调度[L4.11(13)]。接着,OSTaskDel()调用用户自定义的OSTaskDelHook()函数[L4.11(14)],用户可以在这里删除或释放自定义的TCB附加数据域。然后,OSTaskDel()减少µCOS-Ⅱ的任务计数器。OSTaskDel()简单地将指向被删除的任务的OS_TCB的指针指向NULL[L4.11(15)],从而达到将OS_TCB从优先级表中移除的目的。再接着,OSTaskDel()将被删除的任务的OS_TCB从OS_TCB双向链表中移除[L4.11(16)]。注意,没有必要检验ptcb->OSTCBNext==0的情况,因为OSTaskDel()不能删除空闲任务,而空闲任务就处于链表的末端(ptcb->OSTCBNext==0)。接下来,OS_TCB返回到空闲OS_TCB表中,并允许其它任务的建立[L4.11(17)]。最后,调用任务调度程序来查看在OSTaskDel()重新允许中断的时候[L4.11(11)],中断服务子程序是否曾使更高优先级的任务处于就绪状态[L4.11(18)]。
分享到:
相关推荐
读书笔记 -复盘——把经验转化为能力.pdf
uC/OS-II学习笔记—空闲链表和就绪链表
学生读书笔记共享-学生读书笔记共享系统-学生读书笔记共享系统源码-学生读书笔记共享管理系统-学生读书笔记共享管理系统java代码-学生读书笔记共享系统设计与实现-基于springboot的学生读书笔记共享系统-基于Web的...
适合初学者spring-boot——web笔记
学生读书笔记共享-学生读书笔记共享系统-学生读书笔记共享系统源码-学生读书笔记共享管理系统-学生读书笔记共享管理系统java代码-学生读书笔记共享系统设计与实现-基于springboot的学生读书笔记共享系统-基于Web的...
uC/OS-II内核分析、移植与驱动程序开发 uCOS学习笔记
该笔记并非源代码的详细讲解,亦非μC/OS-II的使用说明,而是汇总了阅读源码过程中产生的疑问及解答,进而从中归纳总结出μC/OS-II系统的内在机理,对于想从本质和源头探索操作系统的程序猿或许有点参考帮助,或许...
信息系统项目管理师考试必过笔记---第十章-项目时间进度管理.docx信息系统项目管理师考试必过笔记---第十章-项目时间进度管理.docx信息系统项目管理师考试必过笔记---第十章-项目时间进度管理.docx信息系统项目管理...
信息系统项目管理师考试必过笔记---第十章-项目时间进度管理.pdf信息系统项目管理师考试必过笔记---第十章-项目时间进度管理.pdf信息系统项目管理师考试必过笔记---第十章-项目时间进度管理.pdf信息系统项目管理师...
uC/OS-II学习笔记和讲稿,对uC/OS-II实时多任务操作系统感兴趣的网友有用。
本文将指导读者一步步完成 LwIP 在 ADS1.2 开发环境下的移植工作,包括底层驱动的编写。本文使用的 硬件平台是 AT91SAM7X256 + RTL...我们使用 uC/OS-II 作为底层操作系统,而 LwIP 的移植亦将主要围绕 uC/OS-II 展开
这是对Effective-Robotics-Programming-with-ROS这本书的中文学习笔记
uC/OS-II 平台下的LwIP移植笔记――作者:焦海波 很好的一份资料!对LWIP的移植在很大的帮助!!
不要做提线木偶——《心理学与生活》读书笔记与感悟-读书笔记.docx
zookeeper云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-云的学习笔记管理系统java代码-云的学习笔记系统设计与实现-基于ssm的云的学习笔记系统-基于Web的云的学习笔记系统设计与实现-...