我想创建两个在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();
}
答案 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
进行简要介绍。