|
用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 */
- ...
- [b]os_mbx_init(&key_msgbox, sizeof(key_msgbox)); [/b]
- //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);
- [b]tskid_itv = os_tsk_create(PeriodicTask,12); //按键述的[/b]
- 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版自带的。
|
|