一种嵌入式时钟管理器的设计与实现
2.3.2 delta列表法
delta列表法仅维护有效定时器的链表,且链表中的定时器结点按定时剩余时间由小到大排列,使距timeout点最近的定时器作为链表的首结点。链表中定时器结点的顺序由其独特的结点插入算法决定:如有5个定时器,其定时长度分别为10、14、21、32和39,当其组成delta列表时,定时值最小的结点为首结点,其定时存储值为10,而后依序排列,其定时存储值分别为4、7、11、7,即后一个定时器的定时存储值由自己的实际定时值与相邻的前一个定时器的实际定时值相减而得。可见,除首结点外的所有定时器的计数操作在其插入delta列表时就已完成。因而当定时器守护例程确定timeout的定时器时,只需对首结点进行减1或删除的操作,而不需遍历整个列表,从而使delta列表的操作与定时器数量无关。这使delta列表法在大量定时器管理中大显其能。
该法在系统中实现的数据结构为一静态双向链表:
struct wdNode {
BOOL flag;
UINT16 ticks;
VOIDFUNCPTR rout;
UINT8 prior;
UINT8 next;
} idata wdList[_MAX_WDOG_NUM_];
UINT8 headIdx; //索引首结点
有了delta列表法的思路及其实现的数据结构,在静态数组法具体实现的基础上,便可得此法的具体实现。
应用中如果目标系统ROM较小,且系统中启用的定时器少,则用静态数组法;若目标系统ROM较大,且系统中用到的定时器较多,则用delta列表法。
3 应用
针对前述的嵌入式系统中的定时需求,利用定时器管理系统给出其实现代码。
假定"特定操作"为void specFunc(void),"特定时间段"长度为10分钟。
(1)在经历特定的时间段后,执行特定操作。
#include ″clk.h″
#include ″wdLib.h″
void main(void ) {
WDOG_ID wdId;
constructClk();constructWDOG();
wdId=wdCreate();
wdStart(wdId,10*ONE_MINUTE,specFunc);
while(1);
}
(2)以给定周期周期性地执行特定操作。
基于前者,只需在void specFunc(void)函数体的最后加入下述代码即可:
wdStart(wdId,10*ONE_MINUTE,specFunc);
注:该给定周期为10分钟。
由于本时钟管理器只需一个硬件定时器的支持,所以其具有广泛的适用性。使用时,只需进行简单的配置,即可为裸露的目标系统加以简单的软件抽象层。其友好的用户接口有效降低了嵌入式系统的开发难度,提高了目标系统的可靠性。笔者已在实际项目中多次使用了该时钟管理器。基于该时钟管理器的目标系统运行稳定、可靠,从而充分说明该时钟管理器设计的实用性和科学性。
- 基于ADC0809和51单片机的多路数据采集系统设计方案(10-29)
- 基于C8051F340驱动与采集的CCD光电遥测垂线仪(02-01)
- ARM仿真器与嵌入式系统设计讲解(02-12)
- 基于单片机C8051F060的智能功率柜的设计应用(01-12)
- 基于单片机的存储设备转储器(05-03)
- 基于8位机嵌入式TCP通信速度研究方案(06-03)