我想创建两个在 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 时间。 每个任务将执行到下一个即时报价中断,此时它将切换到另一个。
我建议阅读 FreeRTOS 书籍的免费 pdf 版本,以温和地介绍基础知识 https://www.freertos.org/Documentation/RTOS_book.html