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