c - FreeRTOS 并发任务

标签 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();
    }
    

最佳答案

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

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

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

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

关于c - FreeRTOS 并发任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51233686/

相关文章:

c++ - 为什么 for/while/do-while 在执行相同任务时被放置在 c/c++ 中

c - 跳转到重置 vector

c - C : Interface implemented via multiple C files 中的自上而下方法

c++ - 嵌入式 C++ 中零大小数组的替代方案

stm32 - 如何从用户闪存启动STM32?

debugging - 使用 openocd 闪存和调试 STM32F7 发现

linux - 我想继续学习 µC 编程,但我完全不知道从哪里开始

c - 在 c 中使用指针时出现段错误(核心转储)

c++ - Shift 和 ctrl 防止事件发生? (Winapi)

c - 在 Makefile 中,是否可以创建具有通用依赖项的通用规则?