FreeRTOS 从另一个函数挂起任务

FreeRTOS suspend task from another function

所以我有一个半双工总线驱动程序,我发送一些东西然后总是要等待很长时间才能得到响应。在这段等待时间里,我希望处理器做一些有价值的事情,所以我正在考虑使用 FreeRTOS 和 vTaskDelay() 或其他东西。

一种方法是将驱动程序分成 send/receive 部分。发送后,它 returns 给调用者。然后呼叫者挂起,并在一定时间后进行接收部分。

但是,如果从用户的角度来看它仍然是一项任务,那么抽象级别会更好,就像今天一样。因此我在想,任务中的函数是否有可能暂停任务本身?喜欢

 void someTask()
 {
     while(true){
       someFunction(&someTask(), arg 1, arg 2,...);
       otherStuff(); 
 }


 }

 void someFunction(*someSortOfReferenceToWhateverTaskWhoCalled, arg1, arg2 ...)
 {
    if(something)  
    {

       /*Use the pointer or whatever to suspend the task that called this                      function*/
    }

 }

查看 vTaskSuspend 的 FreeRTOS API 参考,http://www.freertos.org/a00130.html

但是我不确定您是否打算以正确的方式控制程序的流程。任务可以因队列、事件、延迟等而暂停。

例如在串行通信中,您可能有一个将数据送入队列的任务(但如果队列已满则挂起)和一个从队列中取出数据并传输数据的中断,或者一个将数据放入中断的任务在队列中,或向任务发送事件以表明有数据可供其处理,然后任务可以唤醒并处理数据或将其从队列中取出。

我认为重要的一件事(在我看来)是在任何任务中只有一个挂起点。这不是严格的规定,但在大多数情况下会让您的生活轻松很多。

还有许多其他任务控制机制对大多数 RTOS 都是通用的。

好好看看 FreeRTOS 网站并尝试一些演示。网络上还有大量通用的 RTOS 教程。值得学习如何使用大多数 RTOS 的基本功能。其实并没有那么复杂。