FreeRTOS同步任务

时间:2018-07-08 15:51:55

标签: c embedded microcontroller 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();
    }
    

2 个答案:

答案 0 :(得分:2)

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

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

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

您的示例可能符合您的预期效果,但两个任务都将占用CPU时间并以某种方式运行。可能在很大程度上是学术性的,因为这不是RTOS的非常实用或有用的使用。

答案 1 :(得分:1)

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

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

进行简要介绍。