【问题标题】:FreeRTOS suspend task from another functionFreeRTOS 从另一个函数挂起任务
【发布时间】:2016-07-11 16:23:44
【问题描述】:

所以我有一个半双工总线驱动程序,在那里我发送一些东西,然后总是需要等待很长时间才能得到响应。在这段等待时间内,我希望处理器做一些有价值的事情,所以我正在考虑使用 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*/
    }

 }

【问题讨论】:

    标签: multithreading arduino freertos arduino-due


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 是的,我也浏览过该暂停命令,但是因为我也想暂停一段时间而不是无限期,所以它不能立即工作。我最新的想法是扩展 com.带有默认参数的总线驱动程序(在本例中为 modbus 驱动程序)。如果调用者使用默认参数 true,则函数将在等待响应时返回延迟时间。那么这个延迟时间可能会被调用者直接在 vTaskDelay() 中使用。
    • 玩一些,似乎可以从 someFunction() 中调用 vTaskDelay(),并且 RTOS 将自动跟踪调用 someFunction() 的任务,因此无需发送句柄。整洁的。实际上是有道理的,因为一次总是只有一个任务在运行,RTOS 会知道要挂起哪个任务。现在这让事情变得更简单了。现在我基本上可以用 vTaskDelay() 替换我猜的总线驱动程序的所有 Arduino delay() 了。
    • 是的,你可以这样做。我仍然认为拥有某种事件驱动系统会更好,而不是仅仅等待一段时间。您应该知道您的串行(或以太网)驱动程序何时收到来自 modbus 的响应。 (我过去曾广泛使用 modbus)
    猜你喜欢
    • 2021-04-27
    • 2019-05-24
    • 2018-05-28
    • 2020-11-07
    • 1970-01-01
    • 2021-03-19
    • 2019-04-21
    • 1970-01-01
    • 2016-08-07
    相关资源
    最近更新 更多