stm32f4硬故障处理程序-需要调试建议

stm32f4硬故障处理程序-需要调试建议,stm32,iar,stm32f4,Stm32,Iar,Stm32f4,我正在使用IAR Embedded Workbench开发一个基于stm32f4discovery board的项目(尽管我非常接近免费版本的32kb限制,所以我必须很快找到其他东西)。这对我来说是一个学习项目,到目前为止,我已经能够通过一些谷歌搜索和大量的尝试和错误来解决我的大部分问题。但这是我第一次遇到一个运行时错误,它似乎不是由我的逻辑问题引起的,我非常困惑。欢迎提供任何常规调试策略建议 下面是发生的情况。我有一个按钮被打断;每次按下按钮时,回调函数都会运行stm32f4xx\u it.c

我正在使用IAR Embedded Workbench开发一个基于stm32f4discovery board的项目(尽管我非常接近免费版本的32kb限制,所以我必须很快找到其他东西)。这对我来说是一个学习项目,到目前为止,我已经能够通过一些谷歌搜索和大量的尝试和错误来解决我的大部分问题。但这是我第一次遇到一个运行时错误,它似乎不是由我的逻辑问题引起的,我非常困惑。欢迎提供任何常规调试策略建议

下面是发生的情况。我有一个按钮被打断;每次按下按钮时,回调函数都会运行
stm32f4xx\u it.c
中定义的my
void cal\u acc(uint16\u t*data)
函数。此函数收集一些数据,在第6次按下时,它调用my
void gn(float32_t*data,float32_t*beta)
函数。最后,调用两个函数,
gn_resids
gn_jacobian
。这些功能在结构上非常相似。两者都接受指向3个浮点数组的3个指针,然后基于后两个修改第一个数组的值。不幸的是,当第二个函数
gn_jacobian
退出时,我得到了硬故障

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

多谢各位!我很感激你能给我的任何建议或指导

-本

下面可能有帮助的其他信息:

在调试模式下运行时,我可以单步进入函数并逐个单击运行所有行,一切正常。但是,当我运行最后一行并且它应该退出并转到调用它的函数中的下一行时,它崩溃了。我也尝试过围绕这个函数重新安排调用顺序,但总是这个函数崩溃

当一个输入指针指向一个未定义为“静态”的数组时,我在第一个函数
gn_resids
上遇到了类似的崩溃。但是现在所有的数组都是静态的,我很困惑——特别是因为我无法区分有效的
gn_resids
函数和无效的
gn_jacobian
函数之间有什么不同

acc1beta
main.c
开头声明为浮点数组,然后在
stm32f4xx\u it.c
顶部声明为extern
float32\u t acc1beta[6]
。我希望它是一个全局变量;也许有更好的方法可以做到这一点,但到目前为止,许多其他变量都是用同样的方法定义的

下面是我在调试期间(暂停会话后)崩溃时看到的屏幕截图

编辑:我将gn_步骤的代码更改为测试的类似代码,这样它只运行gn_resids两次,当它到达第二个调用时就会崩溃-我甚至无法进入它。格努雅可比不是问题所在

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);

Cortex M设备上的硬故障可由各种错误条件产生,例如:

  • 访问有效内存之外的数据
  • 无效指令
  • 除零
通过查看一些处理器寄存器,可以收集有关硬故障源的信息。IAR提供了一个调试器宏,有助于自动化该过程。它可以在IAR安装目录
arm\config\debugger\arm\vector\u catch.mac
中找到。有关使用此宏的详细信息,请参阅此


根据程序中发生的硬故障类型,您应该尝试缩小调试器中的根本原因。

看起来像是堆栈溢出。您的
数据
bss
段有多大,崩溃前堆栈指针的值是多少?我已经解决了这个问题,但我不完全确定如何解决。首先,我增加了堆栈大小(从0x400增加到0x1200)来测试您的理论,这允许它进一步进入执行,以便我可以找到一些其他问题并修复它们(我的逻辑错误)。所以现在一切都如我所愿。但我回去查看了堆栈大小设置,不知怎的,它被重置为0x400。但一切仍然正常…由于逻辑错误,我在将值设置为NAN时遇到了一些问题。也许这些错误导致了堆栈溢出,现在它们已经修复,我不再需要更大的堆栈了?这有意义吗?无论如何,谢谢你的帮助!我知道它是怎么复位的。我在某个时候用STM32CubeMX重新生成了代码,这改变了设置。谢谢你的建议。我可以通过其他方式解决这个问题,但下次遇到类似问题时,我一定会记住你说的话!