Mig*_*ork 4 c embedded rtos freertos
引用文档(强调他们的)
定时器回调函数在定时器服务任务的上下文中执行。因此,定时器回调函数永远不要试图阻塞是很重要的。例如,定时器回调函数在访问队列或信号量时不得调用 vTaskDelay()、vTaskDelayUntil() 或指定非零阻塞时间。
FreeRTOS 参考书阐述的多一点,再次没有明确解释
可以调用 xQueueReceive() 等函数,但前提是函数的 xTicksToWait 参数(指定函数的阻塞时间)设置为 0。调用 vTaskDelay() 等函数是不行的,如调用 vTaskDelay()将始终将调用任务置于阻塞状态。
我的问题是:为什么会出现这样的问题?我正在等待计时器回调中由中断设置的信号量,到目前为止它运行良好。(它用于使用 USB 批量端点发送长数据包。)
唯一的问题可能会延迟其他等待计时器吗?
该声明:
定时器回调函数在定时器服务任务的上下文中执行。
是关键。如果您的回调阻塞,则您正在阻塞定时器服务任务,如果允许它发生会延迟其他定时器操作,并且无法实现 RTOS 调度保证。
计时器服务任务将在循环中为所有在该滴答中到期的计时器执行计时器操作。如果您的计时器回调要执行延迟或阻塞操作,这将延迟所有尚未调用但已安排在同一滴答上的计时器操作,并且如果在服务任务被阻止时它们到期,则会延迟后续滴答中的所有操作。
如果要执行的操作需要阻塞(或者甚至只需要大量时间),正确的操作是让您的回调信号成为一个独立的任务来执行该操作。定时器回调应该被视为中断服务例程 - 尽可能快速和确定地运行到完成,而不会阻塞。事实上,一些 RTOS 实际上在中断上下文中调用定时器回调,而不是在任何情况下的特殊服务任务,因此无论您使用什么 RTOS,它都是一个很好的指南。