摘要:2.3.2數(shù)據(jù)存儲數(shù)據(jù)存儲前先要找到優(yōu)先級較高的空記錄,其流程為先找到含空記錄的頁號,然后在該頁中查找空記錄號,最后根據(jù)頁號和空記錄號計算出當前可用于存儲且優(yōu)先級較高的存儲空間的序號。詳細程序如下:High3=OSUnMapTbl[OSRdyPageGrp];//高3位Low3=OSUnMapTbl[OSRdyPageTbl][High3]];//低3位PrioPage=(High3《3)+Low3;//
2.3.2 數(shù)據(jù)存儲
數(shù)據(jù)存儲前先要找到優(yōu)先級較高的空記錄,其流程為先找到含空記錄的頁號,然后在該頁中查找空記錄號,最后根據(jù)頁號和空記錄號計算出當前可用于存儲且優(yōu)先級較高的存儲空間的序號。詳細程序如下:
High3=OSUnMapTbl[OSRdyPageGrp];//高3位
Low3=OSUnMapTbl[OSRdyPageTbl][High3]];//低3位
PrioPage=(High3《3)+Low3;//先找到含空記錄的頁號
High3=OSUnMapTbl[OSRdyGrp[PrioPage]];
Low3=OSUnMapTbl[OSRdyTbl[PrioPage][High3]];
prio=(High3《3)+Low3;//獲得頁中的空記錄號
RecordNo=PrioPage*64+prio;//獲得空記錄在整個存儲空間中的序號
根據(jù)以上程序得到序號后,就可以將數(shù)據(jù)存儲到相應存儲空間了,存儲完成后需將該序號的存儲空間設置為“滿”狀態(tài),具體流程為:先將該頁中的記錄號置為“滿”狀態(tài)(即清零相應位),然后判斷本頁中是否所有記錄均為“滿”,若是則置該頁的狀態(tài)為“滿”.詳細程序如下:
PrioPage=RecordNo / 64;//頁號
prio=RecordNo % 64;//記錄號
if ((OSRdyTbl[PrioPage][prio》3] &=~OSMapTbl[prio & 0x07])==0)
OSRdyGrp[PrioPage] &=~OSMapTbl[prio》3]; //置頁中的記錄號為“滿”狀態(tài)
if(OSRdyGrp[PrioPage]==0){//若該頁中的所有記錄均為“滿”則置該頁為“滿”狀態(tài)
if ((OSRdyPageTbl[PrioPage》3] &=~OSMapTbl[PrioPage & 0x07])==0)
OSRdyPage &= ~OSMapTbl[PrioPage》3];
}
2.3.3 數(shù)據(jù)刪除
數(shù)據(jù)刪除即將存儲序號RecordNo對應的頁號和記錄號的存儲狀態(tài)設置為“空”(則該記錄可用于后續(xù)的存儲),具體流程為:先設置頁號為“空”(因為只要該頁中任意一個記錄為“空”,則頁的狀態(tài)即為“空”),然后設置記錄號的狀態(tài)為“空”,詳細程序如下:
PrioPage=RecordNo / 64;//頁號
prio=RecordNo % 64;//記錄號
OSRdyPage |=OSMapTbl[PrioPage》3];
OSRdyPageTbl[PrioPage》3] |=OSMapTbl[PrioPage & 0x07];//設置該頁的存儲狀態(tài)為“空”
OSRdyGrp[PrioPage] |=OSMapTbl[prio》3];
OSRdyTbl[PrioPage][prio》3] |=OSMapTbl[prio & 0x07];)//設置頁中的記錄為“空”狀態(tài)
按以上方法將相應序號的存儲空間設置為空狀態(tài),則在后續(xù)操作中該存儲空間可用于存儲。
結語
本文利用μC/OS嵌入式操作系統(tǒng)的任務調度算法并加以改進,巧妙地實現(xiàn)了簡易的嵌入式數(shù)據(jù)管理,與傳統(tǒng)方法比較,該方法具備不出現(xiàn)存儲空間碎片、數(shù)據(jù)管理操作效率高等優(yōu)點,可廣泛應用于低端嵌入式應用中的數(shù)據(jù)管理。該方法已在筆者所開發(fā)的SF6電氣設備分解產物檢測儀及智能抄表終端中應用,運行穩(wěn)定可靠。
[1] [2] [3] [4]