FreeRTOS(Free Real-Time Operating System)是一个开源的嵌入式实时操作系统,提供了多线程、任务调度、同步机制等功能。队列是FreeRTOS中的一个重要功能,用于实现任务间的通信和数据传输。
队列是一种先进先出(FIFO)的数据结构,FreeRTOS中的队列可以存储任意类型的数据,包括整型、字符型、结构体等。队列可以在不同的任务之间进行数据传输,发送任务将数据发送到队列中,接收任务从队列中取出数据。
FreeRTOS的队列有以下特点:
1. 队列是线程安全的:FreeRTOS使用互斥量或信号量等同步机制来保证多个任务对队列的并发访问安全。
2. 队列支持阻塞操作:发送任务在队列已满时可以阻塞,接收任务在队列为空时可以阻塞,以避免空轮询的开销。
3. 队列支持优先级:FreeRTOS的任务可以设置优先级,队列中的数据发送和接收可以根据任务的优先级进行调度。
4. 队列可以作为消息传递的机制:通过队列,任务之间可以传递消息,实现任务之间的通信。
使用FreeRTOS的队列可以方便地实现任务之间的数据传输和同步操作,提高系统的并发性和实时性。在嵌入式系统中,队列常被用于线程间的消息传递、事件处理等场景。
队列使用的基本步骤
1. 头文件引用
#include "FreeRTOS.h"
#include "queue.h"
2.声明
#define QUEUE_LENGTH 5
#define QUEUEITEM_SIZE sizeof(int)
//定义队列
QueueHandle_t xQueue1,xQueue2,xQueue3,xQueue4;//Key Debug TimerSwitch LVGL
3.main函数
int main(void)
{
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
bsp_Init();
/* 创建开始任务 */
xTaskCreate((TaskFunction_t )start_task,
(const char* )"start_task",
(uint16_t )START_STK_SIZE,
(void* )NULL,
(UBaseType_t )START_TASK_PRIO,
(TaskHandle_t* )&StartTask_Handler);
xQueue1=xQueueCreate(QUEUE_LENGTH,QUEUEITEM_SIZE);
xQueue2=xQueueCreate(QUEUE_LENGTH,QUEUEITEM_SIZE);
xQueue3=xQueueCreate(QUEUE_LENGTH,QUEUEITEM_SIZE);
xQueue4=xQueueCreate(QUEUE_LENGTH,QUEUEITEM_SIZE);
/* 开启任务调度器 */
vTaskStartScheduler();
}
4.两种基本调用
接收
xQueueReceive(xQueue1,&key_value,portMAX_DELAY);
发送
xQueueSend(xQueue1,&key_value,portMAX_DELAY);
FreeRTOS的实时性得到了体现,只有当按键按下,发送按键值,接收那一边的任务才会执行接收语句后面的内容
在portmacro.h中可以看到portMAX_DELAY的值
这个值有时候可以是0,比如你希望每次扫描而不是不执行后面的内容。