1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      uCOS II就緒表(Ready List)分析

      更新時間: 2008-01-09 08:48:41來源: 粵嵌教育瀏覽量:798

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

        程序清單 L3.5 使任務進入就緒態(tài) (這兩行代碼簡直是神來之筆啊!!!)
        代碼
      1. /*   
      2. 這行代碼功能是找到列, 把列上的值置為1  
      3. 不妨假設prio的值為13, 即優(yōu)先級為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];    



        讀者可以看出,任務優(yōu)先級的低三位用于確定任務在總就緒表OSRdyTbl[]中的所在位。接下去的三位用于確定是在OSRdyTbl[]數(shù)組的第幾個元素。OSMapTbl[]是在ROM中的(見文件OS_CORE.C)屏蔽字,用于限制OSRdyTbl[]數(shù)組的元素下標在0到7之間,見表3.1
        表 T3.1 OSMapTbl[]的值 Index Bit Mask (Binary)
      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];   

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

       代碼
      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位。于是任務的優(yōu)先級Prio就等于26(3*8+2)。利用這個優(yōu)先級的值。查任務控制塊優(yōu)先級表OSTCBPrioTbl[],得到指向相應任務的任務控制塊OS_TCB的工作就完成了。

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 亚洲欧洲中文字幕 | 亚洲乱码一区二区在线观看 | 中文字幕日本乱码精品久久 | 亚洲中久在线视频 | 亚洲欧美综合少妇 | 狠狠综合久久久久综合网小蛇 |