在使用邮箱的时候出现 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);}
出错结果:
更多回帖