SmartTimer的开发思路的开发思路
今天来讲一讲我开发SmartTimer的思路。
在上一篇介绍SmartTimer的文章《SmartTImer——一个基于STM32的时钟管理器》中,我提到了要实现延迟XX毫秒执行XX
函数的功能,比较好的方式是在定时器中断中设置溢出标志,而在程序主循环中检测这个标志,如果标志置位则运行回调函
数。这样不仅可以实现异步的操作,最大化利用MCU的计算资源,而且可以最小化定时器的中断时间。只不过每设置一个定
时器事件,就需要为这个事件设定全局标志位,并且为其单独计数、检测标志位。如果处理不好,将会使全局标志散落在程序
的各个角落,不仅使程序结构臃肿,而且会留下bug隐患。
基于以上原因,我明确了SmartTimer的开发目的,就是统一管理各个定时器事件,将定时计数、判断定时溢出,执行回调函
数都封装起来。使用者在SmartTimer外部不必关心具体的内部实现,只需要用一行语句即可完成异步延迟的操作,不必进行
额外的操作。除了简便外另一个好处是,即便定时器部分出现了程序上的bug,也使得问题更加集中,便于定位bug而进行修
改。
在对外功能上,提供runlater,runloop,delay这三个功能。
SmartTimer的初步构想
明确了开发目的,就开始构建SmartTImer了。我考虑的SmartTimer架构其实很简单,总体上分为三大块,如下图所示:
简要说明一下这个系统框图:
用户调用runlater、runloop、delay后,会从内存池中拿出一个event对象并初始化,push进event链表中; 定时器中断函数每
隔Xms执行一次,遍历整个event链表,给每个event事件定时+1,并判断定时时间是否到达。如果到达则将该事件的溢出计数
+1;如果定时循环次数不为0,则重新计数,否则将该事件对象从event链表中转移到recycle数组中。 在主while循环中,查询
mark table,如某事件的溢出计数大于0则执行对应的回调函数,并将溢出计数-1;查询recycle数组,如果有需要回收的event
事件,则释放资源到内存池中。
架构出来后,本着先完成再优化的原则,稍微考虑下优化方针,就可以动手实现了。由于SmartTimer没有抢占机制,所以属
于非实时性工具。但理论上来说,如果以上描述的3大块程序都执行的非常快,那么就可以理解为接近“实时”了。所以为了提
高实时性,需要提高程序的执行速度。在代码优化上,我主要采用了空间换时间的方法,牺牲了一部分内存来换取执行速度。
主要用在event pool上,以及用数组映射来设置溢出标志和执行回调函数等地方。
SmartTimer的初步实现
首先抽象出定时器事件的定义:
struct stim_event{
uint16_t interval; //定时事件的定时间隔
uint16_t now; //定时事件的当前计数
uint16_t looptimes; //loop次数
uint8_t addIndex; //事件对象在内存池中的序号
uint8_t stat; //定时事件的当前状态
struct stim_event *next;
struct stim_event *prev;
};
从结构体定义上可以看出,我准备用双向链表来组织这些定时器事件。用链表而不是数组来构建事件list,是因为定时器事件
的加入和移除是动态的,且有时会从list中间增减事件,所以用链表比数组更加合理。
在SmartTimer初始化时,会预先创建一个stim_event的数组作为event pool来使用。另外还会创建两个元素数量与event pool
相同的数组,一个是MarkArray,用来存储event的溢出计数;一个是CallbackArray,用来存储回调函数的函数指针。event、
溢出计数、回调函数用stim_event中的addIndex联系起来。
event->addIndex为该event在event pool数组中的序号(数组下标),相应的MarkArray和CallbackArray数组中,序号为event-
>addIndex的元素,存储着该event的溢出计数和回调函数指针。当某个event计时时间到,那么MarkList中第event->addIndex
个元素溢出计数+1,将CallbackArray数组中第event->addIndex个元素存储的函数指针调用一次。
定时器中断函数,主要是遍历event链表,进行定时计数并判断是否定时溢出。
void stim_tick (void)
{
struct stim_event *tmp;
if (event_list.count == 0)
return;
tmp = event_list.head;
while(tmp != NULL){ //遍历event链表
评论0
最新资源