摘要:1.2使任务进入空闲态μC/OS通过任务就绪表OSRdyTbl[prio》3](prio代表任务优先级)中相应位清零使相应任务进入空闲态,当OSRdyTbl[prio》3]中的所有位都为零时,还需将OSRdyGrp的相应位清零,代表全组任务中没有一个任务进入就绪态。1.3查找当前处于就绪态的较高优先级任务μC/OS采用查表法查找当前处于就绪态的较高优先级任务,
1.2 使任务进入空闲态
μC/OS通过任务就绪表OSRdyTbl[prio》3](prio代表任务优先级)中相应位清零使相应任务进入空闲态,当OSRdyTbl[prio》3]中的所有位都为零时,还需将OSRdyGrp的相应位清零,代表全组任务中没有一个任务进入就绪态。
1.3 查找当前处于就绪态的较高优先级任务
μC/OS采用查表法查找当前处于就绪态的较高优先级任务,它预先定义了数组OSUnMapTbl[]作为查找表,如下:
INT8U const OSUnMapTbl[]={
0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
};
相应的查找程序如下:
High3=OSUnMapTbl[OSRdyGrp];//优先级高3位,即当前处于就绪态的较高优先级的任务的组号
Low3=OSUnMapTbl[OSRdyTbl[High3]];//优先级低3位
prio=(Hign3《3)+Low3;//获得当前处于就绪态的较高优先级的任务
例如:若OSRdyGrp的值为01101000b,则查得OSUnMapTbl[OSRdyGrp]的值是3,它对应于OSRdyGrp中的第3位置1(即当前处于就绪态的较高优先级任务处于第1组任务中);若OSRdyTbl[3]的值是11100100b,则查OSUnMapTbl[OSRdyTbl[3]]的值是2,则进入就绪态的较高任务的优先级prio=3×8+2=26.
从上文的计算可看出μC/OS查找当前较高优先级任务所花的时间为常数,与应用程序中建立的任务数无关,这个特性是本文实现新型嵌入式数据管理的关键。[1] [2] [3] [4]