基于μC/OS任务调度算法的嵌入式数据管理
删除。传统的做法是对数据存储空间按地址顺序编号,数据存储与删除均根据编号操作,每个编号的存储空间还提供了标志位,用于判断该空间是否已被占用。这种方法有一个很大的弊端:多次删除后会出现存储空间碎片,这造成后续操作中查找空闲空间耗时较长,且存储量越大,这个现象越严重,大大降低了数据管理操作的效率。有些程序员为了解决这个弊端对删除操作只提供删除所有记录的功能,不提供单独删除某个记录的功能,但这显然牺牲了产品的易用性。本文利用μC/OS任务调度算法实现嵌入式数据管理,可有效解决以上问题。
2.1 基本思想
利用μC/OS任务调度算法实现嵌入式数据管理的基本思想是:将μC/OS中的"任务优先级"与数据管理的"记录号"对应,将"任务就绪态"与"存储空间空状态"(注意,不是存储空间满状态)对应,将"任务空闲态"与"存储空间满状态"对应,将"使任务进入就绪态"与"数据删除"对应,将"使任务进入空闲态"与"数据存储"对应,将"查找当前处于就绪态的最高优先级任务"与"查找当前空闲存储空间"对应。即在实际应用中,数据存储前先根据μC/OS中的"查找当前处于就绪态的最高优先级任务"的方法查找目前优先级最高的空闲存储空间,获得相应记录号,然后在数据存储后根据μC/OS中的"使任务进入空闲态"的方法使相应记录的存储空间置为"满"状态;数据删除后根据μC/OS中的"使任务进入就绪态"的方法使相应记录的存储空间置为"空"状态。显然,该方法较传统方法有两大优点:查找空闲存储空间的速度远高于传统方法,且查找时间为常数,即查找时间与记录数无关(传统方法的查找时间随记录数递增);不会出现存储空间碎片,因为本方法按优先级存储数据,删除的存储空间的优先级肯定高于未使用的存储空间,则在后续存储操作中会将其优先用于存储,从而也就避免了存储空间碎片的出现。
2.2 算法的改进
μC/OS的最大任务数为64,这意味着直接采用μC/OS任务调度算法实现的数据管理的最大记录数也仅为64个,这显然不适用于多数应用场合,因此需对算法进行改进。本方法引入"页"的概念,即每64个记录为1页,数据存储前先查找包含空记录的页号,然后在该页中查找空记录。查找包含空记录的页号的方法与查找空记录的方法相同(即都根据μC/OS中的"查找当前处于就绪态的最高优先级任务"的方法查找),因此最大记录数为64记录/页×64页=4096个记录。依此类推,可继续扩大存储记录数。为了理解方便,下文代表记录空闲状态和页内记录号的全局变量定义为OSRdyTbl[64][8]、OSRdyGrp[64]和prio,代表页空闲状态和页号的全局变量定义为OSRdyPage、OSRdyPageTbl[8]和PrioPage,代表记录在整个存储空间的序号定义为RecordNo(则RecordNo = PrioPage×64+prio)。
2.3 嵌入式数据管理主要步骤的实现
2.3.1 数据初始化
在嵌入式系统刚运行时,所有记录应为空状态,因此需将代表记录空闲状态和页空闲状态的全局变量OSRdyTbl[]、OSRdyGrp、OSRdyPageTbl[]和OSRdyPage的所有字节均初始化为0xff(因为"1"代表空闲)。
2.3.2 数据存储
数据存储前先要找到优先级最高的空记录,其流程为先找到含空记录的页号,然后在该页中查找空记录号,最后根据页号和空记录号计算出当前可用于存储且优先级最高的存储空间的序号。详细程序如下:
根据以上程序得到序号后,就可以将数据存储到相应存储空间了,存储完成后需将该序号的存储空间设置为"满"状态,具体流程为:先将该页中的记录号置为"满"状态(即清零相应位),然后判断本页中是否所有记录均为"满",若是则置该页的状态为"满"。详细程序如下:
2.3.3 数据删除
数据删除即将存储序号RecordNo对应的页号和记录号的存储状态设置为"空"(则该记录可用于后续的存储),具体流程为:先设置页号为"空"(因为只要该页中任意一个记录为"空",则页的状态即为"空"),然后设置记录号的状态为"空",详细程序如下:
按以上方法将相应序号的存储空间设置为空状态,则在后续操作中该存储空间可用于存储。
3 结语
本文利用μC/OS嵌入式操作系统的任务调度 算法并加以改进,巧妙地实现了简易的嵌入式数据管理,与传统方法比较,该方法具备不出现存储空间碎片、数据管理操作效率高等优点,可广泛应用于低端嵌入式应用中的数据管理。该方法已在笔者所开发的SF6电气设备分解产物检测仪及智能抄表终端中应用,运行稳定可靠。
- μC/OS-II的多任务信息流与CAN总线驱动(07-11)
- 网格协同设计环境中的任务调度机制(08-01)
- 嵌入式系统优先级反转问题的分析 (08-14)
- μC/OS的任务调度实现方法及其在PowerPC上的优化(10-29)
- 硬件实时操作系统的设计与实现(01-28)
- 一种μC/OS-II任务调度硬件指令的实现(03-29)