消息队列传递结构体指针和结构体异同
-
使用队列传递复合数据类型
接收方接收由多个发送源发送至队列中的消息时,需要判断数据的来源,使用方式:利用队列传递结构体,在结构体中包含数据值和数据来源信息。
typedef struct { int iValue; //数据值 int iMeaning; //数据来源信息 }xData;
-
利用队列传递数据的指针(处理速度更快)
-
指针指向的内存空间所有权必须明确
共享内存在其指针发送到队列之前,其内容只允许被发送任务访问;
共享内存指针从队列中被读出之后,其内容亦只允许被接收任务访问
-
指针指向的内存空间必须有效
指针指向的内存空间是动态分配的,只应该有一个任务对其进行内存释放,当这段内存空间被释放后,就不应该有其他任务再次访问这段空间。
-
//传递结构体的指针
/* 创建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]);
}
传递结构体指针和结构体本身的异同
创建消息队列时,单元大小声明不同
变量初始化不同,一个是定义指针,并所赋结构体实体是全局的,一个是定义结构体
数据输出不同,前者是用指针成员运算符“->”,后者是用结构体成员运算符
在发送消息和请求消息时,两者的格式是相同的,但意义不用,前者传递的是结构体指针的地址,后者传递的是结构体的值
参考链接:https://www.cnblogs.com/yangguang-it/p/7204541.html
FreeRTOS详解,请点击这里