消息队列(Queue)
这就是个往别的 Task 发送数据的,可以是任何数据。
使用流程
- 创建队列存数据
- Task1:发数据到队列
- Task2:等队列有数据,阻塞状态
特殊情况
条件:队列大小为 5。
Task1:每隔 1 秒往队列发送数据。
Task2:每隔 10 秒接收一次数据。
到了第 6 秒,队列已满。
会发生:
Task1 由于发送不了数据被阻塞,直到第 10 秒 Task2 接收到一个数据,Task1 才能往队列塞一个数据。
代码示例
由于是队列,所以满足先进先出的原则。
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
QueueHandle_t xQueue;
void vTask1(void *pvParameters) {
int item = 0;
while (1) {
item++;
xQueueSend(xQueue, &item, portMAX_DELAY);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void vTask2(void *pvParameters) {
int received_item;
while (1) {
if (xQueueReceive(xQueue, &received_item, portMAX_DELAY) == pdTRUE) {
printf("接收到的元素是%d\r\n", received_item);
}
}
}
void app_main() {
xQueue = xQueueCreate(5, sizeof(int));
xTaskCreate(vTask1, "Task1", 2048, NULL, 2, NULL);
xTaskCreate(vTask2, "Task2", 2048, NULL, 2, NULL);
}
License:
CC BY 4.0