男女午夜激情_www.天堂av.com_亚洲综合小说区_亚洲欧美自拍视频_成年精品_久久www免费人成—看片_激情综合五月天_久久高潮视频_最新国产成人ab网站_国产精品卡一

機電之家資源網
單片機首頁|單片機基礎|單片機應用|單片機開發|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發
培訓信息
贊助商
uCOS II就緒表(Ready List)分析
uCOS II就緒表(Ready List)分析
 更新時間:2008-8-18 14:57:57  點擊數:32
【字體: 字體顏色

3.0 就緒表(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. /*   
  2. 這行代碼功能是找到列, 把列上的值置為1  
  3. 不妨假設prio的值為13, 即優先級為13. prio>>3 右移3位后值為1, 可以查表T3.1找出 OSMapTbl[1] 的值為 0000 0010. 再用 0000 0010 和 OSRdyGrp 進行異或運算  
  4. */  
  5. OSRdyGrp |= OSMapTbl[prio >> 3];    
  6. /*  
  7.    
  8. */  
  9. 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)
0 00000001
1 00000010
2 00000100
3 00001000
4 00010000
5 00100000
6 01000000
7 10000000
  
 
圖3.3 uCOS II就緒表
 
    如果一個任務被刪除了,則用程序清單3.6中的代碼做求反處理。
 
程序清單 L3.6 從就緒表中刪除一個任務

代碼
  1. if ((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) == 0)    
  2.     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 找出進入就緒態的優先級最高的任務

代碼
  1. y    = OSUnMapTbl[OSRdyGrp];    
  2. x    = OSUnMapTbl[OSRdyTbl[y]];    
  3. 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的工作就完成了。

<!--自定義字段-->
[1] [2]  下一頁
  • 上一篇: ucos II+ucGUI+s3c2410+LCD+觸摸屏整合
  • 下一篇: 51單片機C語言編程基礎及實例
  • 發表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網友評論:(只顯示最新5條。)
    關于我們 | 聯系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發消息66821730(技術支持)點擊這里給我發消息66821730(廣告投放) 點擊這里給我發消息41031197(編輯) 點擊這里給我發消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業自行提供,該企業負責信息內容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(濱江)機電一體化學會
    中國行業電子商務100強網站

    網站經營許可證:浙B2-20080178-1
    主站蜘蛛池模板: 莫力| 年辖:市辖区| 怀来县| 安陆市| 沧州市| 闻喜县| 奉节县| 晋州市| 邢台市| 赤城县| 宁南县| 许昌市| 蒙城县| 阿巴嘎旗| 江山市| 长春市| 红河县| 霍州市| 亚东县| 井研县| 石柱| 福海县| 大田县| 合川市| 怀来县| 巍山| 甘孜| 丹巴县| 安宁市| 沁阳市| 南城县| 双江| 永川市| 通化县| 崇州市| 达尔| 多伦县| 将乐县| 肇东市| 泗水县| 固镇县|