μC/OS-II软件定时器管理算法分析及改进
ev指针构成双向链表。
(2)定时器轮的第 0项,表示将至少需要经过 8个时钟滴答才到期的定时器,并通过
OSTmrNext和 OSTmrPrev指针将这些定时器构成双向链表。 针对上面的同一个例子,按照此规划形成的新的定时器轮如图 2所示:
3.2 改进的处理算法
对定时器的超时处理仍然在"uC/OS-II Tmr"任务中进行,该任务还是通过信号量OSTmrSemSignal来激活,因此,对于基于该接口调用的应用程序可以不做任何修改即可正常运行。基于新规划的定时器轮,对定时器的处理算法如下:
static void OSTmr_Task (void *p_arg)
{
STmrTime = 0;
for(;;)
{
等待OSTmrSemSignal 信号量并获得OSTmrWheelTbl 的访问权;
STmrTime = OSTmrTime+1;
if (OSTmrTime < 8)
{
for OSTmrWheelTbl[OSTmrTime]定时器轮中的每一个定时器ptmr,do
{
执行ptmr 软件定时器中的回调函数;
对于单次定时器,从定时器轮中删除该定时器;
对于周期性定时器,则重置该定时器的OSTmrMatch 值;
}
}
else // STmrTime == 8
{
for OSTmrWheelTbl[0]定时器轮中的每一个定时器ptmr,do
{
ptmr->OSTmrMatch = ptmr->OSTmrMatch – 8;//已经经过了8 个时钟滴答;
if (ptmr->OSTmrMatch == 0) //到期定时值正好是8 的倍数
{
执行ptmr 软件定时器中的回调函数;
对于单次时钟,从定时器轮中删除该定时器;
对于周期性时钟重置该定时器的OSTmrMatch 值;
continue;
}
if (ptmr->OSTmrMatch < 8) //少于8 个ticks 将到期的定时器
{
根据ptmr->OSTmrMatch 的值将ptmr 插入到相应的OSTmrWheelTbl
定时器轮中;
}
}
STmrTime = 0; //重新计数滴答;
}
释放对OSTmrWheelTbl 的访问权;
}
}
3.3改进的处理算法的效率分析
通过对改进以后的算法进行分析可以发现:在每一个时钟滴答,如果对应的定时器轮的OSTmrFirst指针不为NULL,则在该时钟滴答有到期的定时器,需要调用对应的回调函数。通过对定时器轮进行重新规划,避免了不必要的定时器到期检查,从而可节省 CPU时间,提高了运行效率。
4、结束语
针对本文提出的改进算法,本文在基于 ARM7核的 LPC2210为 MCU的开发板 [3][4]上对改进以后的处理算法进行了测试,测试中建立了 1000个软件定时器,在其他负载相同的情况下,通过μC/OS-II的统计任务对 CPU的使用率进行了统计分析,统计发现 CPU的负载率降低了约9%。
本文创新点:对μC/OS-II的定时器轮进行了重新规划,使得在每个时钟滴答对软件定时器进行处理时有效提高了到期定时器的命中率,进而降低了 CPU的负载率。
- μC/OSII中软件定时器的优缺点与改进(03-21)
- μC/OS-II下通用驱动框架的设计与实现(07-23)
- 基于μC/OS-II嵌入式系统的低功耗开发(07-08)
- 基于S3C44B0X+μcLinux的嵌入式以太网设计(07-08)
- 蓄电池化成控制系统中显示功能的实现(11-05)
- 嵌入式实时操作系统μC/OS-II 在P89V51RD2中的移植(04-09)