给出一个示例演示freertos任务间如何进行通信,C语言展示
时间: 2023-07-31 10:13:05 浏览: 43
在 FreeRTOS 中,任务间的通信可以通过任务间的消息传递来实现。下面是一个示例代码,展示了如何在两个任务之间进行通信:
```c
#include <stdio.h>
#include <stdlib.h>
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#define QUEUE_SIZE 5
#define MESSAGE_LENGTH 20
QueueHandle_t xQueue;
void senderTask(void* pvParameters) {
char message[MESSAGE_LENGTH] = "Hello from Sender!";
while(1) {
if(xQueueSend(xQueue, (void*)message, 0) == pdPASS) {
printf("Sender: Message sent\n");
}
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
void receiverTask(void* pvParameters) {
char receivedMessage[MESSAGE_LENGTH];
while(1) {
if(xQueueReceive(xQueue, (void*)receivedMessage, portMAX_DELAY) == pdPASS) {
printf("Receiver: Message received - %s\n", receivedMessage);
}
}
}
int main(void) {
xQueue = xQueueCreate(QUEUE_SIZE, sizeof(char[MESSAGE_LENGTH]));
if(xQueue != NULL) {
xTaskCreate(senderTask, "Sender", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(receiverTask, "Receiver", configMINIMAL_STACK_SIZE, NULL, 2, NULL);
vTaskStartScheduler();
}
return 0;
}
```
在上面的代码中,我们首先创建了一个队列 `xQueue`,用于在任务之间传递消息。然后,我们创建了两个任务 `senderTask` 和 `receiverTask`。
`senderTask` 任务会定期发送消息到队列中,通过调用 `xQueueSend` 函数来发送消息。如果发送成功,则打印出相应的消息。
`receiverTask` 任务会持续地接收队列中的消息,通过调用 `xQueueReceive` 函数来接收消息。如果接收成功,则打印出相应的消息。
在 `main` 函数中,我们创建了两个任务,并启动 FreeRTOS 调度器。
当运行上述代码时,`senderTask` 会定期发送消息到队列中,而 `receiverTask` 则会持续地从队列中接收消息,并将其打印出来。这样,就实现了两个任务之间的通信。