网站大量收购闲置独家精品文档,联系QQ:2885784924

uCOS-II的移植及使用.ppt

  1. 1、本文档共150页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * 当CPU启动运行一个任务时,CPU的各个寄存器总是需要预置一些初始数据,例如指向任务的指针、程序状态字PSW等。 那么,系统启动任务时,CPU从何处可以获得这些数据呢?最方便的方法就是让CPU从这个任务的任务堆栈里获得这些数据。为此,应用程序在创建一个新任务时,就必须把在系统启动这个任务时CPU各寄存器所需要的初始数据(任务指针、任务堆栈指针、程序状态字)事先存放在任务的堆栈中。这样当任务获得CPU的使用权时,就能把堆栈中的初始数据复制到CPU的各个寄存器里,从而可使任务顺利地启动并运行。 参数opt:specifies options that can be used to alter the behavior of OSTaskStkInit() (参见uCOS_II.H中的OS_TASK_OPT_???)。 #define OS_TASK_OPT_STK_CHK 0x0001 /* Enable stack checking for the task */ #define OS_TASK_OPT_STK_CLR 0x0002 /* Clear the stack when the task is create */ #define OS_TASK_OPT_SAVE_FP 0x0004 /* Save the contents of any floating-point registers */ * 为了能使系统清楚地知道系统中哪些任务已经就绪,那些还没有就绪,UC/OS-II在RAM中设立了一个记录表,系统中的每个任务都在这个表占据一个位置,并用这个位置的状态(1或者0)来表示任务是否处于就绪状态。这个表就叫做任务就绪表。 * 由于每个任务的就绪状态只占据一位,因此OSRdyTbl[]数组的一个元素可表达8个任务的就绪状态。也就是说,每一个数组元素描述了8个任务的就绪状态,于是这8个任务就可以看成一个任务组。为了便于就绪表的查找,UC/OS-II又定义了一个数据类型为INT8U的变量OSRdyGrp,并使该变量的每一个位都对应OSRdyTbl[]的一个任务组(即数组的一个元素)。如果某任务组中有任务就绪,则在变量OSRdyGrp里把该任务组所对应的位置1,否则置0。 例如:如果OSRdyGrp那么就意味着OSRdyTbl[0]、 OSRdyTbl[2] OSRdyTbl[5]、 OSRdyTbl[6]、 OSRdyTbl[7]任务组中有任务就绪。 * * 脱离就绪态:将任务就绪表OSRdyTbl[prio3]相应元素的相应位清零,而且当OSRdyTbl[prio3]中的所有位都为零时,即全组任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。 * * UC/OS-II经常使用类似于就绪表的形式来记录任务的某种状态,因此一定要熟悉这种表的结构以及对这种表的基本操作。 * * 由于操作系统是通过任务的任务控制块TCB来管理任务的,因此调度器真正实施任务切换之前的主要工作是要获得待运行任务的任务控制块指针和当前任务的任务控制块指针。 因为被中止任务的任务控制块指针存放在全局变量OSTCBCur中,所以调度器这部分的工作主要是获得待运行任务的任务控制块指针。 UC/OS-II允许应用程序通过调用函数OSSchedLock()和OSSchedUnlock()给调度器上锁和解锁。为了记录调度器被锁和解锁的情况,UC/OS-II定义了一个变量OSLockNesting,调度器每上锁一次,变量OSLockNesting就加1,反之调度器每被解锁一次,变量OSLockNesting就减1。因此可以通过访问变量OSLockNesting了解调度器上锁和解锁的嵌套次数。 调度器OSSched()在确认未被上锁并且不是中断服务程序调用调度器的情况下,首先从任务就绪表中查得的最高优先级别就绪任务的优先级别OSPrioHighRdy;然后在确认这个就绪任务不是当前正在运行的任务的条件下,用OSPrioHighRdy作为下标取访问数组OSTCBPrioTbl[],把数组元素OSTCBPrioTbl[OSPrioHighRdy]的值赋给指针变量OSTCBHighRdy,于是下面就可以依据OSTCBHighRdy和OSTCBCur这两个分别指向待运行任务控制块和当前任务控制块的指针在宏OS_TASK_SW()中实施任务切换了。 * 其实任务切换的工作是靠OSCtxSw()来完成的。 如果把任务被中止运行时的位置叫做断点,把当时存放在CPU的PC、PSW和通用寄存器等各寄存器中的数据叫做断点数据,那么当任务恢复运行时,必须在断点处以断点数据作为初始数据接着运行,才能实现“无缝”的接续运行。因

文档评论(0)

此项为空 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档