我似乎找不到关于这个问题的任何信息,所以我想我会在这里问。 (这里没有回复:https://lists.zephyrproject.org/pipermail/zephyr-devel/2017-June/007743.html(
当司机(例如SPI 或 UART( 通过 使用供应商 HAL 的 FreeRTOS,然后在那里 是等待完成后的两个选项:
1( 中断 2(忙碌等待
我的问题是这样的:
如果使用忙候调用驱动程序;那么 FreeRTOS 是否知道繁忙等待(发生在 HAL 驱动程序中(?任务是否仍分配了时间段(用于执行繁忙等待(。这是 它是如何工作的?(假设 FreeRTOS 任务具有抢占式调度程序(
现在在Zephyr(可能还有Mynewt(中,我可以看到当调用驱动程序时,Zephyr会跟踪调用任务,然后暂停(阻塞状态(直到完成。然后,驱动程序中断例程,当准备好继续时,它将调用线程放入运行队列中。这样就不会腰围。这理解正确吗?
谢谢 安德斯
我不明白你的问题。 在 FreeRTOS 中,如果实现驱动程序来执行繁忙的等待(即驱动程序不知道多线程,因此不是事件驱动的,而是使用使用所有 CPU 时间的繁忙等待(,那么 RTOS 调度程序不知道正在发生,因此会像安排任何其他任务一样调度任务。 因此,如果任务是优先级最高的就绪状态任务,它将使用所有 CPU 时间,如果还有其他具有相同优先级的任务,它将与这些任务共享 CPU 时间。
另一方面,如果驱动程序被编写为使用 RTOS(无论是 Zephr、FreeRTOS 还是任何其他(,那么它可以利用 RTOS 原语来创建更高效的事件驱动执行模式。 我看不出您提到的不同调度程序在这方面的行为有何不同。 例如,Zephr 如何知道它不知道应用程序编写者将要创建的任务将调用它以前不知道的库函数,并且库函数将使用繁忙的等待?