(五)消息队列

一、概念

队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断与任务间传递信息,实现了任务接收来自于其他任务或中断的不定长度信息

二、常用函数

(1)xQueueCreate 创建队列

(2)vQueueDelete 删除队列,删除后所有消息都会被回收不能再使用

(3)xQueueSendxQueueSendToBackxQueueOverwrite 从队列尾部入队

(4)xQueueSendToFront 从队列首部入队

(5)xQueueSendFromISRxQueueSendToBackFromISRxQueueOverwriteFromISR 从队列尾部入队(带中断保护)

(6)xQueueSendToFrontFromISR 从队列首部入队(带中断保护)

(7)xQueueReceive 出队并删除队列项

(8)xQueuePeek 出队不删除队列项

(9)xQueueReceiveFromISR 出队并删除队列项(带中断保护)

(10)xQueuePeekFromISR出队不删除队列项(带中断保护)

三、代码示例

c 复制代码
#include "FreeRTOS.h"
#include "task.h"
#include "led.h"
#include "queue.h"

static void vAppInitTask(void* pParam);
static void task1(void* pParam);
static void task2(void* pParam);

static TaskHandle_t handler1;
static TaskHandle_t handler2;
static TaskHandle_t appHandler;

QueueHandle_t testQueueHandler;

//主函数
int main(void)
{  
    //初始化硬件
    led_init();

    BaseType_t xReturn;
    xReturn = xTaskCreate(vAppInitTask,         //任务函数入口
                        "vAppInitTask",         //任务名称
                        512,                    //任务堆栈大小
                        NULL,                   //传递参数
                        2,                      //任务优先级
                        &appHandler             //任务句柄
                );
    
    if(pdPASS == xReturn){
        vTaskStartScheduler();      //开启任务调度器
    }
    
    while(1);
}

//APP任务
void vAppInitTask(void* pParam)
{
    taskENTER_CRITICAL();//进入临界区
    
    //创建队列
    testQueueHandler = xQueueCreate(4,             //消息队列长度
                                    4               //队列中每个元素的大小
                       );
    if(NULL != testQueueHandler){}
        
    //由于app任务创建成功后便开启了调度器,于是下边创建的任务创建后便会立即执行
    xTaskCreate(task2,           //任务函数入口
            "task2",         //任务名称
            512,                //任务堆栈大小
            NULL,               //传递参数
            2,                  //任务优先级
            &handler2         //任务句柄
            );
    
    xTaskCreate(task1,           //任务函数入口
                "task1",         //任务名称
                512,                //任务堆栈大小
                NULL,               //传递参数
                2,                  //任务优先级
                &handler1         //任务句柄
                );
    
    vTaskDelete(appHandler);
    
    taskEXIT_CRITICAL();//退出临界区
}

//任务1接收队列消息
void task1(void* pParam)
{
    uint32_t recv;
    xQueueReceive(testQueueHandler,&recv,0);
    
    if(recv==1){
        open();
    }
    while(1);
}

//任务2发送消息到队列
void task2(void* pParam)
{
    uint32_t data=1;
    xQueueSend(testQueueHandler,        //队列句柄
                &data,                  //入队数据
                0);                     //等待时间
    while(1);
}
相关推荐
单片机仿真设计9 小时前
【proteus仿真】基于 STM32 单片机恒温箱控制系统设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
新晨单片机设计11 小时前
S003A-基于STM32单片机温度计(数码管显示)【Proteus仿真+Keil程序+原理图】
stm32·单片机·stm32单片机功能定制
一条破秋裤11 小时前
TIM 输入捕获与 PWMI:从边沿到频率、占空比
笔记·stm32·学习
单片机仿真设计12 小时前
【proteus仿真】基于 STM32 的久坐提醒与坐姿矫正器设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
一条破秋裤12 小时前
STM32 学习笔记:PWM 输出比较原理与计算
笔记·stm32·学习
jianqiang.xue12 小时前
ESP-IDF保姆级入门09|ADC模拟量采集全解:电位器调压+光敏传感器+OLED显示,打通模拟→数字全链路
stm32·单片机·物联网·架构·esp32
Freak嵌入式14 小时前
MicroPython+Pico 接收空闲中断和发送空闲中断全实战
java·开发语言·stm32·单片机·嵌入式硬件
LCG元15 小时前
STM32F103 硬件 I2C 通信全流程调试实录:从寄存器配置到总线死锁恢复
stm32·单片机·嵌入式硬件
LCG元15 小时前
STM32L4 ADC+DMA 多通道采集实战:从 CubeMX 配置到 VREFINT 电压校准
stm32·单片机·嵌入式硬件
单片机仿真设计15 小时前
【proteus仿真】基于 STM32 快递运输避障小车设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设