在FreeRTOS软件定时器回调中修改自身参数是否安全?
在FreeRTOS定时器回调中修改自身参数的安全性确认
你的这种用法是安全的,原因如下:
FreeRTOS软件定时器的回调函数本身运行在定时器服务任务的上下文当中,所有修改定时器属性的官方API(比如xTimerChangePeriod、vTimerSetReloadMode)都做了线程安全设计:
- 当调用者就是定时器服务任务时(比如你的回调场景),这些API会直接操作定时器内部数据结构,无需通过队列转发命令,不存在多线程竞态问题
- 如果是其他任务调用这类API,它们会通过定时器命令队列发送请求,由服务任务统一处理,同样能保证线程安全
针对你的代码细节:
- 静态创建定时器的逻辑合理,仅在句柄为空时初始化,避免重复创建的问题
- 回调中首次执行时修改周期并开启自动重载,后续进入定时循环的流程没有逻辑漏洞,当前正常运行的状态也验证了这一点
你的代码参考
reboot函数
void reboot(void) { /* here the timer is used to schedule a later call */ if (NULL == xTimerRebootHdl) { xTimerRebootHdl = xTimerCreateStatic("rebootTimer", 25, pdFALSE, 0, vTimerRebootCallback, &xTimerRebootBuffer); } if (NULL != xTimerRebootHdl) { xTimerStart(xTimerRebootHdl, 50); } }
定时器回调函数
static void vTimerRebootCallback(TimerHandle_t xTimer) { static bool firstRound = true; if (firstRound) { // Do something xTimerChangePeriod(xTimerRebootHdl, 2000, 50); vTimerSetReloadMode(xTimerRebootHdl, pdTRUE); firstRound = false; } else { // Do other things } }
内容的提问来源于stack exchange,提问作者LeonFibuck
相关产品推荐
相关产品推荐

