news 2026/4/30 18:49:30

小智打印机第八节:软件定时器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
小智打印机第八节:软件定时器

原理:设备运行过程中,我们有一些定时的操作需要执行的,例如间隔10s上报设备状态到手机,打印时如果持续加热20s,需要触发报警,否则容易损坏打印设备,所以我们就需要又定时器来实现这些功能。

前面我们使用了硬件定时器(us级别的延时函数,借助硬件的TIM1),这里我们使用软件定时器,对于不是太精准的定时需求,我们就可以使用软件定时器了。

第一个软件定时器:读取打印状态,通过周期性的系统软件定时器10触发一次,通过判定返回值来打印温度,电压等,以及上报蓝牙。

第二个软件定时器:读取打印是否超时,通过设置一次性的系统软件定时器,来判断打印期间是否超时,要是超时就返回true,若未超时的话,打印结束会删除到软件定时器任务。

功能:

利用FreeRTOS软件定时器构建两套独立的计时机制:一套用于周期性地触发系统状态读取(心跳检测),另一套用于监控打印任务的执行时长(看门狗),防止程序在打印过程中死锁或卡死。

逻辑:

  1. 周期性状态轮询(心跳机制):
    • 核心机制:init_timer()创建一个周期性软件定时器(osTimerPeriodic),设定间隔为10000ms(10秒)。
    • 原理:定时器每隔10秒自动触发read_state_timer_callbackfun。回调函数不执行复杂逻辑,仅将全局标志位read_state_timeout置为true并打印日志。主循环或其他任务通过轮询get_state_timeout()获取该标志位,执行状态读取任务(如读取传感器、检测蓝牙连接)后,调用clean_state_timeout()清除标志位。这种“标志位解耦”设计避免了在定时器回调中直接执行耗时操作,保证了系统的实时性。
  1. 单次任务看门狗(打印超时保护):
    • 核心机制:open_printer_timeout_timer()创建一个单次软件定时器(osTimerOnce),设定超时时间为20000ms(20秒)。
    • 原理:当打印任务开始时,调用open_printer_timeout_timer()启动“倒计时”。如果打印任务正常结束,必须调用close_printer_timeout_timer()删除定时器,取消警报。如果打印任务因故障(如电机卡死、热敏头过热)导致程序卡住,无法在20秒内关闭定时器,回调函数read_timeout_timer_callbackfun就会被触发,将printer_timeout置为true。主程序检测到该标志位后,可执行紧急复位或报错处理,防止系统无限挂起。
  1. 状态标志位管理:
    • 核心机制:使用volatile bool类型的全局变量(read_state_timeout, printer_timeout)作为跨任务通信的媒介。
    • 原理:volatile关键字确保编译器不会优化掉对这些变量的读取,保证主循环能实时看到定时器回调对变量的修改,实现了中断(定时器服务任务)与主循环之间的安全通信。

void read_timeout_timer_callbackfun(void const * argument)

{

/* USER CODE BEGIN read_state_timer_callbackfun */ printf("触发打印超时错误...\r\n"); printer_timeout = true; /* USER CODE END read_state_timer_callbackfun */

}

这个定时器回调函数的格式是固定的,必须要void 函数名(void const * argument) myTimeoutTimerHandle = osTimerCreate(osTimer(myTimeoutTimer), osTimerOnce, NULL);//一次性的软件定时器osTimerOnce

myStateTimerHandle = osTimerCreate(osTimer(myStateTimer), osTimerPeriodic, NULL);//周期性的软件定时器osTimerPeriodic

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 18:49:29

FigmaCN完整指南:3分钟快速实现Figma界面汉化,让设计回归母语

FigmaCN完整指南:3分钟快速实现Figma界面汉化,让设计回归母语 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面而头疼吗?专业术…

作者头像 李华
网站建设 2026/4/30 18:44:22

Python自动化脚本环境变量管理

密码硬编码在代码里?配置改一次要改一次代码?换环境就手忙脚乱?这些都是环境变量管理不当惹的祸。本文详细介绍Python中环境变量的最佳实践,让你的自动化脚本配置更安全、更灵活、更易维护。 为什么需要管理环境变量 环境变量是连接代码和配置的桥梁,好处显而易见: 安全…

作者头像 李华
网站建设 2026/4/30 18:40:40

Cursor智能体开发:工作树

本页介绍的界面原生工作树功能仅在代理窗口中可用。在编辑器窗口中,请使用下方的 工作树技能 命令。 工作树可让智能体在隔离的 Git 检出中工作。每个任务都有各自独立的文件、依赖项和更改,而你的主检出保持不变。 如果你想在同一个仓库上同时启动多个…

作者头像 李华