C FreeRTOS同步任务

C FreeRTOS同步任务,c,embedded,microcontroller,freertos,C,Embedded,Microcontroller,Freertos,我想创建两个在FreeRTOS中同时运行的任务。第一个任务将处理LED,第二个任务将监控温度。 我有两个问题: 这段代码会创建两个同时运行的任务吗? 如何在任务之间发送数据,例如:如果温度超过x度,请打开LED void firstTask(void *pvParameters) { while (1) { puts("firstTask"); } } void secondTask(void *pvParameters) { while (1) {

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

这段代码会创建两个同时运行的任务吗? 如何在任务之间发送数据,例如:如果温度超过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时间。每个任务将一直执行到下一个勾号中断,此时它将切换到另一个


我建议您阅读免费的pdf版本的FreeRTOS书籍,对基础知识做一个温和的介绍

1:为什么不试试呢?您选择了最糟糕的测试方式。puts不是最好的函数。