码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 讲解嵌入式软件中超时机制设计


    软件超时机制

    1、背景

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

    2、方案一

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

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

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

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

    3、方案二

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

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

    4、对比总结

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

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

     资料直通车:Linux内核源码技术学习路线+视频教程内核源码

    学习直通车:Linuxc/c++高级开发【直播公开课】

    零声白金VIP体验卡:零声白金VIP体验卡(含基础架构/高性能存储/golang/QT/音视频/Linux内核)

    STM32程序超时设计

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

    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    

    以下在stm32的system_stm32f10x.c文件中,判断外部晶振起振的程序。

    可以参考,在以后的程序中借鉴。

    1. #define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */
    2. /* Wait till HSE is ready and if Time out is reached exit */
    3. do
    4. {
    5. HSEStatus = RCC->CR & RCC_CR_HSERDY;
    6. StartUpCounter++;
    7. } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

    I2C 读写EEPROM添加超时:

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

    原文作者:share明

  • 相关阅读:
    机器学习-迁移学习
    Squid代理服务器应用
    Rosalind Java|Longest Increasing Subsequence动态规划算法
    请讲一讲JS中的 for...in 与 for...of (下)
    深入浅出Java线程池
    【PyTorch深度学习项目实战100例】—— 基于ResNet50实现多目标美味蛋糕图像分类 | 第51例
    Go template详解(上)- 注释、作用域、空格和空行、管道、{{range .}}、{{with .}}(helm进阶语法)
    数据结构线性表之带头双向循环链表
    1001 害死人不偿命的(3n+1)猜想
    linux系统基础回顾(二)
  • 原文地址:https://blog.csdn.net/youzhangjing_/article/details/133885320
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号