ucosii操作系统中最高优先级就绪任务查找方法详解

版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎联系我qq2488890051 https://blog.csdn.net/kangkanglhb88008/article/details/80694869

内核源码中代码如下:

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;                             // 获得就绪任务的优先级值

猜你喜欢

转载自blog.csdn.net/kangkanglhb88008/article/details/80694869