2.3 嵌入式数据管理主要步骤的实现
2.3.1 数据初始化
在嵌入式系统刚运行时,所有记录应为空状态,因此需将代表记录空闲状态和页空闲状态的全局变量OSRdyTbl[]、OSRdyGrp、OSRdyPageTbl[]和OSRdyPage的所有字节均初始化为0xff(因为“1”代表空闲)。
2.3.2 数据存储
数据存储前先要找到优先级最高的空记录,其流程为先找到含空记录的页号,然后在该页中查找空记录号,最后根据页号和空记录号计算出当前可用于存储且优先级最高的存储空间的序号。详细程序如下:
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;//获得空记录在整个存储空间中的序号
根据以上程序得到序号后,就可以将数据存储到相应存储空间了,存储完成后需将该序号的存储空间设置为“满”状态,具体流程为:先将该页中的记录号置为“满”状态(即清零相应位),然后判断本页中是否所有记录均为“满”,若是则置该页的状态为“满”。详细程序如下:
PrioPage=RecordNo / 64;//页号
prio=RecordNo % 64;//记录号
if ((OSRdyTbl[PrioPage][prio》3] &=~OSMapTbl[prio & 0x07])==0)
OSRdyGrp[PrioPage] &=~OSMapTbl[prio》3]; //置页中的记录号为“满”状态
if(OSRdyGrp[PrioPage]==0){//若该页中的所有记录均为“满”则置该页为“满”状态
if ((OSRdyPageTbl[PrioPage》3] &=~OSMapTbl[PrioPage & 0x07])==0)
OSRdyPage &= ~OSMapTbl[PrioPage》3];
}
2.3.3 数据删除
数据删除即将存储序号RecordNo对应的页号和记录号的存储状态设置为“空”(则该记录可用于后续的存储),具体流程为:先设置页号为“空”(因为只要该页中任意一个记录为“空”,则页的状态即为“空”),然后设置记录号的状态为“空”,详细程序如下:
PrioPage=RecordNo / 64;//页号
prio=RecordNo % 64;//记录号
OSRdyPage |=OSMapTbl[PrioPage》3];
OSRdyPageTbl[PrioPage》3] |=OSMapTbl[PrioPage & 0x07];//设置该页的存储状态为“空”
OSRdyGrp[PrioPage] |=OSMapTbl[prio》3];
OSRdyTbl[PrioPage][prio》3] |=OSMapTbl[prio & 0x07];)//设置页中的记录为“空”状态
按以上方法将相应序号的存储空间设置为空状态,则在后续操作中该存储空间可用于存储。
3 结语
本文利用μC/OS嵌入式操作系统的任务调度 算法并加以改进,巧妙地实现了简易的嵌入式数据管理,与传统方法比较,该方法具备不出现存储空间碎片、数据管理操作效率高等优点,可广泛应用于低端嵌入式应用中的数据管理。该方法已在笔者所开发的SF6电气设备分解产物检测仪及智能抄表终端中应用,运行稳定可靠。
本文关键字:嵌入式 嵌入式系统-技术,单片机-工控设备 - 嵌入式系统-技术
上一篇:基于嵌入式技术支持的感应按键设计