- 1、本文档共42页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
表格下面只有就绪
篇一:对任务就绪表的操作(将就绪任务状态填入就绪表)
对任务就绪表的操作(将就绪任务状态填入就绪表)
当每个就绪的任务都放入就绪表中时,就绪表就有有两个变量:OSRdyGrp、OSRdyTbl[]来表示每个任务的优先级。
上图为任务优先表的结构
例如: OSRdyGrp,就意味着OSRdyTbl[0],OSRdyTbl[2], OSRdyTbl[5]任务组中有任务就绪。
根据任务的优先级别查找任务在就绪表的位置
例:已知某一个已经就绪的任务优先级别为prio=30,试判断应该在就绪表的哪一位置上置1。
分析:由于优先级别是一个单字节的数字,而且最大值不会超过63,即二进因此,可以把优先级别看成是一个6位的二进制数,这样就可以用高3位(D5、D4、D3)来指明变量OSRdyGrp的具体数据位,并用来确定就绪表数组元素的下标;用低3位(D2、D1、D0)来指明该数组元素的具体数据位。
答:30的二进制形式其低6位为011110,于是可知应该在OSRdyTbl[3]的D6位上置1,同时要把变量OSRdyGrp的D3位置1。
对任务就绪表的操作——登记,注销
对于一个优先级为prio的任务,任务就绪表的登记操作可由如下代码实现:
OSRdyGrp| = OSMapTbl[prio3];
OSRdyTbl[prio3] | = OSMapTbl[prio amp; 0x07];
其中,OSMapTbl[]是uC/OS-II为加快运算速度定义的一个数组,各元素为:
OSMapTbl[0] = 0000 0001B
OSMapTbl[1] = 0000 0010B OSMapTbl[2] = 0000 0100B
OSMapTbl[3] = 0000 1000B
OSMapTbl[4] = 0001 0000B
OSMapTbl[5] = 0010 0000B
OSMapTbl[6] = 0100 0000B
OSMapTbl[7] = 1000 0000B
同样,如果要使一个优先级为prio的任务脱离就绪态,则可使用如下代码:
If((OSRdyTbl[prio3] amp;= ?OSMapTbl[prio amp; 0x07])==0)
OSRdyGrp amp;= ?OSMapTbl[prio3];
此段代码所执行的操作为将任务就绪表OSRdyTbl[prio3]相应元素的相应位清零,且当OSRdyTbl[prio3]中的所有位都为零时,即全组任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。
例:欲使优先级为12的任务进入和脱离就绪态,设置就绪表。
答:由题意得,任务优先级为12,。
进入就绪态:
OSRdyGrp|=OSMapTbl[prio3];(OSMapTbl[1] = 0000 0010)
OSRdyTbl[1]|=OSMapTbl[prio amp;0x07];(OSMapTbl[4] = 0001 0000)
脱离就绪态:
?OSMapTbl[prio amp; 0x07] = ?OSMapTbl[4] = ?OSMapTbl[prio3] = ?OSMapTbl[1] = If((OSRdyTbl[prio3] amp;= ?OSMapTbl[prio amp; 0x07]) == 0) (该行所有任务都是非就绪态)OSRdyGrp = OSRdyGrp amp; ?OSMapTbl[prio3] = 0
篇二:关于ucos就绪表
为了保证系统的实时性,在就绪表这一块,内核设计者设计了一种算法,这个算法在y
一定的时间里完成查找就绪表中最高优先级的任务(遍历就绪表来查找最高优先级的做法是不能保证实时性要求的)。关于就绪表,这里涉及到四个数据结构,分别是:OSRdyGrp、OSRdyTbl[]、OSMapTbl[]和 OSUnMapTbl[]。前两者是全局变量(INT8U),OSRdyTbl[]数组的大小取决于OS_LOWEST_PRIO。后面两个数组是静态成员,其值见下面的表格和代码:
INT8U const OSUnMapTbl[] = {
0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x00 to 0x0F 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x10 to 0x1F 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0,
文档评论(0)