C语言 FreeRTOS 同时任务



我想创建两个在 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();
    }
    

同等优先级的任务是循环安排的。 这意味着firstTask将连续运行,直到其时间片结束或直到它被阻止,然后secondTask将运行一个完整的时间片,或者直到它被阻止,然后返回到无限期重复firstTask

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新