【问题标题】:FreeRTOS simultaneous tasksFreeRTOS 并发任务
【发布时间】:2018-07-08 15:51:54
【问题描述】:

我想创建两个在 FreeRTOS 中同时运行的任务。第一个任务将处理 LED,第二个任务将监控温度。 我有两个问题

  1. 此代码会创建两个同时运行的任务吗?
  2. 如何在任务之间发送数据,例如:如果温度超过x度,打开LED?

    void firstTask(void *pvParameters) {
        while (1) {
            puts("firstTask");
        }
    }
    
    void secondTask(void *pvParameters) {
        while (1) {
            puts("secondTask");
        }
    }
    
    int main() {
        xTaskCreate(firstTask, "firstTask", STACK_SIZE, NULL, TASK_PRIORITY, NULL);
        xTaskCreate(secondTask, "secondTask", STACK_SIZE, NULL, TASK_PRIORITY, NULL);
        vTaskStartScheduler();
    }
    

【问题讨论】:

  • 开(1):你为什么不干脆试试?
  • 你选择了最糟糕的测试方式。 puts 并不是最好的尝试。

标签: c embedded microcontroller freertos


【解决方案1】:

同等优先级的任务是循环调度的。这意味着firstTask 将持续运行直到其时间片 结束或直到它被阻塞,然后secondTask 将运行一个完整的时间片或直到它被阻塞然后回到@987654323 @无限重复。

从表面上看,您没有阻塞调用,但如果您为 stdio 实现了 RTOS 感知缓冲 I/O,那么puts() 很可能在其缓冲区已满时阻塞。

单核处理器上的任务永远不会真正并发,而是根据调度算法安排在必要时运行。 FreeRTOS 是一个基于优先级的抢占式调度器。

您的示例可能会或不会按照您的预期运行,但两个任务都会获得 CPU 时间并以某种方式运行。它可能在很大程度上是学术性的,因为这不是 RTOS 的非常实用或有用的用途。

【讨论】:

    【解决方案2】:

    任务永远不会真正同时运行 - 假设您只有一个内核。在您的情况下,您正在创建具有相同优先级的任务并且它们从不阻塞(尽管它们确实输出字符串,可能以一种不是线程安全的方式),因此它们将通过时间切片“共享”CPU时间。每个任务将执行到下一个滴答中断,此时它将切换到另一个。

    我建议阅读 FreeRTOS 书籍的免费 pdf 版本,以温和地介绍基础知识https://www.freertos.org/Documentation/RTOS_book.html

    【讨论】:

      猜你喜欢
      • 2016-08-07
      • 2016-12-25
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2020-12-17
      • 2021-02-05
      • 2017-05-02
      • 2013-12-31
      相关资源
      最近更新 更多