请选择 进入手机版 | 继续访问电脑版

安富莱电子论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1692|回复: 8
收起左侧

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

[复制链接]

1

主题

5

帖子

1

积分

新手上路

积分
1
发表于 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
回复

使用道具 举报

5391

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

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

建议做个简单的工程测试下你的这个功能。
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

1

主题

5

帖子

1

积分

新手上路

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

使用道具 举报

1

主题

5

帖子

1

积分

新手上路

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

使用道具 举报

5391

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
43672
QQ
发表于 2017-5-5 16:41:34 | 显示全部楼层
从我们这个里面下载一个消息邮箱的例子,简单测试下应用,如果测试不通过,估计是你的工程配置有问题。
http://forum.armfly.com/forum.php?mod=viewthread&tid=14837
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

1

主题

5

帖子

1

积分

新手上路

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

回 eric2013 的帖子

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

使用道具 举报

1

主题

5

帖子

1

积分

新手上路

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

使用道具 举报

19

主题

66

帖子

104

积分

初级会员

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

使用道具 举报

45

主题

572

帖子

662

积分

金牌会员

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

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|安富莱电子论坛 ( 鄂ICP备09023347号,公安机关备案号42010602000201 )

GMT+8, 2019-3-19 23:08 , Processed in 0.196150 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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