【发布时间】:2018-07-13 16:40:30
【问题描述】:
引用文档(强调他们的)
定时器回调函数在定时器服务任务的上下文中执行。因此,定时器回调函数永远不会尝试阻塞是必要的。例如,定时器回调函数在访问队列或信号量时不得调用 vTaskDelay()、vTaskDelayUntil(),或指定非零阻塞时间。
FreeRTOS 参考书详细阐述了一点,但又没有明确的解释
调用xQueueReceive()等函数是可以的,但是 仅当设置了函数的 xTicksToWait 参数(指定函数的阻塞时间)时 为0。调用vTaskDelay()等函数是不行的,因为调用vTaskDelay()总是 将调用任务置于 Blocked 状态。
我的问题是:为什么会出现这样的问题?我正在等待一个信号量,它是由中断设置的,在定时器回调中,到目前为止它工作得很好。 (它用于使用 USB 批量端点发送长数据包。)
唯一的问题是否可能会延迟其他等待计时器?
【问题讨论】:
-
我认为那句话:“定时器回调函数在定时器服务任务的上下文中执行。”是线索。如果您将阻止计时器回调执行,则无法满足其他回调的时间限制,因为所有回调都在同一线程中调用。
-
@K.Koovalsky :我很欣赏您可能没有长时间使用 SO,但您应该避免在 cmets 部分回答问题。发布答案。