硬汉嵌入式论坛

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

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

[复制链接]

3

主题

20

回帖

29

积分

新手上路

积分
29
发表于 2017-5-5 16:17:55 | 显示全部楼层 |阅读模式
        用RTX重写了一个项目,代码有一万多行。在调试中发现,只要按键任务一向邮箱发送消息,则芯片就进入HardFault. 这个程序中有10来个任务,其它任务也用到了MailBox,
都是正常的
。按键消息与其它消息的区别是:按键消息用消息本身发送按键信息的。 就算我把按键消息也换成动态创建的方式,仍然进入HardFault. 这个HardFault是bus fault
IMPRESIZERR引起的。
    消息邮箱的声明如下:
  1. os_mbx_declare(key_msgbox,16);
复制代码
发送消息的代码如下:
  1. if (os_mbx_check (&key_msgbox) != 0)
  2. {
  3.     os_mbx_send (&key_msgbox,(void*)bak_key,0);  //用消息本身发送消息
  4. }
复制代码
消息邮箱是在初始化任务中初始化的,初始化任务优先级最高,在创建及初始化完成之后,删除自己:
  1. _init_box(eeprom_msg_pool,sizeof(eeprom_msg_pool),sizeof(eeprom_wr_msg_t));
  2. _init_box(disp_msg_pool,sizeof(disp_msg_pool),sizeof(disp_msg_t));
  3. /* init message box */
  4. ...
  5. [b]os_mbx_init(&key_msgbox, sizeof(key_msgbox)); [/b]
  6. //tskid_switch = os_tsk_create(SwitchAtseTask,18);
  7. //tskid_getpower = os_tsk_create_user(GetPowerTask,16,AppTaskMeasureStk,sizeof(AppTaskMeasureStk));
  8. //tskid_monitor = os_tsk_create(MonitorSystemTask,14);
  9. [b]tskid_itv = os_tsk_create(PeriodicTask,12);    //按键述的[/b]
  10. tskid_key = os_tsk_create(ProcessKeyTask,10);
  11. //tskid_modbus = os_tsk_create(HandleModbusTask,8);
  12. //tskid_wifi = os_tsk_create(HandleWifiTask,6);
  13. //tskid_disp = os_tsk_create(DisplayTask,4);
  14. //skid_eeprom = os_tsk_create(WriteEepromTask,2);
  15. 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自带的)
  1. *p_TCB->msg = p_msg;
  2. 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版自带的。
2.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2017-5-5 16:22:44 | 显示全部楼层
简单的收发按键值也能出错?

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

使用道具 举报

3

主题

20

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2017-5-5 16:29:22 | 显示全部楼层
我把所有的无关的任务都注释掉了,没有创建。 从图片中可以看出,一个是发送,一个是接收任务。  正是因为简单,出了问题反而不好找了。 工程中显示消息比这复杂,可以正常使用。
回复

使用道具 举报

3

主题

20

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2017-5-5 16:37:04 | 显示全部楼层
把所有的无关中断全关掉,只留下一个系统时钟,仍然出现此问题。 现在几乎就相当于测试工程了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2017-5-5 16:41:34 | 显示全部楼层
从我们这个里面下载一个消息邮箱的例子,简单测试下应用,如果测试不通过,估计是你的工程配置有问题。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=14837
回复

使用道具 举报

3

主题

20

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2017-5-5 16:46:10 | 显示全部楼层

回 eric2013 的帖子

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

使用道具 举报

3

主题

20

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 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出了问题。
回复

使用道具 举报

20

主题

56

回帖

116

积分

初级会员

积分
116
发表于 2017-5-21 11:15:52 | 显示全部楼层
一万行代码的工程可是不小。
回复

使用道具 举报

56

主题

904

回帖

1072

积分

至尊会员

积分
1072
发表于 2019-3-15 16:57:17 | 显示全部楼层
按通常的经验,这种问题用点灯应该能很快定位,不用去看汇编。。。这种莫名其妙的问题搞定后回来反馈的兄弟要大力支持。
回复

使用道具 举报

10

主题

33

回帖

63

积分

初级会员

积分
63
发表于 2019-4-11 21:56:12 | 显示全部楼层
记下了,mark!!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 12:12 , Processed in 0.191433 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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