太原网站排名公司,未来做哪个网站能致富,做外贸用什么搜索网站,北京大学学术学风建设网站0 前言
在RTOS中#xff0c;我们经常用到软件定时器来为我们处理一些对于实时性要求不高的定时任务。在裸机开发中#xff0c;我们可能也有很多需要定时执行的任务#xff0c;为了优雅地执行这些定时任务#xff0c;本文设计一个在裸机下使用的简单软件定时器#xff0c;…0 前言
在RTOS中我们经常用到软件定时器来为我们处理一些对于实时性要求不高的定时任务。在裸机开发中我们可能也有很多需要定时执行的任务为了优雅地执行这些定时任务本文设计一个在裸机下使用的简单软件定时器提供类RTOS软件定时器的功能。
1 软件定时器框架分析
根据软件定时器所承担的职责我们需要保证软件定时器尽可能准确同时要保证系统的响应较快。因此我们需要为软件定时器提供一个时钟滴答用来计时同时还需要在恰当的地方执行回调函数保证系统的响应速度。
1.1 时钟滴答
从软件定时器这个名称可以看出软件定时器的一大关键组成要素就是定时那么时钟滴答谁来提供呢在RTOS中我们通常使用系统滴答作为时钟滴答对于裸机我们同样可以使用系统时钟作为时钟滴答或者使用定时器中断也可以。总而言之时钟滴答应该尽可能精确否则软件定时器定时不准也毫无实用意义。本文我们使用的是1ms的定时器中断。
1.2 回调实现
时钟滴答是在中断内获取的那么回调函数又在哪里执行呢为了保证系统的实时性中断应该快进快出因此RTOS都是在线程内进行回调处理的对于裸机来说我们的回调函数应当在主循环内进行来保证系统的实时性。
2 软件定时器数据结构
typedef void (*funp)(void);
typedef struct timer
{struct timer *next; /* 下一个定时器 */struct timer *prev; /* 上一个定时器 */uint8_t runType; /* 执行方式0-周期执行 1-只执行一次 */uint8_t runFlg; /* 回调执行0-不执行 1-执行 */uint8_t delFlg; /* 删除标志 0-不删除 1-删除 */uint32_t cycle; /* 执行周期 */uint32_t tickCount; /* 计时值 */funp fun; /* 回调函数 */
} timert;说明 1使用双向链表实现对定时器的管理 2软件定时器执行方式包括单次执行和周期性执行 3回调执行标志用来告知主循环内的回调处理函数执行定时任务 4如果软件定时器是单次执行的则在执行之后将删除标志置1从链表内删除该定时器 5执行周期记录软件定时器的执行周期 6回调函数就是软件定时器所对应的函数
3 总结
1软件定时器需要提供时钟滴答和任务回调机制。 2时钟滴答应该由系统滴答或定时器中断提供保证计时准确。 3为了保证系统的响应任务回调应当在主循环内执行。 4使用双向链表管理定时器提高对软件定时器的管理效率。