uc/os-ii中最高优先级计算(如何查表)
- 為什么要引入優先級表?
? ? Answer:uc/os-ii是個講究實時性的操作系統,在有多個任務時,系統需要選擇這些任務中優先級最高的任務進行調度。如果單靠計算,有的優先級計算費時少,有的很多,實時性得不到保證。如果引入表,我們只要知道表的橫縱坐標就可以直接找到需要的任務,實時性可以得到保證。因此,引入優先級表。
- 優先級表(OSUnMapTbl)和就緒表(OSRdyTbl)、就緒組(OSRdyGrp)的關系?如何計算優先級?
? ? Answer:實際上是位圖和表格的結合。
????從代碼上看,如下所示:
i = OSUnMapTbl[OSRdyGrp] ;// 找到行號 j = OSUnMapTbl[OSRdyTbl[i]];//找到列號 TaskPrior = 8*i+j=(i<<3)+ j;//找到最高優先級號。? ? 具體解釋為:
1.在OSUnMapTbl表中找到第OSRdyGrp位對應的數字,該數字賦值給i,代表優先級所在的行號;
2.在OSUnMapTbl表中找到第OSRdyTbl[i] 位對應的數字,該數字賦值給j,代表優先級所在的列號;
3.看就緒表中i行j列對應的數值。該數值為當前任務中最高的優先級。
????就緒表如下所示:
這個表是我們將OSRdyGrp和OSRdyTbl二者結合構成的。如下圖:
合成之后就是我們看到的二維的一個表。但是該表實際上并不是以二維形式存在的。
因此,我們在知道橫縱坐標之后,不能直接查表,而是進行一個簡單的計算,即上述代碼語句第三句。將i左移三位,實際上就是i*8(OSRdyTbl是8位,即一行有8位),然后加上在該行的偏移量,也就是j。這樣就可以算出來優先級是多少了。這里需要提醒一下:OSRdyTbl坐標是從右往左遞增的順序,不要搞錯了。
具體的操作我們舉個例子來說明一下:
先把相關的圖展示出來:
假設OSRdyGrp=98(d)=01100010(b); ?
????第一步就是在第二個圖所示的表(OSUnMapTbl)中查找第98位的數字,作為橫坐標。注意一下:98是十進制的,十六進制為0x62。我們鎖定注釋為:/*0x60 to 0x6F*/這一行,從左邊開始數(第一個數字數作0),2對應的表中的數字就是1u。所以i=1,即橫坐標是1。
? ? 第二步:得到OSRdyTbl[i]對應的值并計算縱坐標。i值第一步計算出來了,所以OSRdyTbl[i]=OSRdyTbl[1]。假設此時OSRdyTbl[1]=01100000(b)=96(d)。我們需要做的就是在OSUnMapTbl表中查找第96位的數字,查找方式和第一步一樣??梢钥吹綌抵禐?u。所以j=5,即縱坐標是5。
? ? 第三步:計算最高優先級任務對應的優先級。i*8+j=13。所以最高優先級任務對應的優先級為13。
我們檢驗一下,在第一個圖中拼湊的的二維表中,1行5列的數值就是13。說明我們計算正確。
可能有人還有疑問:在計算機內我們給的值是什么?難道不直接是優先級?
Answer:我們給定的是兩個值:OSRdyGrp和OSRdyTbl值,根據這兩個值找對應的優先級。
又問:為什么不直接給優先級然后進行比較找到最高優先級任務?
Answer:我們前面提到過,uc/os-ii要保證實時性才引入了表格。在一堆任務中找最高優先級任務,如果直接給每個任務的優先級,我們就需要兩兩比較,或者將其排序,時間得不到保證。試想一下,如果只有三個任務,找最高優先級任務很容易。但如果是30個,300個呢?顯然,用表格查找更符合我們的要求。
還問:那我們怎么從給的兩個值知道所有任務的優先級或者說怎樣從這兩個值看出來有幾個任務,各自優先級又是多少?
Answer:回到上面的例子:OSRdyGrp=0110 0010,OSRdyTbl=0110 0000。OSRdyGrp的第1,5,6位為1,那么就緒組就有3個。OSRdyTbl的第5,6位為1,那么就緒表有2個任務??偣彩?*2=6個任務。優先級分別是(數值從低到高):13,14,45,46,53,54。
這里附加介紹一下簡單的找優先級的方法:
我們知道優先級越高,數值越低。所以我們只需要保證取到?OSRdyGrp和OSRdyTbl 的最低置1位就可以。還是上面的例子。98=0110 0010,最低置1位是第一位,所以橫坐標就是1。96=0110 0000,最低置1位是第5位,所以縱坐標是5。這樣就可以計算得到最高優先級任務對應的優先級是多少了。
以上解釋均為個人想法,不當之處還望指出。
????總結
以上是生活随笔為你收集整理的uc/os-ii中最高优先级计算(如何查表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: os_mem.c(全)
- 下一篇: 纹理贴图相关知识