0

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

一种方法是将驱动程序拆分为一些发送/接收部分。发送后,返回给调用者。然后调用者挂起,并在一段时间后进行接收部分。

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

 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*/
    }

 }
4

1 回答 1

0

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

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

例如,在串行通信中,您可能有一个任务将数据送入队列(但如果队列已满则暂停)和一个将数据从队列中取出并传输数据的中断,或者一个将数据放入队列的中断,或者向一个任务发送一个事件来说明有数据准备好等待它处理,然后该任务可以唤醒并处理数据或将其从队列中取出。

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

大多数 RTOS 都有许多其他任务控制机制。

浏览一下 FreeRTOS 网站并尝试一些演示。网上也有很多通用的 RTOS 教程。值得学习如何使用大多数 RTOS 的基本功能。它实际上并没有那么复杂。

于 2016-07-11T20:49:00.527 回答