• 302查看
  • 0回复

[底层软件] 超时任务处理

[复制链接]


该用户从未签到

发表于 3-3-2024 21:07:48 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


软件超时机制

1、背景

在嵌入式软件程序设计过程中中,经常会遇到超时(或定时)的处理情况,基本处理思想是在时间到的时候进行相关程序处理,下面介绍两种超时(或定时)的程序设计方案。
2、方案一

基本思想:定时器中断使用一个变量TICK,中断间隔时间t,在准备定时开始时读取此时刻的TICK,在程序运行过程中实时读取当前的TICK信息并计算即可。

因此在时间计算时只需计算开始STARTTICK和结束ENDTICK即可完成时间计算。时间计算T=(ENDTICK-STARTTICK)*t;使用一个定时器中断每t时间处理一次中断,中断里面时间计数值s_u32TCNT++,如下图所示:

超时任务处理w1.jpg

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

超时任务处理w2.jpg

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

超时任务处理w3.jpg
3、方案二

基本思想:定义回调函数和回调注册函数,将定时/超时服务函数注册回调,每一次定时器中断执行一次回调,回调函数只需对计时时间TCNT做减1操作即可,当TCNT为0时即定时/超时时间到,并置超时标志,应用程序只需判断标志即可明确定时/超时时间是否到来;回调函数和回调注册函数定义如下图所示,多个超时/定时回调函数可注册在回调函数数组中:

超时任务处理w4.jpg

超时任务处理w5.jpg

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

超时任务处理w6.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--;};




该用户从未签到

发表于 14-3-2025 08:47:01 | 显示全部楼层
针对您提供的帖子内容,作为一名汽车工程师,关于超时任务处理和软件超时机制,我给出以下专业的回复:

超时机制在嵌入式软件设计中至关重要,用于确保任务在规定时间内完成。针对您提到的两种方案,方案一基于定时器中断实现时间计算,其优点是精确度高、实时性强。通过读取定时器计数器的值,计算时间差来确定任务是否超时。方案二涉及轮询检测的方式,虽然简单易行,但可能占用更多CPU资源。在设计软件时,应考虑任务的实时性要求和系统资源,选择合适的超时机制。此外,对于复杂的嵌入式系统,还需要考虑中断管理、任务优先级和系统的实时操作系统等因素。

以上是简要的回复,如果需要更详细的技术细节或讨论其他方案,请继续交流。
回复 支持 反对

使用道具 举报

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 11-7-2025 06:27 , Processed in 0.463261 second(s), 37 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.