我正在使用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
以下可能有用的额外信息:
在调试模式下运行,我可以进入该功能并通过点击一直运行所有行,就可以了。但是一旦我运行最后一行并且它应该退出并移动到调用它的函数中的下一行,它就会崩溃。我也尝试重新排列这个函数周围的调用顺序,它总是崩溃。
当其中一个输入指针指向未定义为“静态”的数组时,我在第一个函数gn_resids
上遇到了类似的崩溃。但是现在所有的数组都是静态的,我很困惑 - 尤其是因为我无法分辨出有效的gn_resids
函数和不起作用的gn_jacobian
函数之间的区别。
acc1beta
在main.c
的开头被宣布为浮点阵,然后在float32_t acc1beta[6]
的顶部被称为外部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);
Cortex M设备上的硬故障可以通过各种错误条件生成,例如:
通过查看一些处理器寄存器,可以收集有关硬故障源的信息。 IAR提供了一个调试器宏,有助于自动执行该过程。它可以在IAR安装目录arm\config\debugger\ARM\vector_catch.mac
中找到。有关使用此宏的详细信息,请参阅此IAR Technical Note on Debugging Hardfaults。
根据程序中出现的硬件类型,您应该尝试缩小调试器中的根本原因。