ucos II 任務就緒表學習筆記

2021-06-02 10:23:04 字數 1767 閱讀 8456

就緒表中有兩個變數:osrdygrp和 osrdytbl.

這兩個變數的對應關係是

osrdytbl[ n ] 中任何一位是1時, osrdygrp  的第n 位 是1。相當於osrdygrp  是osrdytbl的索引。

具體的對應關係如下圖

陣列osrdytbl[8] 按位來算的話正好是64個位---64個優先順序。接下來我們再分析一下任務優先順序變數: prio。由上圖可知優先順序變數的低三位 :在osrdytbl[os_lowest_prio/8+1] 中「位」的位置; 次高三位: 在osrdygrp 中 「位」的位置。

數值m 換算成「位」的位置(osmaptbl的值)

m位表示

0000 0001

0000 0010

0000 0100

0000 1000

0001 0000

0010 0000

0100 0000

1000 0000

由上可知

1.使進入就緒態的方法:

prio的次高三位可以確定osrdygrp

osrdygrp |=  osmaptbl[prio>>3];

低三位可以確定osrdytbl

osrdytbl[[prio>>3]  |= osmaptbl[prio&0x07];

2. 使脫離就緒態的方法:

if((osrdytbl[prio>>3] &=~osmaptbl[prio&0x07]) = = 0)

osrdygrp  &= ~osmaptbl[prio>>3];

由就緒表找出優先順序最高的任務:上面的反運算,須查表

y = osunmaptbl[osrdygrp ];

x = osunmaptbl[ osrdytbl[y] ];

prio = y<<3+x;

ok,那我們看看這個osunmaptbl 表是如何建立起來的

假設 osrdygrp=0x68 , 即二進位制: 01101000

根據低位優先順序高,可知osrdygrp 中bit3 優先順序最高。在osrdytbl[3] 中查詢,如果osrdytbl[3]=0xe4 ,即二進位制 1110 0100 ,可知 bit2 優先順序最高。 於是乎prio = 3<<3+2=26

當osrdygrp= =0b***x ***1 時,最高優先順序在osrdytbl[0]中 ,即osunmaptbl[osrdygrp] = 0

同理當osrdygrp= =0b***x xx10 時,最高優先順序在osrdytbl[1]中 ,即osunmaptbl[osrdygrp] = 1  , 以此類推

ok,接下來我們畫乙個**來總結一下

osrdygrp

osunmaptbl[osrdygrp]

個數0b ***x ***1

2^70b ***x xx10

2^60b ***x x100

2^50b ***x 1000

2^40b ***1 0000

2^30b xx10 0000

2^20b x100 0000

2^10b 1000 0000

2^0個數總和為255個 ,另外加上無法計算的osunmaptbl [0 ]  ,一共256個。

//下面是生成osunmaptbl[256]的**  

#include

voidmain(void)

;for(i=0;i<8;i++)

for(t=1;(t<

uC OS II任務就緒表

ii任務就緒表 rel noopener noreferrer uc os ii任務就緒表 simplorer 先來了解一下uc os ii的任務狀態。uc os ii的任務共分為五種狀態 dormant 休眠 waiting 等待 running 執行 ready 就緒 以及isp 中斷 dorm...

ucosii 學習 2 任務就緒表

任務就緒表 任務就緒表的任務就是高效的找出當前優先順序最高的就緒任務.由任務就緒表osrdytbl和任務就緒組osrdygrb組成,osrdytbl每乙個位都記錄著乙個任務的就緒狀態,0非就緒1就緒,osrdygrb是為了快速的找出當前的最高就緒任務而設定的,把就緒表中的八個任務狀態分為一組,當這個...

uC OS II就緒任務的管理

uc os ii就緒任務的管理 uc os ii總是在已就緒的任務中選擇乙個任務來執行。為了了解系統中的任務哪些是就緒任務,uc os ii在系統初始化時間裡了乙個供就緒任務登記的表,整個表就叫做就緒任務表。uc os ii的就緒任務表實質上是乙個型別為int8u的陣列osrdytbl 其中的每一位...