<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        UC/OS-II的最高優先級別查找方法分析

        作者:龔平   來源:本站原創   點擊數:  更新時間:2014年03月14日   【字體:
        UC/OS-II是常用的嵌入式實時操作系統,該操作系統最多支持64個任務,由于操作系統是優先級搶占型實時系統,因此對任務最高優先級如何查找是比較重要的。
        在UC/OS-II中采用位圖法的方式表示,也就是每一個bit表示一個任務,因此可以將一個8bits的數組成含有8個元素的數組即可。當任務已經準確就緒以后就會將相應的位設置為1。通常采用OSRdyTbl[i],0=<i<8和OSRdyGrp就能夠定位具體的每一個任務。 OSRdyGrp主要是用來指明八組中那一組中有任務已經準備就緒。而OSRdyTbl[i]的每一個bit都表示一個任務。比如任務的確定方法為 TaskPrior = 8*i+j=(i<<3)+ j。其中i表示組(行),而j表示一組中的具體哪一個位置(列)。由于只需要3個bits表示一個具體的行號,3個bits表示一個具體的列,因此只需要一個8bits數的后六位表示一個任務的值,如任務優先級號52(d)=00110100(b),表示在第6行的第4列,參看US/OS-II的任務調度過程分析。
         
        由于在UC/OS-II中優先級號越小,優先級越高,因此我們在實際的調度過程中需要知道優先級別最高的。本來只有64bits,可以采用簡單的查詢實現,但是我們可以知道對于不同的優先級號,查詢的時間是不相同的,這樣也就是的我們的實時系統有了一定的延時。在UC/OS-II中的實現體現了一定的優越型,對于不同的優先級別都是相同的時間,這樣也就使得實時型進一步提高。他的實現方法主要是依據了查表法。具體的表格設計思路如下。根據上面的分析可以知道,我們只需要分別知道行列就能知道有限級別號。那么找到最優先的行號和最優先的列號也就實現了最高優先級的查找。
         
        實現的思路如下:
            因為OSRdyGrp有8bits,那么可能存在256種情況,通過OSRdyGrp就能知道最優先的行i,同樣OSRdyTbl[i]也是8bits,那么也有8bits,一共存在256種情況,通過他也就能知道最優先的列j。因此我們也可以根據同樣的表實現判斷。
            表的設計過程如下:
            由于OSRdyGrp存在256種情況,我們只需要知道為1的最低bit就知道了最優的行號,比如OSRdyGrp=98(d)=1100010(b),為1的最低bit為bit1,因此我們就可以根據OSRdyGrp知道最高優先級號是在第1組中,即找到行號為1。同樣的方法也可以適用于最優列的查找。
        因此可以設計表為如下:
        1. INT8U const OSUnMapTbl[256] = {
        2.  /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f */
           
        3.     0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x00 to 0x0F */
           
        4.     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x10 to 0x1F */
           
        5.     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x20 to 0x2F */
           
        6.     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x30 to 0x3F */
           
        7.     6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x40 to 0x4F */
           
        8.     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x50 to 0x5F */
           
        9.     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x60 to 0x6F */
           
        10.     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x70 to 0x7F */
           
        11.     7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x80 to 0x8F */
           
        12.     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x90 to 0x9F */
           
        13.     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xA0 to 0xAF */
           
        14.     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xB0 to 0xBF */
           
        15.     6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xC0 to 0xCF */
           
        16.     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xD0 to 0xDF */
           
        17.     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xE0 to 0xEF */
           
        18.     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1,/* 0xF0 to 0xFF */
           
        19. };
        根據上面的表格能找到每一個OSRdyGrp值對應的最高優先級號所在的行,同樣依據上表能找到OSRdyTbl[i]每一個值對應的最高優先級號所在的列。然后依據上面的等式TaskPrior = 8*i+j=(i<<3)+ j,分別確定i,和j。
        即:
        i = OSUnMapTbl[OSRdyGrp] ;// 找到行號
        j = OSUnMapTbl[OSRdyTbl[i]];//找到列號
        TaskPrior = 8*i+j=(i<<3)+ j;//找到最高優先級號。
         
        以上的位圖和查表法的相結合就很好的解決了UC/OS-II的優先級管理問題。
         
        拓展:如果優先級別號越高,表示的有限級越高時,同樣也可以采用這種位圖法和查表相結合的原理。只是表格的內容存在差別而已,那時就應該選擇最高bit為1時對應的bit值。這樣就能很快的找到就緒的最大的優先級別號。
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮