一种软件定时器/超时机制的实现方法

目录

  • 概述
  • 简单方法
  • 优化方案
    • 计数值自减
    • 开启超时
    • 超时检测

概述

在程序设计中,常会遇到需要循环等待的问题,比如在while中等待串口中断接收完一帧数据。这时为了避免一直接收不到,程序进入死循环,我们会选择增加超时退出机制。
本文主要是记录一下超时机制的实现。

简单方法

这种实现方式相对比较简单,理解起来容易的多。比较适用于超时机制较少的程序。
首先需要三个变量,超时开始标志、超时计数值、超时时间到标志:

芯片资源受限,为了节省空间,常会开启优化功能。所以此处加了关键字,避免被优化。实现上分为三个步骤:

  1. 开启超时。
  2. 超时计数。放在系统定时器中运行:
  3. 关闭超时。当等待的条件满足而退出循环时,则需要关闭超时:

可以想到,随着逻辑功能增加,会需要很多超时机制或定时器。这样频繁定义三个变量和三个函数,程序会变得很臃肿,且代码复用率很低。明显并不是很适用。

优化方案

考虑优化,可以将变量变为数组,通过索引来标识不同的超时,比如0是串口协议帧超时、1是SPI协议帧超时、2是系统运行时间等。

首先想到的是通过宏定义来实现,最近正好在学习RT-Thread,这里借鉴下,使用枚举的形式:

即是允许的定时器的总个数,我们定义一下:

不再需要、、三个变量,以串口帧超时为例,我们通过的值来判断。

可以看出,给赋值时,也就同步开启了定时器。检测的值,也就等同于检测超时结果。这里就得到三个关键问题的实现:计数值自减、开启超时、检测超时。

计数值自减

将上面的语句封装成一个函数:

从第一部分已经知道,自减1是在系统定时器中进行的,所以需要在系统定时器中调用函数。

开启超时

开启超时函数修改为:

函数内的超时时间是一个宏定义

这里可能会想到:因为超时时间直接写为常量,如果超时值需要根据程序上下文进行调整,则比较麻烦。不过可以通过增加形参来传入,或者增加一个定时器,反正就是增加一个index嘛。

超时检测

取消了 标志,超时检测使用函数调用来实现:

来源:何事误红尘

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年3月22日
下一篇 2021年3月22日

相关推荐