嵌入式超时机制程序如何设计?
Posted 嵌入式大杂烩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式超时机制程序如何设计?相关的知识,希望对你有一定的参考价值。
原文:https://blog.csdn.net/qq_38767222/article/details/90374420
软件超时机制
1、背景
在嵌入式软件程序设计过程中中,经常会遇到超时(或定时)的处理情况,基本处理思想是在时间到的时候进行相关程序处理,下面介绍两种超时(或定时)的程序设计方案。
2、方案一
基本思想:定时器中断使用一个变量TICK,中断间隔时间t,在准备定时开始时读取此时刻的TICK,在程序运行过程中实时读取当前的TICK信息并计算即可。
因此在时间计算时只需计算开始STARTTICK和结束ENDTICK即可完成时间计算。时间计算T=(ENDTICK-STARTTICK) * t;使用一个定时器中断每t时间处理一次中断,中断里面时间计数值s_u32TCNT++,如下图所示:
![](https://image.cha138.com/20220310/27e4ac7caf3a4e4db23d2092c0d386c2.jpg)
程序中定义一个结构体来保存超时开始和超时结束时间,结构体定义如下图所示:
![](https://image.cha138.com/20220310/43da2ada726544778f38bcc947851036.jpg)
在需要做定时超时处理的地方实时的获取当前s_u32TCNT并赋值给u32EndTimeTick,计算开始u32StartTimeTick和结束时u32EndTimeTick的时间差来判断时间是否到来即可,程序设计示意代码如下图所示:
![](https://image.cha138.com/20220310/f1918fdeb00246eeb69d82048784bb33.jpg)
3、方案二
基本思想:定义回调函数和回调注册函数,将定时/超时服务函数注册回调,每一次定时器中断执行一次回调,回调函数只需对计时时间TCNT做减1操作即可。
当TCNT为0时即定时/超时时间到,并置超时标志,应用程序只需判断标志即可明确定时/超时时间是否到来;回调函数和回调注册函数定义如下图所示,多个超时/定时回调函数可注册在回调函数数组中:
![](https://image.cha138.com/20220310/41d674e3028045668df5b45ef18db26d.jpg)
![](https://image.cha138.com/20220310/0d8948a43524440ab1306310954f5a37.jpg)
定时中断函数中进行遍历处理,定时中断函数处理示意代码如下图所示:
![](https://image.cha138.com/20220310/11717f7b0ae74e3b964e438d0f54b1a5.jpg)
4、对比总结
方案一优点在于中断执行单元执行内容少,代码操作容易理解,缺点是应用中实时的进行计算开始和结束TICK差值,代码执行效率不高。
方案二优点在于将超时函数注册在回调中即可,程序扩展性较好,不用做过多的数值计算,代码执行效率相对较高,缺点是定时中断中需要遍历所有已注册的对调,中断执行内容相对较多。
STM32程序超时设计
在程序设计中,出现以下类似语句,是非常不可靠的,很有必要加入超时处理!
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
以下在stm32的system_stm32f10x.c文件中,判断外部晶振起振的程序。可以参考,在以后的程序中借鉴。
#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */
/* 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--;;
版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
猜你喜欢:
在公众号聊天界面回复1024,可获取嵌入式资源;回复 m ,可查看文章汇总。
点击阅读原文,查看更多分享。
点个呗
以上是关于嵌入式超时机制程序如何设计?的主要内容,如果未能解决你的问题,请参考以下文章
Linux(程序设计):60---定时机制之SO_RCVTIMEOSO_SNDTIMEO选项(附设置connect超时时间案例)
Android 进阶——Framework 核心ANR( Applicatipon No Response)机制设计思想详解