打印
[MM32软件]

FreeRTOS-消息队列的使用

[复制链接]
1424|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aoyi|  楼主 | 2023-11-9 16:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. 定义队列传输的内容和队列结构体对象
使用 xQueueHandle结构体创建对象

typedef struct
{
    u8   TaskNum;
    u8   Cmd;
    u8 * buf;
}QueueObject_t;

xQueueHandle xQueue = NULL;


2. 调用xQueueCreate API创建队列
xQueueCreate()函数:用于创建一个消息队列。

QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );

参数说明:
uxQueueLength:        消息队列的长度,即可以存放多少个元素。
uxItemSize:        每个元素的大小,以字节为单位。

返回值:
QueueHandle_t类型的指针,代表创建的消息队列。若创建失败,则返回NULL。


创建xQueue队列

xQueue = xQueueCreate(20, sizeof(QueueObject_t));


3. 在任务中调用API获取队列消息
xQueueReceive()函数:用于接收消息队列中的数据。

BaseType_t xQueueReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait );

参数说明:
xQueue:需要接收数据的消息队列。
pvBuffer:用于存放接收到的数据的内存地址。
xTicksToWait:在未接收到数据时等待的时间。若设置为0,则表示不等待;若设置为portMAX_DELAY则表示无限等待。

返回值:
若接收到数据,则返回pdPASS(1);否则,返回errQUEUE_EMPTY。


接收队列消息

void Process_Task(void *pvParameters)
{
    const TickType_t xMaxBlockTime = pdMS_TO_TICKS(200);
    BaseType_t xResult = pdFALSE;
    QueueObject_t xQueueObject = {0};
    while (1)
    {
        xResult = xQueueReceive(xcQueue, (void *)&xQueueObject , xMaxBlockTime);
        if (pdPASS == xResult)
        {
            /* 接收到的数据保存在xQueueObject 结构体对象里面 */   
        }
    }
}




4. 调用API向队列发送数据
xQueueSend()函数:用于向消息队列中发送数据。

BaseType_t xQueueSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait );

参数说明:
xQueue:需要发送数据的消息队列。
pvItemToQueue:待发送的数据的内存地址。
xTicksToWait:在消息队列已满时等待的时间。若设置为0,则表示不等待;若设置为portMAX_DELAY则表示无限等待。

返回值:
若发送成功,则返回pdPASS(1);否则,返回errQUEUE_FULL。


向队列中发送数据
传递数据时需注意,Queuebject.buf 指针必须指向一个已分配内存地址的空间,不能传递野指针

void SendxQueue(void)
{
        u8 buf[10]={1,2,3};
        Queueject_t Queuebject = {0};
        Queuebject.TaskNum = 0x11;
        Queuebject.Cmd = 0x01;
        Queuebject.buf = (u8 *)&buf;
        xQueueSend(xQueue, (void *)&xCommObject, pdMS_TO_TICKS(10));
}


5. 完整示例
//定义消息体的数据结构
typedef struct
{
    u8   TaskNum;
    u8   Cmd;
    u8 * buf;
}QueueObject_t;

//创建消息队列的对象
xQueueHandle xQueue = NULL;

//获取消息队列数据
void Process_Task(void *pvParameters)
{
    const TickType_t xMaxBlockTime = pdMS_TO_TICKS(200);
    BaseType_t xResult = pdFALSE;
    QueueObject_t xQueueObject = {0};
    while (1)
    {
        xResult = xQueueReceive(xcQueue, (void *)&xQueueObject , xMaxBlockTime);
        if (pdPASS == xResult)
        {
            /* 接收到的数据保存在xQueueObject 结构体对象里面 */   
        }
    }
}

//向消息队列发送数据
void SendxQueue(void)
{
        u8 buf[10]={1,2,3};
        Queueject_t Queuebject = {0};
        Queuebject.TaskNum = 0x11;
        Queuebject.Cmd = 0x01;
        Queuebject.buf = (u8 *)&buf;
        xQueueSend(xQueue, (void *)&xCommObject, pdMS_TO_TICKS(10));
}

————————————————
版权声明:本文为CSDN博主「图南楠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41975640/article/details/134181274

使用特权

评论回复
沙发
chenjun89| | 2023-11-9 23:27 | 只看该作者
已放弃freertos,转战RTTread了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

3306

帖子

3

粉丝