目录
- 概述
- 简单方法
- 优化方案
-
- 计数值自减
- 开启超时
- 超时检测
概述
简单方法
这种实现方式相对比较简单,理解起来容易的多。比较适用于超时机制较少的程序。
首先需要三个变量,超时开始标志、超时计数值、超时时间到标志:
芯片资源受限,为了节省空间,常会开启优化功能。所以此处加了关键字,避免被优化。实现上分为三个步骤:
- 开启超时。
- 超时计数。放在系统定时器中运行:
- 关闭超时。当等待的条件满足而退出循环时,则需要关闭超时:
可以想到,随着逻辑功能增加,会需要很多超时机制或定时器。这样频繁定义三个变量和三个函数,程序会变得很臃肿,且代码复用率很低。明显并不是很适用。
优化方案
考虑优化,可以将变量变为数组,通过索引来标识不同的超时,比如0是串口协议帧超时、1是SPI协议帧超时、2是系统运行时间等。
首先想到的是通过宏定义来实现,最近正好在学习RT-Thread,这里借鉴下,使用枚举的形式:
即是允许的定时器的总个数,我们定义一下:
不再需要、、三个变量,以串口帧超时为例,我们通过的值来判断。
可以看出,给赋值时,也就同步开启了定时器。检测的值,也就等同于检测超时结果。这里就得到三个关键问题的实现:计数值自减、开启超时、检测超时。
计数值自减
将上面的语句封装成一个函数:
从第一部分已经知道,自减1是在系统定时器中进行的,所以需要在系统定时器中调用函数。
开启超时
开启超时函数修改为:
函数内的超时时间是一个宏定义
这里可能会想到:因为超时时间直接写为常量,如果超时值需要根据程序上下文进行调整,则比较麻烦。不过可以通过增加形参来传入,或者增加一个定时器,反正就是增加一个index嘛。
超时检测
取消了 标志,超时检测使用函数调用来实现:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!