FreeRTOS的任务间通信
FreeRTOS提供了一系列的API来实现任务间的通信,主要包括信号量、队列、事件组等。
以下是使用信号量实现任务间通信的例子:
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#define STACK_SIZE 128
#define PRIORITY 1
SemaphoreHandle_t binarySemaphore;
void task1(void *pvParameters);
void task2(void *pvParameters);
int main(void) {
// 创建任务
xTaskCreate(task1, "Task 1", STACK_SIZE, NULL, PRIORITY, NULL);
xTaskCreate(task2, "Task 2", STACK_SIZE, NULL, PRIORITY, NULL);
// 启动任务调度器
vTaskStartScheduler();
return 0;
}
void task1(void *pvParameters) {
for(;;) {
// 等待1s
vTaskDelay(1000 / portTICK_PERIOD_MS);
// 给binarySemaphore发送信号
xSemaphoreGive(binarySemaphore);
}
}
void task2(void *pvParameters) {
for(;;) {
// 等待binarySemaphore信号
xSemaphoreTake(binarySemaphore, portMAX_DELAY);
// 执行任务
// ...
}
}
在这个例子中,我们创建了两个任务task1和task2。task1每隔1秒钟给一个名为binarySemaphore
的二值信号量发送信号,而task2则通过获取这个信号量来同步运行。
请注意,在实际应用中,你需要在FreeRTOS的初始化代码中创建这个二值信号量,例如:
// 创建二值信号量
binarySemaphore = xSemaphoreCreateBinary();
// 初始化信号量
xSemaphoreGive(binarySemaphore);
这样,任务task2在启动时会因为无法获取信号量而阻塞,直到task1发送信号。
评论已关闭