设计一个在裸机下使用的简单软件定时器(1):框架+数据结构分析

0 前言

在RTOS中,我们经常用到软件定时器来为我们处理一些对于实时性要求不高的定时任务。在裸机开发中,我们可能也有很多需要定时执行的任务,为了优雅地执行这些定时任务,本文设计一个在裸机下使用的简单软件定时器,提供类RTOS软件定时器的功能。

1 软件定时器框架分析

根据软件定时器所承担的职责,我们需要保证软件定时器尽可能准确,同时要保证系统的响应较快。因此,我们需要为软件定时器提供一个时钟滴答用来计时,同时还需要在恰当的地方执行回调函数保证系统的响应速度。

1.1 时钟滴答

从软件定时器这个名称可以看出,软件定时器的一大关键组成要素就是定时,那么时钟滴答谁来提供呢?在RTOS中,我们通常使用系统滴答作为时钟滴答,对于裸机我们同样可以使用系统时钟作为时钟滴答,或者使用定时器中断也可以。总而言之,时钟滴答应该尽可能精确,否则软件定时器定时不准也毫无实用意义。本文我们使用的是1ms的定时器中断。

1.2 回调实现

时钟滴答是在中断内获取的,那么回调函数又在哪里执行呢?为了保证系统的实时性中断应该快进快出,因此RTOS都是在线程内进行回调处理的,对于裸机来说我们的回调函数应当在主循环内进行,来保证系统的实时性。

2 软件定时器数据结构

c 复制代码
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)使用双向链表管理定时器,提高对软件定时器的管理效率。

相关推荐
piaoyiren9 小时前
STM32 综合温控风扇控制系统
stm32·单片机·嵌入式硬件·oled·lcd1602·hc-05蓝牙
亿道电子Emdoor12 小时前
【Arm】解决Keil MDK无法查看外设寄存器的问题
stm32·单片机·嵌入式硬件
BW.SU13 小时前
瑞佑RUI--工业UI,拖拽即成
stm32·单片机·51单片机·gui·人机界面·单片机可视化设计
十月的皮皮15 小时前
STM32从零到量产开发:四路继电器工业控制模块开发原理小灶 · 合集
stm32·单片机·嵌入式硬件·stm32cubemx·hal库
小羊先生car15 小时前
F429-SysTick(2026/7/22)
stm32·单片机·嵌入式硬件
WWJA王文举15 小时前
单片机参数如何掉电保存:Flash、EEPROM和配置存储完整设计
数据库·stm32·mongodb·c#
华清远见IT开放实验室1 天前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
GeekArch1 天前
第24讲:Vibe模式代码风格控制——适配Keil/STM32工程规范
人工智能·stm32·单片机·嵌入式硬件·mcu·决策树·ai编程
Freedom_my1 天前
STM32项目3
stm32·单片机·嵌入式硬件
十月的皮皮2 天前
STM32从零到量产开发:四路继电器工业控制模块开发实战笔记(小白视角)
c语言·笔记·stm32·stm32cubemx·hal库