久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4398|回復: 0
打印 上一主題 下一主題
收起左側

uCOS II就緒表(Ready List)分析

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 liuyuxi 于 2015-1-10 22:27 編輯

就緒表(Ready List)
  每個任務被賦予不同的優先級等級,從0級到最低優先級OS_LOWEST_PR1O,包括0和OS_LOWEST_PR1O在內(見文件OS_CFG.H)。當uCOS II初始化的時候,最低優先級OS_LOWEST_PR1O總是被賦給空閑任務idle task。注意,最多任務數目OS_MAX_TASKS和最低優先級數是沒有關系的。用戶應用程序可以只有10個任務,而仍然可以有32個優先級的級別(如果用戶將最低優先級數設為31的話)。
  每個任務的就緒態標志都放入就緒表中的,就緒表中有兩個變量OSRedyGrp和OSRdyTbl[]。在OSRdyGrp中,任務按優先級分組,8個任務為一組。OSRdyGrp中的每一位表示8組任務中每一組中是否有進入就緒態的任務。任務進入就緒態時,就緒表OSRdyTbl[]中的相應元素的相應位也置位。就緒表OSRdyTbl[]數組的大小取決于OS_LOWEST_PR1O(見文件OS_CFG.H)。當用戶的應用程序中任務數目比較少時,減少OS_LOWEST_PR1O的值可以降低uCOS II對RAM(數據空間)的需求量。
  為確定下次該哪個優先級的任務運行了,內核調度器總是將OS_LOWEST_PR1O在就緒表中相應字節的相應位置1。  OSRdyGrp和OSRdyTbl[]之間的關系見圖3.3,是按以下規則給出的:
  當OSRdyTbl[0]中的任何一位是1時,OSRdyGrp的第0位置1,
  當OSRdyTbl[1]中的任何一位是1時,OSRdyGrp的第1位置1,
  當OSRdyTbl[2]中的任何一位是1時,OSRdyGrp的第2位置1,
  當OSRdyTbl[3]中的任何一位是1時,OSRdyGrp的第3位置1,
  當OSRdyTbl[4]中的任何一位是1時,OSRdyGrp的第4位置1,
  當OSRdyTbl[5]中的任何一位是1時,OSRdyGrp的第5位置1,
  當OSRdyTbl[6]中的任何一位是1時,OSRdyGrp的第6位置1,
  當OSRdyTbl[7]中的任何一位是1時,OSRdyGrp的第7位置1,

  程序清單3.5中的代碼用于將任務放入就緒表。Prio是任務的優先級。

  程序清單 L3.5 使任務進入就緒態 (這兩行代碼簡直是神來之筆。。。。
  代碼
  • /*
  • 這行代碼功能是找到列, 把列上的值置為1
  • 不妨假設prio的值為13, 即優先級為13. prio>>3 右移3位后值為1, 可以查表T3.1找出 OSMapTbl[1] 的值為 0000 0010. 再用 0000 0010 和 OSRdyGrp 進行異或運算
  • */
  • OSRdyGrp |= OSMapTbl[prio >> 3];
  • /*
  • */
  • OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];



  讀者可以看出,任務優先級的低三位用于確定任務在總就緒表OSRdyTbl[]中的所在位。接下去的三位用于確定是在OSRdyTbl[]數組的第幾個元素。OSMapTbl[]是在ROM中的(見文件OS_CORE.C)屏蔽字,用于限制OSRdyTbl[]數組的元素下標在0到7之間,見表3.1
  表 T3.1 OSMapTbl[]的值 Index Bit Mask (Binary)
IndexBit Mask (Binary)
000000001
100000010
200000100
300001000
400010000
500100000
601000000
710000000
          
                        圖3.3 uCOS II就緒表

  如果一個任務被刪除了,則用程序清單3.6中的代碼做求反處理。

  程序清單 L3.6 從就緒表中刪除一個任務

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

  以上代碼將就緒任務表數組OSRdyTbl[]中相應元素的相應位清零,而對于OSRdyGrp,只有當被刪除任務所在任務組中全組任務一個都沒有進入就緒態時,才將相應位清零。也就是說OSRdyTbl[prio>>3]所有的位都是零時,OSRdyGrp的相應位才清零。為了找到那個進入就緒態的優先級最高的任務,并不需要從OSRdyTbl[0]開始掃描整個就緒任務表,只需要查另外一張表,即優先級判定表OSUnMapTbl([256])(見文件OS_CORE.C)。OSRdyTbl[]中每個字節的8位代表這一組的8個任務哪些進入就緒態了,低位的優先級高于高位。利用這個字節為下標來查OSUnMapTbl這張表,返回的字節就是該組任務中就緒態任務中優先級最高的那個任務所在的位置。這個返回值在0到7之間。確定進入就緒態的優先級最高的任務是用以下代碼完成的,如程序清單L3.7所示。
  程序清單 L3.7 找出進入就緒態的優先級最高的任務

 代碼
  • y     = OSUnMapTbl[OSRdyGrp];
  • x     = OSUnMapTbl[OSRdyTbl[y]];
  • prio = (y << 3) + x;

  例如,如果OSRdyGrp的值為二進制01101000,查OSUnMapTbl[OSRdyGrp]得到的值是3,它相應于OSRdyGrp中的第3位bit3,這里假設最右邊的一位是第0位bit0。類似地,如果OSRdyTbl[3]的值是二進制11100100,則OSUnMapTbl[OSRdyTbc[3]]的值是2,即第2位。于是任務的優先級Prio就等于26(3*8+2)。利用這個優先級的值。查任務控制塊優先級表OSTCBPrioTbl[],得到指向相應任務的任務控制塊OS_TCB的工作就完成了。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美激情一区二区 | 91国内精品久久 | 自拍偷拍小视频 | 91麻豆精品国产91久久久久久 | 精品视频免费在线 | 看av网址| 91免费在线看 | 精品一二三区在线观看 | 国产99久久| 亚洲一区二区久久久 | 福利av在线 | 视频在线观看一区二区 | 夜夜撸av | 美女一级a毛片免费观看97 | 天久久| 久草新在线 | 久久国产精品一区 | 国产一区 | 久久高清国产视频 | 国产精品无码久久久久 | 婷婷综合在线 | 一区二区三区欧美在线 | 九九热精品在线视频 | 午夜精品久久久久久久久久久久久 | 亚洲高清电影 | 夜夜草视频 | 亚洲国产一区在线 | 懂色av色香蕉一区二区蜜桃 | 成人黄页在线观看 | 超碰电影 | 天天操夜夜操 | 一二区视频 | 日韩在线视频播放 | 亚洲黄色片免费观看 | 日韩在线中文字幕 | 亚洲深夜福利 | 亚洲一区二区三区在线免费 | 亚洲在线视频 | 亚洲综合视频 | 福利国产 | 99精品久久久国产一区二区三 |