FreeRTOS消息队列 传递结构体指针和结构体异同

消息队列传递结构体指针和结构体异同

  1. 使用队列传递复合数据类型

    接收方接收由多个发送源发送至队列中的消息时,需要判断数据的来源,使用方式:利用队列传递结构体,在结构体中包含数据值和数据来源信息

    typedef struct
    {
        int  iValue;  //数据值
        int iMeaning; //数据来源信息
    }xData;
    
  2. 利用队列传递数据的指针(处理速度更快)

    1. 指针指向的内存空间所有权必须明确

      共享内存在其指针发送到队列之前,其内容只允许被发送任务访问;

      共享内存指针从队列中被读出之后,其内容亦只允许被接收任务访问

    2. 指针指向的内存空间必须有效

      指针指向的内存空间是动态分配的,只应该有一个任务对其进行内存释放,当这段内存空间被释放后,就不应该有其他任务再次访问这段空间。

//传递结构体的指针
/* 创建10个存储指针变量的消息队列,由于CM3/CM4内核是32位机,一个指针变量占用4个字节 */
xQueue2 = xQueueCreate(10, sizeof(struct Msg *));    //单元大小为一个指针变量的大小

//发送消息,实现结构体指针的传递 
MSG_T   *ptMsg;        //MSG_T为结构体声明
ptMsg = &g_tMsg;   /* 初始化结构体指针 */
// 初始化数组 
    ptMsg->ucMessageID = 0;
    ptMsg->ulData[0] = 0;
    ptMsg->usData[0] = 0;
//使用消息队列实现指针变量的传递 
 if(xQueueSend(xQueue2,                  /* 消息队列句柄 */
               (void *) &ptMsg,           // 发送结构体指针变量ptMsg的地址  “&”  取结构体指针的地址,传递指针
               (TickType_t)10) != pdPASS )
     
//接收消息,接收结构体的指针
MSG_T *ptMsg; //定义一个结构体指针
xResult = xQueueReceive(xQueue2,            /* 消息队列句柄 */
                       (void *)&ptMsg,      // 这里获取的是结构体的地址,类似于 char *a="stm";char *b;b=a 指针赋值,a和b指向同一个地址
                       (TickType_t)xMaxBlockTime);/* 设置阻塞时间 */
if(xResult == pdPASS)
            {
                /* 成功接收,并通过串口将数据打印出来 */
                printf("接收到消息队列数据ptMsg->ucMessageID = %d\r\n",ptMsg->ucMessageID);
                printf("接收到消息队列数据ptMsg->ulData[0] = %d\r\n", ptMsg->ulData[0]);
                printf("接收到消息队列数据ptMsg->usData[0] = %d\r\n", ptMsg->usData[0]);
            }     
//传递结构体本身
//创建一个消息队列
xQueue2 = xQueueCreate(10, sizeof(struct Msg));  //单员大小为结构体的大小  

//发送消息,实现结构体的传递 
MSG_T   ptMsg;       //MSG_T为结构体声明
//初始化数组
    ptMsg.ucMessageID = 0;
    ptMsg.ulData[0] = 0;
    ptMsg.usData[0] = 0;
 //使用消息队列实现指针变量的传递
 if(xQueueSend(xQueue2,                  /* 消息队列句柄 */
               (void *) &ptMsg,           // 发送结构体ptMsg的值,将值拷贝至队列中
               (TickType_t)10) != pdPASS )
     
//接收消息,接收结构体的值
MSG_T ptMsg; //定义一个结构体指针
xResult = xQueueReceive(xQueue2,            
                       (void *)&ptMsg,      // 这里获取的是结构体的值
                       (TickType_t)xMaxBlockTime);/* 设置阻塞时间 */

if(xResult == pdPASS)
            {
                /* 成功接收,并通过串口将数据打印出来 */
                printf("接收到消息队列数据ptMsg.ucMessageID = %d\r\n",ptMsg.ucMessageID);
                printf("接收到消息队列数据ptMsg.ulData[0] = %d\r\n", ptMsg.ulData[0]);
                printf("接收到消息队列数据ptMsg.usData[0] = %d\r\n", ptMsg.usData[0]);
            }     

传递结构体指针和结构体本身的异同

  1. 创建消息队列时,单元大小声明不同

  2. 变量初始化不同,一个是定义指针,并所赋结构体实体是全局的,一个是定义结构体

  3. 数据输出不同,前者是用指针成员运算符“->”,后者是用结构体成员运算符

  4. 在发送消息和请求消息时,两者的格式是相同的,但意义不用,前者传递的是结构体指针的地址后者传递的是结构体的值

参考链接:https://www.cnblogs.com/yangguang-it/p/7204541.html
FreeRTOS详解,请点击这里

  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值