程序清单
L3.5
使任务进入就绪态
(这两行代码简直是神来之笔啊!!!)
|
/*
这行代码功能是找到列
,
把列上的值置为
1
不妨假设
prio
的值为
13,
即优先级为
13. prio>>3
右移
3
位后值为
1,
可以查表
T3.1
找出
OSMapTbl[1]
的值为
0000 0010.
再用
0000 0010
和
OSRdyGrp
进行异或运算
*/
OSRdyGrp |= OSMapTbl[prio >> 3];
|
/*
*/
OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];
|
表
T3.1 OSMapTbl[]
的值
|
|
Index
|
Bit Mask (Binary)
|
0
|
00000001
|
1
|
00000010
|
2
|
00000100
|
3
|
00001000
|
4
|
00010000
|
5
|
00100000
|
6
|
01000000
|
7
|
10000000
|
程序清单
L3.6
从就绪表中删除一个任务
|
if ((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) == 0)
|
OSRdyGrp &= ~OSMapTbl[prio >> 3];
|
程序清单
L3.7
找出进入就绪态的优先级最高的任务
|
y = OSUnMapTbl[OSRdyGrp];
|
x = OSUnMapTbl[OSRdyTbl[y]];
|
prio = (y << 3) + x;
|