讲师博文
如何实现嵌入式软件定时/超时机制? 来源 : 华清远见     2024-07-08

定时器的应用十分广泛,从硬件角度我们熟悉的PWM、ADC等常用接口就需要用到定时器。防止系统抱死的看门狗程序也是一种定时器。在系统层面,任务调度、时间片轮转、同步和通信处处体现着定时器的作用。在应用软件上,包括网络通信、UI交互界面等各类软件都需要用到各种和样的定时器。例如,在TCP/IP协议中,用于控制数据包的重传时间的重传机制。用于检测网络连接的存活状态的心跳检测机制。

在实际的生活当中,定时器的应用就更加广泛了。我们常用的洗衣机、微波炉等都需要用到定时器。闹钟更不必说,"闹钟"这两个字几乎就是定时器的代名词。那么在嵌入式软件当中如何实现定时器呢?

轮询机制

轮询机制是最简单的一种实现方式,他不需要具备太强的硬件知识。但是这种实现方式的效率是最低的。大致的实现思路如下:

基本步骤

1. 初始化定时器变量:设置起始时间或计数器初值。

2. 在主循环中轮询检查:定期检查当前时间或计数值是否达到预设的超时时间或计数值。

3. 执行超时处理逻辑:当检测到超时时执行相应的处理逻辑。

示例代码

下面是一个用C语言编写的简单示例,通过轮询系统时间来实现定时器功能。假设我们有一个函数 get_current_time_ms() 能够返回当前系统时间(毫秒)。

代码解释

1. 初始化定时器:在 main() 函数中,通过 get_current_time_ms() 获取系统当前时间,并将其赋值给 start_time 变量。

2. 在主循环中轮询检查:在 while (1) 循环中,不断获取当前时间 current_time,并检查 current_time - start_time 是否大于等于超时时间 timeout_ms。

3. 执行超时处理逻辑:如果检测到超时,则调用 handle_timeout() 函数执行相应的处理逻辑,并更新 start_time 以便重新开始计时,实现周期性定时。

优化建议

1. 减少忙等待:可以在轮询过程中加入适当的延时函数,如 sleep_ms(),以减少CPU占用率。

2. 多定时器管理:通过数组或链表管理多个定时器,每个定时器包含起始时间和超时时间,在主循环中轮询检查所有定时器的状态。

3. 避免溢出问题:处理计数器溢出问题时,可以使用无符号整数运算的特性,确保时间计算正确。

1. 使用硬件定时器

硬件定时器是嵌入式系统中实现定时/超时功能的基础组件。大多数微控制器都有多个硬件定时器,可以配置为定时中断。以下是基本步骤:

1. 初始化定时器:设置定时器的预分频器、计数值和中断。

2. 配置中断服务程序:在定时器计数值达到设定值时,触发中断,在中断服务程序中处理超时逻辑。

3. 启动定时器:启动定时器,使其开始计数。

2. 软件定时器

软件定时器通常在RTOS(实时操作系统)中实现,RTOS提供了定时器服务,可以创建和管理多个定时器。

4. 看门狗定时器

看门狗定时器(WDT)是一种特殊的硬件定时器,用于防止系统卡死。需要在特定时间内复位看门狗,否则会触发系统复位。

这些方法各有优缺点,选择哪种方法取决于具体的硬件平台、应用需求和资源限制。通常,硬件定时器和RTOS提供的软件定时器是首选方案,因为它们提供了更精确和可靠的定时/超时机制。

扫码申领本地嵌入式教学实录全套视频及配套源码

上一篇:卷积神经网络 (CNN) 最通俗图解!这次看我轻松拿捏CNN

下一篇:探索性数据分析(EDA)秘诀——时间序列预测篇

400-611-6270

Copyright © 2004-2024 华清远见教育科技集团 版权所有
京ICP备16055225号-5京公海网安备11010802025203号