ucos-II小結—-再論就緒表

來源:互聯網
上載者:User
2009/2/26ucos-II小結----再論就緒表      前面有一篇日誌是轉載網上的關於就緒表的文章,轉載的時候還對就緒表不甚瞭解,今天上午再看了一遍,有所得,先記下。       為了保證系統的即時性,在就緒表這一塊,核心設計者設計了一種演算法,這個演算法在O(1)的時間裡完成尋找就緒表中最高優先順序的任務(遍曆就緒表來尋找最高優先順序的做法是不能保證即時性要求的)。關於就緒表,這裡涉及到四個資料結構,分別是:OSRdyGrp、OSRdyTbl[]、OSMapTbl[]和OSUnMapTbl[]。前兩者是全域變數(INT8U),OSRdyTbl[]數組的大小取決於OS_LOWEST_PRIO。後面兩個數組是靜態成員,其值見下面的表格和代碼:

OSMapTbl[]的下標

OSMapTbl[](即位元遮罩)

0

00000001

1

00000010

2

00000100

3

00001000

4

00010000

5

00100000

6

01000000

7

10000000

  INT8U  const  OSUnMapTbl[] = {
    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F                             
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x10 to 0x1F                             
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x20 to 0x2F                             
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x30 to 0x3F                             
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x40 to 0x4F                           
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x50 to 0x5F                             
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x60 to 0x6F                             
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x70 to 0x7F                             
    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x80 to 0x8F                             
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x90 to 0x9F                             
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xA0 to 0xAF                             
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xB0 to 0xBF                             
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xC0 to 0xCF                             
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xD0 to 0xDF                             
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xE0 to 0xEF                             
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0        /* 0xF0 to 0xFF                             
}; 
 先把就緒表的結構圖貼出來看看:至於這個就緒表是怎麼構成的,為什麼是8x8表格,這裡就不浪費寶貴的網路資源了,任何一本書上都說得我比清楚。      這裡主要是說明一下OSMapTbl[]和OSUnMapTbl[]這兩個數組的值是怎麼得來的,以及對進入、脫離就緒態代碼和找出最高優先順序任務代碼的理解。      一、OSMapTbl[]數組。      這個數組出現的目的是為了更方便的置位。說白點,使用OSMapTbl[index]的作用是更方便的把某個數值的第index位置1。比如:使任務進入就緒態的代碼是:

OSRdyGrp  |= OSMapTbl[prio>>3];                   (1)

OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07];   (2)

先取prio(任務優先順序)的“高三位”(這裡的高三位是指不考慮prio的最高兩位,剩下的六位中的高三位),“高三位”是OSRdyGrp的索引,就是說:“高三位”的值(0到7)指定OSRdyGrp(8位)中某一位置位,比如,“高三位”是111,即7,這樣就把OSRdyGrp的第7位置1。再看代碼(1),先通過prio>>3確定OSRdyGrp的哪一位應該置1(比如第7位),然後通過OSMapTbl[]表把這一位置1,其他位為0(比如OSMapTbl[7]=10000000),再通過位或操作就可以把OSRdyGrp的相應位(第7位)置1了。代碼(2)是同樣的道理。這裡就說明了OSMapTbl[]數組的用處了。

      使任務脫離就緒態要對某些位進行清0操作,這裡也要用到OSMapTbl[]數組,原理是一樣的。代碼如下:

  1. if ((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) == 0)    
  2.     OSRdyGrp &= ~OSMapTbl[prio >> 3];   

第一行先對OSRdyTbl[]中某資料的某一位清0,然後進行判斷,如果OSRdyTbl[]中這個資料為0(也主相當於這個資料的所有8位都已經清0了),再對OSRdyGrp的某位清0。

      二、OSUnMapTbl[]數組

       OSUnMapTbl[]數組主要是用於找出進入就緒態的優先順序最高的任務。而這個地方也是我一開始沒搞明白的,不明白OSUnMapTbl[]中的數值是怎麼來的。

      先脫離所有上下文關係來說說OSUnMapTbl[]的一般意義。這裡用二進位比較方便說明問題。OSUnMapTbl[]共0xFF個元素,0x00~0xFF為索引,而OSUnMapTbl[]裡的值就是通過分析索引得到的。比如說,索引0x50, 二進位表示為0101 0000,然後從右邊數,看第幾位首先為1,則OSUnMapTbl[0x50]的值就為幾。易知,0101 0000從右起,第4位首先為1,所以有OSUnMapTbl[0x50]=4。再比如0x51,二進位為0101 0001,右起第0位為1,所以OSUnMapTbl[0x51]=0。

      那為什麼要從右數起呢?這個和優先順序表有關係,優先順序的值越小,優先順序就越高。再看上面那幅優先順序的結構圖,可見,優先順序是從右至左,從上至下越來越低的,最低優先順序給了空閑任務。

      結合程式碼分析一下:

  1. y    = OSUnMapTbl[OSRdyGrp];    
  2. x    = OSUnMapTbl[OSRdyTbl[y]];    
  3. prio = (y << 3) + x;   

      x、y的含義看上面的圖就知道了:y是“高三位”,x是“低三位”。

      找最高優先順序任務的過程是這樣的:首先,查OSRdyGrp,看OSRdyGrp中右起的第幾位首先為1,比如OSRdyGrp=0x56,0x56的二進位為0101 0110,可見右起第1位首先為1,所以y=OSUnMapTbl[0x56]=1,然後再去OSRdyTbl[y]即OSRdyTbl[1]中尋找(為什麼是OSRdyTbl[y],這個書上說得很明確,這個得清楚得瞭解OSRdyGrp和OSRdyTbl[]之間的關係),這裡假設OSRdyTbl[1]=0xD4,即1101 0100,同樣找到OSRdyTbl[1]中右起的第2位首先為1,這樣得到x=2,再通過第3行的移位元運算就可以得到最高優先順序的任務的優先順序了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.