硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2424|回复: 4
收起左侧

[RL-RTX] RTX5中消息邮箱出现的坑

[复制链接]

12

主题

153

回帖

204

积分

高级会员

积分
204
发表于 2021-7-17 23:56:51 | 显示全部楼层 |阅读模式
问题出现在使用静态分配策略初始化消息邮箱的情况中,产生错误的代码如下:
  1. <blockquote><blockquote>#define DEBUG_MAX_MES<span style="white-space:pre">                </span>(256)<span style="white-space:pre">                        </span>//缓存的消息数量·
复制代码
static __ALIGNED(4) uint8_t Message_Buf[DEBUG_MAX_MES*sizeof(Visual_Message)];
static osRtxMessageQueue_t visual_debug_queue_work_buf __QUEUE;
static const osMessageQueueAttr_t        visual_debug_queue_attr={
        .cb_mem=&visual_debug_queue_work_buf,
        .cb_size=sizeof(visual_debug_queue_work_buf),
        .mq_mem=Message_Buf,
        .mq_size=sizeof(Message_Buf),
        .attr_bits=0,
        .name="Visual_Debug_Queue"
};
static osMessageQueueId_t visual_debug_queue=NULL;
//......
//消息邮箱初始化
bool Debug_Message_Init(void){
//....
//出现问题的地方
        visual_debug_queue=osMessageQueueNew(DEBUG_MAX_MES,sizeof(Visual_Message),&visual_debug_queue_attr);
        if(visual_debug_queue==NULL){
                return false;
        }
//....
}

乍一看这个初始化代码好像没什么问题,初始化步骤都是按照手册中要求初始化的,附上手册英文原文:
中文百度翻译版

代码里结构体肯定是32bit对齐的,而且内存大小也满足手册上面的要求,但是实际使用时,根本无法初始化成功。
问题定位
通过苦逼的单步调试中,找到了问题所在,见下图

在rtx_msgqueue.c的255行-256行中,进行了上图的计算,这里的block_size诡异地加上了sizeof(os_message_t)这个结构体,代码后面有对我们预留的缓冲区大小和这个size进行比较,很显然我们上面的代码中缓冲区偏小,因此无法初始化成功。
将上面的代码缓冲区部分修改为:
  1. static __ALIGNED(4) uint8_t Message_Buf[DEBUG_MAX_MES*(sizeof(Visual_Message)+sizeof(osRtxMessageQueue_t ))];
复制代码
代码中osRtxMessageQueue_t与os_message_tc是等效的。
经过上述修改后初始化成功了。
总结
注意RTX5消息邮箱初始化与FreeRTOS的区别。
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2021-7-18 00:00:44 | 显示全部楼层
  1. #define DEBUG_MAX_MES                (256)                        //缓存的消息数量·
  2. #define DEBUG_MES_TASK_STK        (512)                        //调试信息栈容量
  3. #define __QUEUE                        __attribute__((section(".bss.os.msgqueue.cb")))
  4. typedef struct{
  5.         uint8_t* mes;
  6.         uint32_t len;
  7. }Visual_Message;

  8. static __ALIGNED(4) uint8_t Message_Buf[DEBUG_MAX_MES*sizeof(Visual_Message)];
  9. static osRtxMessageQueue_t visual_debug_queue_work_buf __QUEUE;
  10. static const osMessageQueueAttr_t        visual_debug_queue_attr={
  11.         .cb_mem=&visual_debug_queue_work_buf,
  12.         .cb_size=sizeof(visual_debug_queue_work_buf),
  13.         .mq_mem=Message_Buf,
  14.         .mq_size=sizeof(Message_Buf),
  15.         .attr_bits=0,
  16.         .name="Visual_Debug_Queue"
  17. };
  18. static osMessageQueueId_t visual_debug_queue=NULL;
  19. //...
  20. //...
  21. //初始化消息邮箱
  22. bool Visual_Debug_Init(void){
  23. //...
  24. //问题代码处
  25.         visual_debug_queue=osMessageQueueNew(DEBUG_MAX_MES,sizeof(Visual_Message),&visual_debug_queue_attr);
  26.         if(visual_debug_queue==NULL){
  27.                 return false;
  28.         }
  29. //...

  30. }
复制代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2021-7-19 00:32:31 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2021-7-19 13:30:53 | 显示全部楼层
另外更正一下,osRtxMessage_t与os_message_t是等效的,原文写成了osRtxMessageQueue_t与os_message_tc是等效的,抱歉。
回复

使用道具 举报

12

主题

153

回帖

204

积分

高级会员

积分
204
 楼主| 发表于 2021-7-27 21:44:01 | 显示全部楼层
也可以通过内置的宏定义osRtxMessageQueueMemSize计算所需内存大小
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-8 06:10 , Processed in 0.212546 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表