嵌入式技术论坛
直播中

张宇

7年用户 1624经验值
私信 关注
[问答]

使用邮箱的时候出现断言问题请问该如何解决

在使用邮箱的时候出现 assertion failed at function:rt_mb_recv 断言问题,用的第一个邮箱是可以运行的,但是第二个邮箱在接受时出错,论坛上说可能是内存溢出,请问如何解决该问题?
定义结构体、创建线程、创建邮箱,启动线程

typedef struct str_mpu_adc {
rt_int16_t accelx;
rt_int16_t accely;
rt_int16_t accelz;
rt_int16_t gyrox;
rt_int16_t gyroy;
rt_int16_t gyroz;
float temp;
rt_uint32_t vol;
} str_mpu_adc_t;
static struct rt_mailbox mpu6050_mb;//创建邮箱名称
static struct str_mpu_adc gfx_mpu;//定义通过邮箱传送的结构体
int mpu6050_adc(void)
{
rt_err_t result = RT_EOK;
/* 初始化mailbox传送mpu6050与adc数据 /
result = rt_mb_init(&mpu6050_mb,
"mpu6050_mb", /
名称是 mpu6050_mb /
&mb_mpu_pool[0], /
邮箱用到的内存池是 mb_mpu_pool /
sizeof(mb_mpu_pool) / 4, /
邮箱中的邮件数目,因为一封邮件占 4 字节 /
RT_IPC_FLAG_PRIO); /
采用 FIFO 方式进行线程等待 */
if (result != RT_EOK)
{
LOG_D("init mpu6050_mb failed.\n");
return -1;
}
//创建pum6050线程
impu6xxx_init = rt_thread_create("impu6xxx_init", impu6_entry, NULL, 2048, 20, 5);
if(impu6xxx_init != RT_NULL)
{
LOG_D("impu6xxx_init successed ...\r\n");
rt_thread_startup(impu6xxx_init);
}
//创建adc线程
adc_in5 = rt_thread_create("adc_in5", adc_in5_entry, NULL, 2048, 20, 5);
if(adc_in5 != RT_NULL)
{
LOG_D("adc_in5 successed ...\r\n");
rt_thread_startup(adc_in5);
}
return RT_EOK;
}
将数写入结构体中,mpu6050的各种参数

gfx_mpu.accelx = accel.x;
      gfx_mpu.accely = accel.y;
      gfx_mpu.accelz = accel.z;
      gfx_mpu.gyrox = gyro.x;
      gfx_mpu.gyroy = gyro.y;
      gfx_mpu.gyroz = gyro.z;
      gfx_mpu.temp = temp;
      gfx_mpu.vol = vol;

发送邮箱

rt_mb_send(&mpu6050_mb,(rt_ubase_t)&gfx_mpu);//发送邮箱,由于使用的是oled库(u8g2),该库是使用C++编写的,所以读取是在另一个.cpp文件读取
oled_display.cpp

//在该文件中读取邮箱的内容
if (rt_mb_recv(&mpu6050_mb, (rt_ubase_t *)&gfx_mpu, RT_WAITING_NO) == RT_EOK)
{
rt_kprintf("accel.x = %4d, accel.y = %4d, accel.z = %4d \r\n", gfx_mpu.accelx,gfx_mpu.accely, gfx_mpu.accelz);
rt_kprintf("gyro.x = %4d gyro.y = %4d, gyro.z = %4d, \r\n",gfx_mpu.gyrox, gfx_mpu.gyroy,gfx_mpu.gyroz);
rt_kprintf("temp = %d.%d\r\n", (int)(gfx_mpu.temp * 100) / 100, (int)(gfx_mpu.temp * 100) % 100);
rt_kprintf("the voltage is :%d.%02d \n", gfx_mpu.vol / 1000, gfx_mpu.vol % 1000);}

出错结果:

1.jpg

回帖(4)

张虎豹

2022-8-24 14:37:11
由于我的发送邮件rt_mb_send 和接受邮件rt_mb_recv不在一个.c文件里,这是产生问题的原因,但是具体原理并不太懂,我的解决办法是将接受邮件和rt_mb_create创建邮件放在同一.c文件里,而发送邮件放在其他.c文件里就可以解决上述问题
举报

张国厚

2022-8-24 14:37:21
你最好把相关代码贴出来,要不然不太好判断哦。或者你自己仔细找找,可能是误传入了空指针。比如你调用rt_mb_recv()函数的线程,运行的比较早,在你创建邮箱之前去读了。
举报

张国厚

2022-8-24 14:37:29
建的邮箱,所以就算没有初始化邮箱,邮箱地址也不是NULL。但里面的内容没有初始化。猜测原因是你在init邮箱前就调用的recv函数。可以尝试在你调用recv函数之前和init之前分别打印一条调试语句,看看哪个先运行的。

    /* parameter check */
    RT_ASSERT(mb != RT_NULL);
    RT_ASSERT(rt_object_get_type(&mb->parent.parent) == RT_Object_Class_MailBox);
举报

张宇

2022-8-24 14:37:43
谢谢!我试一下动态创建邮箱,由于刚学,其中原理还不是太理解,但是根据串口调试,初始化和使用顺序看起来是没错的
1.jpg
举报

更多回帖

发帖
×
20
完善资料,
赚取积分