主要包括队列(Queue)、信号量(Semaphore)、互斥量(Mutex)、事件组(Event Groups)、和消息缓冲区(Message Buffer)等。
队列:传输数据
队列是 FreeRTOS 中最常用的任务间通信机制。它们用于在不同任务之间传递数据。队列具有先进先出(FIFO)的特性,即数据项按照它们被发送的顺序接收。
- 用法:队列可以用于传递基本数据类型(如
int
、float
等)以及复杂的数据结构(如struct
)。 - 创建队列:使用
xQueueCreate()
创建一个队列。 - 发送数据:使用
xQueueSend()
或xQueueSendToBack()
(将数据放到队列尾部)或xQueueSendToFront()
(将数据放到队列头部)发送数据。 - 接收数据:使用
xQueueReceive()
从队列中接收数据。
例如:
QueueHandle_t xQueue;
void Task1(void *pvParameters) {
int dataToSend = 100;
xQueueSend(xQueue, &dataToSend, portMAX_DELAY); // 发送数据到队列
vTaskDelay(1000 / portTICK_PERIOD_MS); // 任务延时
}
void Task2(void *pvParameters) {
int receivedData;
if (xQueueReceive(xQueue, &receivedData, portMAX_DELAY) == pdPASS) { // 从队列接收数据
printf("Received: %d\n", receivedData);
}
}
int main() {
xQueue = xQueueCreate(10, sizeof(int)); // 创建一个队列
xTaskCreate(Task1, "Task1", 1000, NULL, 1, NULL);
xTaskCreate(Task2, "Task2", 1000, NULL, 1, NULL);
vTaskStartScheduler(); // 启动调度器
return 0;
}
信号量
信号量用于任务间的同步,而不是数据传输。信号量可以用于防止多个任务同时访问共享资源(如临界区),从而避免数据竞争。
- 二值信号量 (Binary Semaphore):用于简单的任务同步,比如两个任务之间的信号通知。
- 计数信号量 (Counting Semaphore):用于实现多个资源的访问控制,比如多个任务访问同一个有限的共享资源。
- 用法:使用
xSemaphoreGive()
释放信号量,xSemaphoreTake()
获取信号量。