uCos中优先级分析

OSOSRdyTbl[0]的bit7-bit0对应于优先级7-0, 
OSOSRdyTbl[1]的bit7-bit0对应于优先级15-8, 
OSOSRdyTbl[2]的bit7-bit0对应于优先级23-16, 
OSOSRdyTbl[3]的bit7-bit0对应于优先级31-24, 
OSOSRdyTbl[4]的bit7-bit0对应于优先级39-32, 
OSOSRdyTbl[5]的bit7-bit0对应于优先级47-40, 
OSOSRdyTbl[6]的bit7-bit0对应于优先级55-48, 
OSOSRdyTbl[7]的bit7-bit0对应于优先级63-56 
OSRdyGrp确定了优先级的次低三位(bit5-bit3),OSOSRdyTbl确定了优先级的低三位(bit2-bit0), 
OSRdyGrp = 0x011;  //0b00010001 
OSRdyTbl[0] = 0x0a; //0b00001010 
OSRdyTbl[4] = 0x01; //0b00000001 
计算出存在的几个优先级为;0*8+1=1,0*8+3=3,4*8+0=32 
假设OSRdyGrp最低位为1的是X位,OSRdyTbl[X]最低为1的是Y位, 

则优先级=X*8+Y 

比如 OSRdyGrp =0x18(11000), 那么它的X就是 3 (表示最低位为1的是倒数 第三位)

假设OSRdyTbl[3] = 1;那么最低为为1的就是0 所以优先级就是 =3*8 +0 

因此只要知道了上述的X,Y就可算出最高优先级 
OSUnMapTbl就是将0x00-0xff每个数据中最低位为1的位数一一列举出来 
INT8U  const  OSUnMapTbl[256] = { 
    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F                             */ 
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x10 to 0x1F                             */ 
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x20 to 0x2F                             */ 
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x30 to 0x3F                             */ 
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x40 to 0x4F                             */ 
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x50 to 0x5F                             */ 
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x60 to 0x6F                             */ 
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x70 to 0x7F                             */ 
    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x80 to 0x8F                             */ 
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x90 to 0x9F                             */ 
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xA0 to 0xAF                             */ 
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xB0 to 0xBF                             */ 
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xC0 to 0xCF                             */ 
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xD0 to 0xDF                             */ 
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xE0 to 0xEF                             */ 
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0        /* 0xF0 to 0xFF                             */ 

}; 

比如1(11111101)最低的1在0位上,那么在表中就显示0.

比如8(00001000)最低的1在3位上,那么在表中就显示3.

可以看出,上表中主要是求0~255(0x00~0xFF)之间数的最低位为1的所在的位数,
X = OSUnMapTbl[OSRdyGrp]; 

X就是取OSRdyGrp 值代表的最低位为1所在的位数 比如 OSRdyGrp=0X18 (24)那么 X就是 3 

Y = OSUnMapTbl[OSRdyTbl[X]];

假设 OSRdyTbl[X] =1;那么最低位为1的就是0

最高优先级为X*8+Y  所以优先级就是 =3*8 +0 

参考自http://blog.youkuaiyun.com/zhouzhanglong/article/details/4153613

建立任务时处理:

        ptcb->OSTCBY             = (INT8U)(prio >> 3);          /* Pre-compute X, Y, BitX and BitY     */
        ptcb->OSTCBX             = (INT8U)(prio & 0x07);
        ptcb->OSTCBBitY          = (INT8U)(1 << ptcb->OSTCBY);
        ptcb->OSTCBBitX          = (INT8U)(1 << ptcb->OSTCBX);

。。。。。

 OSRdyGrp               |= ptcb->OSTCBBitY;         /* Make task ready to run                   */
        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
与的操作表示加入优先级 比如 Y= 0X01 |0X02=0x03 就表示 0位和1位有任务优先级

把任务优先级加入队列中。UCOS把任务优先级分了几组 X坐标为 OSRdyGrp ,Y坐标为OSRdyTbl[ptcb->OSTCBY] 


任务切换时寻找最高优先级:

y             = OSUnMapTbl[OSRdyGrp];
    OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);

就像本文开头所示 寻找最高优先级任务 进行切换

任务等待,挂起时:

    OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
    if (OSRdyTbl[y] == 0x00) {
        OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
    }

这几行语句的意思是把对应位置置位零,取消掉优先级,从等待队列中消失。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值