stm32f4 HardFault_Handler - 需要调试建议

时间:2018-04-24 01:08:46

标签: stm32 iar stm32f4

我正在使用IAR Embedded Workbench开发基于stm32f4discovery板的项目(虽然我非常接近免费版本的32kb限制,所以我很快就会找到别的东西)。这对我来说是一个学习项目,到目前为止,我已经能够通过一些谷歌搜索和大量的试错来解决我的大多数问题。但这是我第一次遇到运行时错误,这个错误似乎不是由我的逻辑问题引起的,而且我很困难。欢迎任何一般的调试策略建议。

所以这里发生了什么。我有一个按钮中断;每次按下按钮,回调函数都会运行void cal_acc(uint16_t* data)中定义的stm32f4xx_it.c函数。此函数收集一些数据,并在第6次按下时​​调用我的void gn(float32_t* data, float32_t* beta)函数。最终,调用了两个函数gn_residsgn_jacobian。这些功能在结构上非常相似。两者都接受3个浮点数组的3个指针,然后根据后两个修改第一个数组的值。不幸的是,当第二个函数gn_jacobian退出时,我得到了HardFault。

请查看链接(code structure)以获取显示程序如何运行故障的图片。

非常感谢!我感谢您给我的任何建议或指导,

-Ben

以下可能有用的额外信息:

在调试模式下运行,我可以进入该功能并点击所有行点击它就可以了。但是一旦我运行最后一行并且它应该退出并移动到调用它的函数中的下一行,它就会崩溃。我也尝试重新排列这个函数周围的调用顺序,它总是崩溃。

当其中一个输入指针指向未定义为" static"的数组时,我在第一个函数gn_resids上遇到了类似的崩溃。但是现在所有的数组都是静态的,我很困惑 - 特别是因为我无法分辨工作的gn_resids函数和不起作用的gn_jacobian函数之间的区别

acc1betamain.c的开头声明为float数组,然后在float32_t acc1beta[6]的顶部声明为ex stm32f4xx_it.c。我希望它作为一个全局变量;可能有更好的方法可以做到这一点,但到目前为止它已经以同样的方式定义了许多其他变量。

这是我在调试期间崩溃时看到的屏幕截图(暂停会话后)IAR view at crash

编辑:我将gn_step的代码改为看起来像这样,以便它只运行gn_resids两次,一旦它进入第二次调用它就会崩溃 - 我甚至无法进入它。 gn_jacobian不是问题。

void gn_step(float32_t* data, float32_t* beta) {
  static float32_t resids[120];
  gn_resids(resids, data, beta);
  arm_matrix_instance_f32 R;
  arm_mat_init_f32(&R, 120, 1, resids);

//  static float32_t J_f32[720];
//  gn_jacobian(J_f32, data, beta);
  static float32_t J_f32[120];
  gn_resids(J_f32, data, beta);
  arm_matrix_instance_f32 J;
  arm_mat_init_f32(&J, 120, 1, J_f32);

1 个答案:

答案 0 :(得分:1)

Cortex M设备上的硬故障可以通过各种错误条件生成,例如:

  • 访问有效内存之外的数据
  • 无效说明
  • 除以零

通过查看某些处理器寄存器,可以收集有关硬故障源的信息。 IAR提供了一个调试器宏,有助于自动执行该过程。它可以在IAR安装目录arm\config\debugger\ARM\vector_catch.mac中找到。有关使用此宏的详细信息,请参阅此IAR Technical Note on Debugging Hardfaults

根据程序中出现的硬错误的类型,您应该尝试缩小调试器中的根本原因。