我正在使用IAR Embedded Workbench开发基于stm32f4discovery板的项目(虽然我非常接近免费版本的32kb限制,所以我很快就会找到别的东西)。这对我来说是一个学习项目,到目前为止,我已经能够通过一些谷歌搜索和大量的试错来解决我的大多数问题。但这是我第一次遇到运行时错误,这个错误似乎不是由我的逻辑问题引起的,而且我很困难。欢迎任何一般的调试策略建议。
所以这里发生了什么。我有一个按钮中断;每次按下按钮,回调函数都会运行void cal_acc(uint16_t* data)
中定义的stm32f4xx_it.c
函数。此函数收集一些数据,并在第6次按下时调用我的void gn(float32_t* data, float32_t* beta)
函数。最终,调用了两个函数gn_resids
和gn_jacobian
。这些功能在结构上非常相似。两者都接受3个浮点数组的3个指针,然后根据后两个修改第一个数组的值。不幸的是,当第二个函数gn_jacobian
退出时,我得到了HardFault。
请查看链接(code structure)以获取显示程序如何运行故障的图片。
非常感谢!我感谢您给我的任何建议或指导,
-Ben
以下可能有用的额外信息:
在调试模式下运行,我可以进入该功能并点击所有行点击它就可以了。但是一旦我运行最后一行并且它应该退出并移动到调用它的函数中的下一行,它就会崩溃。我也尝试重新排列这个函数周围的调用顺序,它总是崩溃。
当其中一个输入指针指向未定义为" static"的数组时,我在第一个函数gn_resids
上遇到了类似的崩溃。但是现在所有的数组都是静态的,我很困惑 - 特别是因为我无法分辨工作的gn_resids
函数和不起作用的gn_jacobian
函数之间的区别
acc1beta
在main.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);
答案 0 :(得分:1)
Cortex M设备上的硬故障可以通过各种错误条件生成,例如:
通过查看某些处理器寄存器,可以收集有关硬故障源的信息。 IAR提供了一个调试器宏,有助于自动执行该过程。它可以在IAR安装目录arm\config\debugger\ARM\vector_catch.mac
中找到。有关使用此宏的详细信息,请参阅此IAR Technical Note on Debugging Hardfaults。
根据程序中出现的硬错误的类型,您应该尝试缩小调试器中的根本原因。