编写一个freertos 队列例程,用于传递两个任务
时间: 2024-11-15 14:24:35 浏览: 1
FreeRTOS移植例程
在FreeRTOS(Real-Time Operating System)环境中编写队列例程,可以有效地在多个任务之间传递数据。FreeRTOS是一个轻量级嵌入式实时操作系统,它支持任务并发和同步机制,如互斥锁、信号量和队列。
下面是一个简单的例子,展示了如何创建一个环形缓冲区(Ring Buffer),即一个FIFO(First In First Out)队列,用于两个任务间的数据交换:
```c
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
// 定义队列的大小
#define QUEUE_SIZE 5
typedef struct {
uint8_t data[QUEUE_SIZE];
uint16_t head;
uint16_t tail;
} RingBuffer;
// 队列初始化函数
void ring_buffer_init(RingBuffer *ring) {
ring->head = 0;
ring->tail = 0;
}
// 数据发送函数,向队列添加数据
static void send_data_to_queue(void *pvParameters) {
RingBuffer *ring = (RingBuffer *)pvParameters;
for (uint16_t i = 0; i < QUEUE_SIZE; ++i) {
// 检查队列是否满
if (ring->tail == (ring->head + 1) % QUEUE_SIZE) {
vTaskDelay(pdMS_TO_TICKS(10)); // 如果满了,先等待一下
} else {
ring->data[ring->tail] = i; // 添加数据
ring->tail = (ring->tail + 1) % QUEUE_SIZE; // 更新尾巴指针
if (xQueueSendToBack(&ring->queue, &ring->data[ring->tail], pdTRUE) != pdPASS) {
// 发送失败,处理异常
vTaskAbort();
}
}
}
vTaskDelete(NULL); // 任务完成后删除自身
}
// 数据接收函数,从队列获取数据
static void receive_data_from_queue(void *pvParameters) {
RingBuffer *ring = (RingBuffer *)pvParameters;
while (1) {
xEventGroupWaitBits(event_group, queue_not_empty, pdFALSE, pdTRUE, portMAX_DELAY);
uint8_t received_data = (ring->data[ring->head]);
ring->head = (ring->head + 1) % QUEUE_SIZE; // 更新头部指针
// 在这里处理接收到的数据...
printf("Received data: %d\n", received_data);
if (ring->head == ring->tail) { // 队列空了
break;
}
}
vTaskDelete(NULL); // 任务结束
}
int main() {
RingBuffer ring;
ring_buffer_init(&ring);
xTaskCreate(send_data_to_queue, "Sender Task", configMINIMAL_STACK_SIZE, &ring, tskIDLE_PRIORITY + 1, NULL);
xTaskCreate(receive_data_from_queue, "Receiver Task", configMINIMAL_STACK_SIZE, &ring, tskIDLE_PRIORITY, NULL);
vTaskStartScheduler(); // 启动调度器
return 0;
}
```
在这个示例中,`send_data_to_queue`任务不断将数据放入队列,而`receive_data_from_queue`任务则从队列读取数据。队列`ring.queue`需要预先通过`xQueueCreate`函数创建。`event_group`用于监控队列状态。
阅读全文