在就绪表中登记/删除任务

OSMapTbl[] 各元素值:

OSMapTbl[0]=00000001B
OSMapTbl[1]=00000010B
OSMapTbl[2]=00000100B
OSMapTbl[3]=00001000B
OSMapTbl[4]=00010000B
OSMapTbl[5]=00100000B
OSMapTbl[6]=01000000B
OSMapTbl[7]=10000000B

这个数组出现的目的是为了更方便的置位。说白点,使用OSMapTbl[index]的作用是更方便的把某个数值的第index位置1。

程序清单:使任务进入就绪态
OSRdyGrp |= OSMapTbl[prio>>3];                    (1)
OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07];   (2)
这两行代码就实现了在就绪表中添加给定优先级(prio)任务的作用;
(1):将prio右移3位,去掉X坐标占用的后三位,只取Y坐标,填入OSMapTbl[ ], 返回值与OSRdyGrp做位或,将OSRdyGrp对应位置1,表示该行有任务进入就绪态;例如,假设prio>>3 得到 Y坐标 = 3,则OSMapTbl[ 3 ] = 00001000,与OSRdyGrp做位或,将第四位置1;
(2):将prio与0x07=00000111 做位与,保留低三位,将其他位置0,得到X坐标,将X坐标填入OSMapTbl[ ],返回值与OSRdyTbl[ Y ]做位或,将OSRdyTbl[ Y ]对应位置1,表示该行的第X位有任务进入就绪态,注意第X位要从低端算起,也就是表格的右端开始算起;例如:刚才已经算出Y坐标 = 3,假设prio & 0x07 = X坐标 = 4 ,OSMapTbl[ 4 ] = 00010000 ,将该返回值与OSMapTbl[ 3 ]做位或,将第五位置1,表示该位的任务进入就绪态;


程序清单:删除任务

从任务就绪表中将待注销任务的对应位置0。

 if ( ( OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07] )  == 0)
       OSRdyGrp &= ~OSMapTbl[prio >> 3];

     OSRdyTbl[prio>>3]所有的位都是0时,OSRdyGrp 的相应位才清零(即对应行一个就绪任务都没有时,OSRdyGrp才为0)。所以要进行判断。

     OSRdyTbl[prio >> 3] 里面可能还包含其他位为1,即在RdyTbl[prio >> 3] 中  还有其他就绪任务,这时候所对应的OSRdyGrp 的位还是1,直到RdyTbl[prio >> 3] =0,表示没有任务就绪时才应将相应的OSRdyGrp里面的位置0

      以上第一行代码将就绪任务表数组OSRdyTbl[]中相应元素的相应位清零;同时做一个判断,判断OSRdyTbl[prio>>3]是否已全部为0,若全部为0,则表示改组任务全都不处于就绪状态,此时可把OSRdyGrp置为0。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值