第六节-嵌入式操作系统.pptVIP

  • 2
  • 0
  • 约1.56万字
  • 约 85页
  • 2021-03-20 发布于广东
  • 举报
2021/3/14 * μC/OS_II进行任务调度的依据就是任务就绪表 2021/3/14 * 任务就绪表就是一个二维数组OSRdyTbl[ ] 2021/3/14 * 为加快访问任务就绪表的 速度,系统定义了一个变 量OSRdyGrp来表明就绪表 每行中是否存在就绪任务。 2021/3/14 * OSRdyTbl[ ] 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 OSRdyGrp D7 D6 D5 D4 D3 D2 D1 D0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 任务就绪表的示意图 0 1 2 3 4 5 6 7 x y 0 1 2 3 4 5 6 7 2021/3/14 * OSRdyGrp D7 D6 D5 D4 D3 D2 D1 D0 1 1 1 1 0 0 0 0 prio=29 D7 D6 D5 D4 D3 D2 D1 D0 1 D7 D6 D5 D4 D3 D2 D1 D0 1 OSRdyTbl[3 ] 把prio为29的任务置为就绪状态 Y X OSRdyGrp | =OSMapTbl[prio3]; OSRdyTbl[prio3] | = OSMapTbl[prio0x07]; 2021/3/14 * 在程序中,可以用类似下面的代码把优先级别为prio的任务置为就绪状态: OSRdyGrp | =OSMapTbl[prio3]; OSRdyTbl[prio3] | = OSMapTbl[prio0x07]; 如果要使一个优先级别为prio的任务脱离就绪状态则可使用如下类似代码: ? if((OSRdyTbl[prio3]=~OSMapTbl[prio0x07])==0) OSRdyGrp=~OSMapTbl[prio3]; 2021/3/14 * OSRdyGrp D7 D6 D5 D4 D3 D2 D1 D0 1 1 1 1 0 0 0 0 prio=29 D7 D6 D5 D4 D3 D2 D1 D0 1 D7 D6 D5 D4 D3 D2 D1 D0 1 OSRdyTbl[y ] x = OSUnMapTal[OSRdyTbl[y]]; 1 1 0 0 0 0 0 0 0 0 0 0 0 0 y = OSUnMapTal[OSRdyGrp]; 图5-6 在就绪表中查找最高优先级别任务的过程 从任务就绪表中获取优先级别最高的就绪任务可用如下类似的代码: ? y = OSUnMapTal[OSRdyGrp]; //D5、D4、D3位 x = OSUnMapTal[OSRdyTbl[y]]; //D2、D1、D0位 prio = (y3)+x; //优先级别 ? 或 ? y = OSUnMapTbl[OSRdyGrp]; prio = (INT8U)((y 3) + OSUnMapTbl[OSRdyTbl[y]]); 2021/3/14 * 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,

文档评论(0)

1亿VIP精品文档

相关文档