良许Linux教程网 干货合集 干货 | 嵌入式软件定时/超时机制程序设计

干货 | 嵌入式软件定时/超时机制程序设计

软件超时机制

1、背景

在嵌入式软件程序设计中,经常需要处理超时(或定时)的情况。基本处理思路是在特定时间到达时进行相关程序处理。下面介绍两种超时(或定时)的程序设计方案。

2、方案一

基本思路:使用一个变量TICK作为定时器中断计数器,中断间隔时间为t。在准备开始定时时,记录当前的TICK值,并在程序运行过程中实时读取当前的TICK值进行计算。

因此,只需要计算开始时间STARTTICK和结束时间ENDTICK之间的差值,即可得到时间计算结果T=(ENDTICK-STARTTICK)*t。使用一个定时器中断每t的时间间隔处理一次中断,在中断处理函数中,时间计数器s_u32TCNT++。下图为示意图:

image-20231005204617371
image-20231005204617371

程序中定义一个结构体来保存超时开始和超时结束时间,结构体定义如下图所示:

image-20231005204621047
image-20231005204621047

在需要做定时超时处理的地方实时的获取当前s_u32TCNT并赋值给u32EndTimeTick,计算开始u32StartTimeTick和结束时u32EndTimeTick的时间差来判断时间是否到来即可,程序设计示意代码如下图所示:

image-20231005204624036
image-20231005204624036

3、方案二

基本思想:定义回调函数和回调注册函数,将定时/超时服务函数注册回调,每一次定时器中断执行一次回调,回调函数只需对计时时间TCNT做减1操作即可。

当TCNT为0时即定时/超时时间到,并置超时标志,应用程序只需判断标志即可明确定时/超时时间是否到来;回调函数和回调注册函数定义如下图所示,多个超时/定时回调函数可注册在回调函数数组中:

image-20231005204627206
image-20231005204627206
image-20231005204631181
image-20231005204631181

定时中断函数中进行遍历处理,定时中断函数处理示意代码如下图所示:

image-20231005204634334
image-20231005204634334

4、对比总结

方案一优点在于中断执行单元执行内容少,代码操作容易理解,缺点是应用中实时的进行计算开始和结束TICK差值,代码执行效率不高。

方案二优点在于将超时函数注册在回调中即可,程序扩展性较好,不用做过多的数值计算,代码执行效率相对较高,缺点是定时中断中需要遍历所有已注册的对调,中断执行内容相对较多。

STM32程序超时设计

在程序设计中,出现以下类似语句,是非常不可靠的,很有必要加入超时处理!

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

以下在stm32的system_stm32f10x.c文件中,判断外部晶振起振的程序。可以参考,在以后的程序中借鉴。

#define HSE_STARTUP_TIMEOUT   ((uint16_t)0x0500) /*!
/* Wait till HSE is ready and if Time out is reached exit */
do
{
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

I2C 读写EEPROM添加超时:

uint16_t i = 0x0fff;
while ((!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))&&i){i--;};

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部