FreeRTOS 与 Zephyr/Mynewt 任务阻塞状态

FreeRTOS vs Zephyr/Mynewt task blocked state

我似乎找不到关于这个问题的任何信息,所以我想在这里问一下。 (这里没有回复:https://lists.zephyrproject.org/pipermail/zephyr-devel/2017-June/007743.html

当通过以下方式调用驱动程序(例如 SPI 或 UART)时 FreeRTOS使用vendor HAL,然后有 有两个等待完成的选项:

1) 中断 2) 忙等待

我的问题是:

如果使用忙等待调用驱动程序;那么 FreeRTOS 是否知道忙等待(发生在 HAL 驱动程序中)?任务是否仍然分配了一个时隙(用于忙等待)。这是 怎么运行的? (假设 FreeRTOS 任务有一个抢占式调度程序)

现在在 Zephyr(可能还有 Mynewt)中,我可以看到当调用驱动程序时,Zephyr 会跟踪调用任务,然后暂停(阻塞状态)直到完成。然后驱动程序中断例程将调用线程放入 运行 队列,准备好继续。这样就没有周期被束缚。这样理解对吗?

谢谢 安德斯

我不明白你的问题。在 FreeRTOS 中,如果驱动程序实现了执行忙等待(即驱动程序不了解多线程,因此不是事件驱动的,而是使用占用所有 CPU 时间的忙等待)那么 RTOS 调度程序不知道正在发生什么,因此将像调度任何其他任务一样调度该任务。因此,如果任务是最高优先级的就绪状态任务,它将使用所有 CPU 时间,如果有其他同等优先级的任务,它将与这些任务共享 CPU 时间。

另一方面,如果驱动程序被编写为使用 RTOS(Zephr、FreeRTOS 或任何其他),那么它可以使用 RTOS 原语来创建更高效​​的事件驱动执行图案。我看不出你提到的不同调度程序在这方面会有什么不同。