内核源码中代码如下:
1. 登记
指的是当某个任务处于就绪状态时,系统将该任务登记在任务就绪表中,即在就绪表中将该任务对应的位设置为1
我们知道,ucosii系统最大支持64个任务数,且每个任务的优先级不能相同,所以优先级就是每个任务的ID,在程序中,用下面代码把优先级为prio的任务设置为就绪状态:
OSRdyGrp |= OSMapTbl[ prio >>3 ]; // 同时设置就绪标志组对应的组对应的位为1
OSRdyTbl [ prio >>3 ] |= OSMapTbl [ prio & 0x07 ]; // 把优先级值对应的就绪表中的位置为1
2. 注销
和登记相反,即把prio优先级任务对应的位置0
if( ( OSRdyTbl [ prio >>3 ] &= ~OSMapTbl[ prio &0x07 ] ) == 0 ) // 注:这里的~符号不是减号,是取反,比如1取反为0
OSRdyGrp &= ~OSMapTbl [prio >>3 ]; // 右移n位相当于除以2^n,左移n位相当于乘以2^n,这样比直接使用 / 除法快多了
3. 最高优先级就绪任务的查找
y = OSUnMapTal[ OSRdyGrp ]; // 获得优先级别的D5,D4,D3位,至于这里的OSUnMapTal[ ]为什么能实现这个效果,这就是这里的操作系统最巧妙之处了,自己体会吧
x = OSUnMapTal[ OSRdyTbl [ y ] ]; // 获得优先级别的D2,D2,D0位
prio = ( y<<3 )+x; // 获得就绪任务的优先级值