找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4416|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

uCOS II就緒表(Ready List)分析

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:71922 發(fā)表于 2015-1-10 22:25 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 liuyuxi 于 2015-1-10 22:27 編輯

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

  程序清單3.5中的代碼用于將任務(wù)放入就緒表。Prio是任務(wù)的優(yōu)先級(jí)。

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



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

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

  程序清單 L3.6 從就緒表中刪除一個(gè)任務(wù)

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

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

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

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

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表