嵌入式UCOS系統的O 1 排程演算法優化

2021-08-21 17:59:27 字數 1979 閱讀 3530

學習過嵌入式系統的人,應該大都學習過乙個嵌入式作業系統ucos,在這個系統中,有乙個經典的o(1)複雜度的排程演算法。該演算法用於從就緒的任務中找到優先順序最高的就緒任務,然後把執行的權利交給這個執行緒。關於該演算法的細節有興趣的可以去閱讀嵌入式作業系統的相關知識.下面我們把這個問題抽象成乙個簡單的演算法問題來描述。

問題的本質:求乙個8bit的byte形變數的bit位中,從低到高第乙個bit值為1的位置。

簡單的介紹乙個樣例:

乙個 8 bit的 二進位制數表示為:0 1 0 1 0 1 0 0

其第乙個值為1的bit位置為2,計數方式從右往左(從低位到高位),位置從0到7

這就是ucos排程演算法的核心排程本質問題,在ucos的排程演算法中,當其中乙個bit為1的時候,代表其bit代表的優先順序任務在就緒中,當其bit為0的時候,代表該優先順序的任務未就緒。ucos的排程演算法,就是要找到就緒任務中優先順序最高的任務。

在ucos的解決方案中,其採用了一種逆向表的方法,在乙個表中,儲存了從1到255的數對應的每個數的從最低位開始的第乙個出現1的bit的位置。

#這只是簡單的示例**,與源**不同,逆向表未完全寫出。

static unsigned char reverse_list[256]= #第乙個為255是為了標識值為0的輸入無法得到第乙個bit為1的位置,因為0對應的2進製中沒有乙個bit為1

unsigned char getans(unsigned char input)

逆向表的方法會耗費256個byte的記憶體,而且這種方法不能推廣到16bit變數的求解中,因為對16bit的變數採用逆向表的方法求解的話,會浪費極大的記憶體空間。

下面介紹一種優化的求解方法,可以同樣保證o(1)的複雜度同時不會浪費記憶體空間,而且可以推廣到16位,32位等的同類問題求解。

個人的經驗告訴我,任何乙個演算法,如果要高效的求解某些問題,必須充分的利用資訊,如果無法充分的利用資訊,其效率不太可能是最高。

對於該問題而言,求解 0 1 0 1 0 1 0 0 這個數的從低位到高位,第乙個出現1的位置這個問題,逆向表沒有充分的利用數字中的資訊。就以 0 1 0 1 0 1 0 0

這個數而言,其第2位左邊的所有bit的值,其實都不能對求解的結果造成影響,但是在逆向表中卻利用了這些資訊,我們需要想辦法把這些冗餘的資訊去除掉。

無用資訊 → 【0 1 0 1 0】【1 0 0】← 有用資訊
考慮這樣一種運算:

x ⊕ (x - 1)
⊕指異或運算,以 0 1 0 1 0 1 0 0 為例:

0 1 0 1 0 1 0 0

⊕ 0 1 0 1 0 0 1 1

________________

0 0 0 0 0 1 1 1

你應該可以從上面的計算出看出其巧妙之處,x ⊕ (x - 1) 運算將x第一位為1的左邊的位置都變成了0,右邊變成了1,相當於去掉了很多的冗餘資訊,做了一次

簡單的對映,所以對於從1到255的每個數都會將他們轉換成【00000001,00000011,00000111,00001111,00011111,00111111,01111111,11111111】這8個

數中的某乙個。

將這8個數對13取餘(13這個數也是用程式搜尋出來的,這是一種雜湊的方式), 其結果為

【1, 3, 7, 2, 5, 11, 10, 8】
通過對13取餘這種方法,把這8個數雜湊到了 0 到 13 中 8 個互不重疊的位置,這樣就可以用14個byte的逆向表來儲存資訊。

#這只是簡單的示例**,與源**不同。

static unsigned char reverse_list[14]= #255代表該位為無效值,不使用。

unsigned char getans(unsigned char input)

16bit變數,32bit變數,64bit變數的求解方法類似,大家有興趣的可以自行實驗。

嵌入式小型排程系統

以前在開發專案中,看到很多作業系統,都有自己的排程器,寫起 來比裸機方便多了,但別人的作業系統又比較大型,占用資源比較多,而且也比較複雜。所以我自己也就寫了乙個小型的排程器,沒有像操作ucos那樣,進行任務的進出棧。我利用系統的定時器10ms喚醒一次,進行排程工作,如果精度要求不高,可以變成100m...

嵌入式系統總結1

1.1嵌入式系統的應用1.1.1 測試 結構 1 上位機.2 下位機.3 被測控制板 1.1.2普適計算 pervasive computing 1.1.3汽車電子產品 設計方面 1 車況資訊系統.2 車在動態資訊系統.3 車載自動控制系統.1.1.4實時訊號處理系統 例如 雷達訊號處理系統 1.1...

嵌入式作業系統(2) 排程

何時排程 程序狀態變化的時候 目標 評價排程演算法指標 公平性 執行排程程式的情況 排程中搶占的情況 排程演算法有三類 fcfs 先來先服務 first come,first served spn sjf srt 短程序優先 短作業優先 剩餘時間優先 shortest process next sh...