关于ucos就绪表

关于ucos就绪表

ID:39636766

大小:74.50 KB

页数:4页

时间:2019-07-07

关于ucos就绪表_第1页
关于ucos就绪表_第2页
关于ucos就绪表_第3页
关于ucos就绪表_第4页
资源描述:

《关于ucos就绪表》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、为了保证系统的实时性,在就绪表这一块,内核设计者设计了一种算法,这个算法在y一定的时间里完成查找就绪表中最高优先级的任务(遍历就绪表来查找最高优先级的做法是不能保证实时性要求的)。关于就绪表,这里涉及到四个数据结构,分别是:OSRdyGrp、OSRdyTbl[]、OSMapTbl[]和OSUnMapTbl[]。前两者是全局变量(INT8U),OSRdyTbl[]数组的大小取决于OS_LOWEST_PRIO。后面两个数组是静态成员,其值见下面的表格和代码:OSMapTbl[]的下标OSMapTbl[

2、](即位掩码)000000001100000010200000100300001000400010000500100000601000000710000000INT8UconstOSUnMapTbl[]={0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0x00to0x0F4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0x10to0x1F5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0x20to0x2F4,0,1,0,2,0,1,0,

3、3,0,1,0,2,0,1,0,/*0x30to0x3F6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0x40to0x4F4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0x50to0x5F5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0x60to0x6F4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0x70to0x7F7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0x80to0x8F4,0

4、,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0x90to0x9F5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0xA0to0xAF4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0xB0to0xBF6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0xC0to0xCF4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0xD0to0xDF5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*

5、0xE0to0xEF4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0/*0xF0to0xFF};先把就绪表的结构图贴出来看看:至于这个就绪表是怎么构成的,为什么是8x8表格,这里就不浪费宝贵的网络资源了,任何一本书上都说得我比清楚。这里主要是说明一下OSMapTbl[]和OSUnMapTbl[]这两个数组的值是怎么得来的,以及对进入、脱离就绪态代码和找出最高优先级任务代码的理解。一、OSMapTbl[]数组。这个数组出现的目的是为了更方便的置位。说白点,使用OSMapTbl[inde

6、x]的作用是更方便的把某个数值的第index位置1。比如:使任务进入就绪态的代码是:OSRdyGrp

7、=OSMapTbl[prio>>3];(1)OSRdyTbl[prio>>3]

8、=OSMapTbl[prio&0x07];(2)先取prio(任务优先级)的“高三位”(这里的高三位是指不考虑prio的最高两位,剩下的六位中的高三位),“高三位”是OSRdyGrp的索引,就是说:“高三位”的值(0到7)指定OSRdyGrp(8位)中某一位置位,比如,“高三位”是111,即7,这样就把OSRdyGrp

9、的第7位置1。再看代码(1),先通过prio>>3确定OSRdyGrp的哪一位应该置1(比如第7位),然后通过OSMapTbl[]表把这一位置1,其他位为0(比如OSMapTbl[7]=10000000),再通过位或操作就可以把OSRdyGrp的相应位(第7位)置1了。代码(2)是同样的道理。这里就说明了OSMapTbl[]数组的用处了。同样的在OSRdyTbl中,将OSRdyTbl[prio>>3]组中,通过prio&0x07来确定在组中的位置。比如,一个任务优先级(prio)为26,转换为二进

10、制就是00011010,,与0x07相与之后的值为2,再通过OSMapTbl就可以找到该优先级在就绪表中的位置。使任务脱离就绪态要对某些位进行清0操作,这里也要用到OSMapTbl[]数组,原理是一样的。代码如下:1if((OSRdyTbl[prio>>3]&=~OSMapTbl[prio&0x07])==0)1OSRdyGrp&=~OSMapTbl[prio>>3];第一行先对OSRdyTbl[]中某数据的某一位清0,然后进行判断,如果OSRdyTbl[]中这个数据为0(也主相当

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。