【问题标题】:Why can't FreeRTOS software timer callback use blocking API为什么 FreeRTOS 软件定时器回调不能使用阻塞 API
【发布时间】:2018-07-13 16:40:30
【问题描述】:

引用文档(强调他们的)

定时器回调函数在定时器服务任务的上下文中执行。因此,定时器回调函数永远不会尝试阻塞是必要的。例如,定时器回调函数在访问队列或信号量时不得调用 vTaskDelay()、vTaskDelayUntil(),或指定非零阻塞时间。

FreeRTOS 参考书详细阐述了一点,但又没有明确的解释

调用xQueueReceive()等函数是可以的,但是 仅当设置了函数的 xTicksToWait 参数(指定函数的阻塞时间)时 为0。调用vTaskDelay()等函数是不行的,因为调用vTaskDelay()总是 将调用任务置于 Blocked 状态。

我的问题是:为什么会出现这样的问题?我正在等待一个信号量,它是由中断设置的,在定时器回调中,到目前为止它工作得很好。 (它用于使用 USB 批量端点发送长数据包。)

唯一的问题是否可能会延迟其他等待计时器?

【问题讨论】:

  • 我认为那句话:“定时器回调函数在定时器服务任务的上下文中执行。”是线索。如果您将阻止计时器回调执行,则无法满足其他回调的时间限制,因为所有回调都在同一线程中调用。
  • @K.Koovalsky :我很欣赏您可能没有长时间使用 SO,但您应该避免在 cmets 部分回答问题。发布答案。

标签: c embedded rtos freertos


【解决方案1】:

声明:

定时器回调函数在定时器服务任务的上下文中执行。

是关键。如果您的回调阻塞,则您正在阻塞定时器服务任务,如果允许发生,则会延迟其他定时器操作,并且无法实现 RTOS 调度保证。

计时器服务任务将在循环中为所有在该滴答中过期的计时器执行计时器操作。如果您的计时器回调要执行延迟或阻塞操作,这将延迟所有尚未调用但计划在同一滴答声中的计时器操作,并且如果在服务任务被阻塞时到期,则会延迟后续滴答声中的所有操作。

如果要执行的操作需要阻塞(甚至只是花费大量时间),正确的操作是让您的回调信号成为一个独立的任务来执行该操作。定时器回调应被视为中断服务例程 - 尽可能快且尽可能确定地运行完成,而不会阻塞。事实上,一些 RTOS 实际上在中断上下文中调用定时器回调,而不是在任何情况下的特殊服务任务,因此无论您使用什么 RTOS,它都是一个很好的指南。

【讨论】:

    猜你喜欢
    • 2019-07-07
    • 2019-05-14
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2020-08-06
    • 2021-10-19
    • 1970-01-01
    • 2012-10-19
    相关资源
    最近更新 更多