1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| 要求写就绪表,获取最高优先级怎样让任务进入退出就绪.
6对应二进制为:000110
高3位:000=0通过OSMapTbl映射后:OSMapTbl[prio>>3]=OSMapTbl[0]=00000001
低3位:110=6通过OSMapTbl映射后: OSRdyTbl[prio>>3]=OSRdyTbl[0]=010*******
10对应二进制为:001010
高三位:001=1通过OSMapTbl映射后 OSMapTbl[prio>>3]=OSMapTbl[1]=00000010
低3位: 010=2通过OSMapTbl映射后 OSRdyTbl[prio>>3]=OSRdyTbl[1]=00000100
11对应二进制为:001011
高三位:001=1通过OSMapTbl映射后 OSMapTbl[prio>>3]=OSMapTbl[1]=00000010
低三位:011=3通过OsMapTbl映射后 OSRdyTbl[prio>>3]=OSRdyTbl[1]=00001000
17对应二进制为:010001
高三位:010=2经过OsMapTbl映射后 OsMapTbl[prio>>3]=OsMapTbl[2]=00000100
低三位:001=1经过OsMapTbl映射后 OsRdyTbl[prio>>3]=OsRdyTbl[2]=00000010
***通过就绪任务算法:
OSRdyGrp|=OSMapTbl[prio>>3] //获取就绪表中的行
OsRdyTbl[prio>>3]|=OSMapTbl[prio&0x07]//获取就绪表中的列
最后OSRdyGrp的值就是将所有OsMapTbl[prio>>3]进行位或运算
OSRdyGrp=00000001|00000010|00000010|00000100
=00000111=0x07
OSRdyTbl[0]=01000000
OSRdyTbl[1]=00000100|00001000=00001100 相同的行列要进行或运算
OSRdyTbl[2]=00000010
然后查询优先级判定表OSUnMapTbl[]
OSRdyGrp=0x07
Y=OSUnMapTbl[0x07]=0说明最高优先级在第0组
OSRdyTbl[0]=01000000=0x40
X=OSUnMapTbl[0x40]=6
最高优先级为:prio=y*8+x=6
|