freeRTOS:消息队列的简单使用

当使用 FreeRTOS 中的消息队列时,可以按照以下步骤进行操作:

首先,在任务之间创建一个消息队列。可以使用 xQueueCreate() 函数来创建消息队列,并指定队列的长度和每个消息的大小。例如,创建一个最大长度为 5,每个消息大小为 sizeof(uint32_t) 的消息队列:

cpp 复制代码
QueueHandle_t xQueue = xQueueCreate(5, sizeof(uint32_t));

接下来,在发送消息的任务中调用 xQueueSend() 函数将消息发送到消息队列中。该函数接受消息队列句柄、要发送的消息和等待发送的时间(如果队列已满)。例如,发送一个 uint32_t 类型的消息到队列中,并在队列满时等待 10 个 FreeRTOS 时间单位:

cpp 复制代码
uint32_t message = 123;
BaseType_t xStatus = xQueueSend(xQueue, &message, 10);
if (xStatus != pdPASS) {
    // 处理发送失败的情况
}

在接收消息的任务中,调用 xQueueReceive() 函数从消息队列中接收消息。该函数接受消息队列句柄、接收消息的缓冲区以及等待接收的时间(如果队列为空)。例如,接收一个 uint32_t 类型的消息,并在队列为空时等待 10 个 FreeRTOS 时间单位:

cpp 复制代码
uint32_t receivedMessage;
BaseType_t xStatus = xQueueReceive(xQueue, &receivedMessage, 10);
if (xStatus == pdPASS) {
    // 处理接收到的消息
} else {
    // 处理超时或接收失败的情况
}

可以使用 uxQueueMessagesWaiting() 函数获取当前在消息队列中的消息数量。例如,获取消息队列中的消息数量:

cpp 复制代码
unsigned portBASE_TYPE messagesWaiting = uxQueueMessagesWaiting(xQueue);

最后,在不再需要使用消息队列时,可以调用 vQueueDelete() 函数删除消息队列以释放资源。例如,删除消息队列:

cpp 复制代码
vQueueDelete(xQueue);
相关推荐
hongqi10296 天前
刘火良FreeRTOS内核实现与应用学习之6——多优先级
stm32·学习·freertos
hongqi102912 天前
刘火良FreeRTOS内核实现与应用学习之4——空闲任务与阻塞延时
学习·freertos
xtudj13 天前
项目实战:基于瑞萨RA6M5构建多节点OTA升级-创建工程MCUBoot<二>
单片机·mcu·嵌入式·freertos·uboot·mcuboot·瑞萨renesas
Nav.15 天前
从bootloader跳到APP需要几步?
stm32·单片机·freertos
xtudj22 天前
浅谈分布式多节点嵌入式系统中RS485总线指令冲突解决及性能优化
分布式·嵌入式·freertos·rs485通讯冲突检测·rs485通讯性能优化
集大周杰伦1 个月前
FreeRTOS 任务管理与运行时间统计:API 解析与配置实践
freertos·实时操作系统·嵌入式操作系统·cpu 资源分配检查·任务时间统计
梦可尤曦1 个月前
Freertos卡在while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U )
stm32·嵌入式硬件·cubemx·freertos
集大周杰伦1 个月前
FreeRTOS 源码结构解析与 STM32 HAL 库移植实践(任务创建、删除篇)
stm32·freertos·实时操作系统·嵌入式开发·rtos·任务调度·任务控制块
BW.SU1 个月前
51单片机制作彩屏触摸小电子琴STC32G12K128+RA6809+彩屏1024x600
单片机·嵌入式硬件·51单片机·freertos·stc32g12k128
Zevalin爱灰灰2 个月前
FreeRTOS从入门到精通 第十三章(信号量)
stm32·单片机·嵌入式硬件·操作系统·freertos