dongshan 发表于 2017-5-5 16:17:55

stm32使用os_mailbox_send进入HardFault的问题,我怀疑是RTX本身的问题。

      用RTX重写了一个项目,代码有一万多行。在调试中发现,只要按键任务一向邮箱发送消息,则芯片就进入HardFault. 这个程序中有10来个任务,其它任务也用到了MailBox,
都是正常的。按键消息与其它消息的区别是:按键消息用消息本身发送按键信息的。 就算我把按键消息也换成动态创建的方式,仍然进入HardFault. 这个HardFault是bus fault
的IMPRESIZERR引起的。
    消息邮箱的声明如下:
os_mbx_declare(key_msgbox,16);

发送消息的代码如下:if (os_mbx_check (&key_msgbox) != 0)
{
    os_mbx_send (&key_msgbox,(void*)bak_key,0);//用消息本身发送消息
}
消息邮箱是在初始化任务中初始化的,初始化任务优先级最高,在创建及初始化完成之后,删除自己:_init_box(eeprom_msg_pool,sizeof(eeprom_msg_pool),sizeof(eeprom_wr_msg_t));
_init_box(disp_msg_pool,sizeof(disp_msg_pool),sizeof(disp_msg_t));

/* init message box */
...
os_mbx_init(&key_msgbox, sizeof(key_msgbox));

//tskid_switch = os_tsk_create(SwitchAtseTask,18);
//tskid_getpower = os_tsk_create_user(GetPowerTask,16,AppTaskMeasureStk,sizeof(AppTaskMeasureStk));
//tskid_monitor = os_tsk_create(MonitorSystemTask,14);

tskid_itv = os_tsk_create(PeriodicTask,12);    //按键述的
tskid_key = os_tsk_create(ProcessKeyTask,10);

//tskid_modbus = os_tsk_create(HandleModbusTask,8);
//tskid_wifi = os_tsk_create(HandleWifiTask,6);
//tskid_disp = os_tsk_create(DisplayTask,4);
//skid_eeprom = os_tsk_create(WriteEepromTask,2);
os_tsk_delete_self();
   即使我把所有无关的任务都关掉,只留下PeriodicTask任务(按键检测的)和按键处理任务,极只要一调用os_mbx_send (&key_msgbox,(void*)bak_key,0);则立马进入HardFault
这说明此异常与其它任务无关,我加大heap,statck的尺寸,仍不能解决,于是我跟踪了汇编代码,发现os_mbx_send调用rt_mbx_send时,在执行rt_mbx_send函数的(此函数源码是mdk自带的)*p_TCB->msg = p_msg;
p_TCB->ret_val = OS_R_MBX;
时出了问题, p_TCB->msg指针值不可思议地为0, 而执行p_TCB->ret_val = OS_R_MBX时, 进入HardFault。任务的TCB相关域出了问题,这部分根本不对用户开放操作的,所以我只有怀疑是RTX 的bug。各位兄弟有什么好想法没有?附图说明一下跟踪汇编代码的情况,不知道我表达清楚没有,这个问题困扰我一天了,我能想到的测试几乎都测试了,现在只有怀疑到RTX的身上了,这个RTX是4.74版自带的。

eric2013 发表于 2017-5-5 16:22:44

简单的收发按键值也能出错?

建议做个简单的工程测试下你的这个功能。

dongshan 发表于 2017-5-5 16:29:22

我把所有的无关的任务都注释掉了,没有创建。 从图片中可以看出,一个是发送,一个是接收任务。正是因为简单,出了问题反而不好找了。 工程中显示消息比这复杂,可以正常使用。

dongshan 发表于 2017-5-5 16:37:04

把所有的无关中断全关掉,只留下一个系统时钟,仍然出现此问题。 现在几乎就相当于测试工程了。

eric2013 发表于 2017-5-5 16:41:34

从我们这个里面下载一个消息邮箱的例子,简单测试下应用,如果测试不通过,估计是你的工程配置有问题。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=14837

dongshan 发表于 2017-5-5 16:46:10

回 eric2013 的帖子

eric2013:从我们这个里面下载一个消息邮箱的例子,简单测试下应用,如果测试不通过,估计是你的工程配置有问题。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=14837 (2017-05-05 16:41) images/back.gif

明天,我单独建立一个工程试一下。

dongshan 发表于 2017-5-6 09:30:56

问题解决了,在这里汇报一下:
今天单独建立了一个测试工程,发现问题仍然存在,由于以前代码量很大,而测试工程代码量极少,所以一眼就发现了问题所在:
在接按键消息的任务的代码如下:
                uint8_t *key,tmpdata;
...
      os_mbx_wait (key_msgbox,(void**)key,0xffff);   

把key改成 &key即可。即写成:os_mbx_wait (key_msgbox,(void**)&key,0xffff);   

记得一个网友说过,在调rtx时,指示的出问题的代码,往往不是真正问题之所在。 这好像我这样,总是在执行os_mbx_send时出错进入hardfault, 没想到是在接收这个消息的代码中os_mbx_wait出了问题。

bucker 发表于 2017-5-21 11:15:52

一万行代码的工程可是不小。

roguebear 发表于 2019-3-15 16:57:17

按通常的经验,这种问题用点灯应该能很快定位,不用去看汇编。。。这种莫名其妙的问题搞定后回来反馈的兄弟要大力支持。

younew 发表于 2019-4-11 21:56:12

记下了,mark!!
页: [1]
查看完整版本: stm32使用os_mailbox_send进入HardFault的问题,我怀疑是RTX本身的问题。