FreeRTOS vs Zephyr / Mynewt任务阻止状态

时间:2017-07-03 21:42:18

标签: rtos freertos

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

通过调用驱动程序(例如SPI或UART)时 FreeRTOS使用供应商HAL,然后在那里 是等待完成的两个选项:

1)中断 2)忙着等待

我的问题是:

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

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

由于 安德斯

1 个答案:

答案 0 :(得分:0)

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

另一方面,如果编写驱动程序以使用RTOS(即Zephr,FreeRTOS或任何其他),那么它可以利用RTOS原语来创建更有效的事件驱动执行模式。我看不出你提到的不同调度程序在这方面会有什么不同。例如,Zephr如何知道它不知道应用程序编写者要创建的任务是否会调用它以前没有知道的库函数,并且库函数将使用繁忙的等待? / p>