原理设备运行过程中我们有一些定时的操作需要执行的例如间隔10s上报设备状态到手机打印时如果持续加热20s需要触发报警否则容易损坏打印设备所以我们就需要又定时器来实现这些功能。前面我们使用了硬件定时器us级别的延时函数借助硬件的TIM1这里我们使用软件定时器对于不是太精准的定时需求我们就可以使用软件定时器了。第一个软件定时器读取打印状态通过周期性的系统软件定时器10触发一次通过判定返回值来打印温度电压等以及上报蓝牙。第二个软件定时器读取打印是否超时通过设置一次性的系统软件定时器来判断打印期间是否超时要是超时就返回true,若未超时的话打印结束会删除到软件定时器任务。功能利用FreeRTOS软件定时器构建两套独立的计时机制一套用于周期性地触发系统状态读取心跳检测另一套用于监控打印任务的执行时长看门狗防止程序在打印过程中死锁或卡死。逻辑周期性状态轮询心跳机制核心机制init_timer()创建一个周期性软件定时器(osTimerPeriodic)设定间隔为10000ms10秒。原理定时器每隔10秒自动触发read_state_timer_callbackfun。回调函数不执行复杂逻辑仅将全局标志位read_state_timeout置为true并打印日志。主循环或其他任务通过轮询get_state_timeout()获取该标志位执行状态读取任务如读取传感器、检测蓝牙连接后调用clean_state_timeout()清除标志位。这种“标志位解耦”设计避免了在定时器回调中直接执行耗时操作保证了系统的实时性。单次任务看门狗打印超时保护核心机制open_printer_timeout_timer()创建一个单次软件定时器(osTimerOnce)设定超时时间为20000ms20秒。原理当打印任务开始时调用open_printer_timeout_timer()启动“倒计时”。如果打印任务正常结束必须调用close_printer_timeout_timer()删除定时器取消警报。如果打印任务因故障如电机卡死、热敏头过热导致程序卡住无法在20秒内关闭定时器回调函数read_timeout_timer_callbackfun就会被触发将printer_timeout置为true。主程序检测到该标志位后可执行紧急复位或报错处理防止系统无限挂起。状态标志位管理核心机制使用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);//一次性的软件定时器osTimerOncemyStateTimerHandle osTimerCreate(osTimer(myStateTimer), osTimerPeriodic, NULL);//周期性的软件定时器osTimerPeriodic