摘要:隨著嵌入式系統的飛速發展,如何在嵌入式系統中實現數據管理也越來越引人關注,常用的方法是采用嵌入式數據庫。但是目前常用的嵌入式數據庫(如SQLite、BerkeleyDB等)均需嵌入式操作系統的支持,且對嵌入式系統的內存、CPU處理速度等有較高要求,只能應用在比較高端的嵌入式系統中[12].在低端的嵌入式系統中,傳統的數據管理方法是
隨著嵌入式系統的飛速發展,如何在嵌入式系統中實現數據管理也越來越引人關注,常用的方法是采用嵌入式數據庫。但是目前常用的嵌入式數據庫(如SQLite、Berkeley DB等)均需嵌入式操作系統的支持,且對嵌入式系統的內存、CPU處理速度等有較高要求,只能應用在比較高端的嵌入式系統中[12].在低端的嵌入式系統中,傳統的數據管理方法是對數據存儲空間按順序編號,數據存儲與刪除均根據編號順序操作。這種方法在多次刪除后會出現很多存儲空間碎片,一方面加大了程序查找空閑存儲空間的難度,數據管理操作時間長(類似微機系統中硬盤長時間不做磁盤碎片整理會造成程序運行變慢的情況),另一方面可能造成存儲空間利用率降低。本文提出了一種利用μC/OS任務調度算法實現的數據管理方法,該方法實現簡單,無需嵌入式操作系統的支持,可應用于低端的嵌入式系統中,而且可以有效克服低端嵌入式應用中傳統數據管理方法的缺陷。
1 μC/OS任務調度算法
μC/OS是一種占先式的多任務嵌入式操作系統,它可以管理多達64個任務[3].μC/OS中,每個任務的優先級不一樣且是,優先級較高的任務一旦準備就緒,則擁有CPU所有權并開始投入運行[3].所以,μC/OS的任務調度算法的基本思想就是,查找當前準備就緒的較高優先級的任務,并進行任務切換。實現上述任務調度算法主要包含兩個步驟:確定目前哪幾個任務處于就緒態,確定目前處于就緒態的任務中哪個優先級較高。為此,μC/OS提供了兩個全局變量OSRdyTbl[]和OSRdyGrp.OSRdyTbl[]數組是任務就緒表,包含 8個字節(共64位),相當于把64個任務分為8組,每組8個任務,這64位數據的0、1狀態分別代表64個任務是否處于就緒態(0代表空閑,1代表就緒);OSRdyGrp為1個字節數據(8位),每一位的0、1狀態分別代表OSRdyTbl[]數組的相應字節是否非零(即該組中是否有任務處于就緒態)。通過這兩個全局變量的賦值就可實現任務就緒態與空閑態的切換,這是μC/OS實現任務調度的基礎[4].
1.1 使任務進入就緒態
假設優先級為12的任務進入就緒狀態,12 = 1100b,則OSRdyTbl[1]的第4位置1,且OSRdyGrp的第1位置1(代表第1組有任務處于就緒態),相應的數學表達式為:
OSRdyGrp|=0x02;
OSRdyTbl[1]|=0x10;
則μC/OS在執行任務調度時,通過OSRdyGrp的值即可判斷出第1組任務中有任務處于就緒態,然后再通過OSRdyTbl[]數組的第1個字節即可判斷出此時優先級為12的任務處于就緒態,則可做任務切換。
從上面的計算可以得到:若OSRdyGrp及OSRdyTbl[]的第n位置1,則應該把OSRdyGrp及OSRdyTbl[]的值與2n相或。為了計算方便,μC/OS中把2n的8個值(n=0~7)先計算好,存在數組OSMapTbl[]中,即:
OSMapTbl[0]=20=0x01(0000 0001)
OSMapTbl[1]=21=0x02(0000 0010)
……
OSMapTbl[7] = 27=0x80(1000 0000)
μC/OS中,優先級數分解為高3位和低3位,高3位代表任務組號,低3位代表任務在所在組中的位置。則任意優先級為prio的任務進入就緒態只需執行以下程序[3]:
OSRdyGrp|=OSMapTbl[prio 》 3];
OSRdyTbl[prio》3]|=OSMapTbl[prio & 0x07];
[1] [2] [3] [4]