【发布时间】:2020-01-28 05:55:54
【问题描述】:
为什么这段代码会导致硬故障并跳入无限循环?
#include <stdint.h>
#include <math.h>
void myfunc()
{
const double val = 1;
double log_res = log2(val); // <----- THIS CAUSES A FAULT
//double log_res = log2(1); // This works
}
当我将 evil 行中的 val 替换为硬编码的 1 时,代码有效。所以只有当我将val 传递给log2 时才会出现问题(如代码所示)。为什么会这样?
我正在使用带有 STM32F429ZI MCU 的 STM32CubeIDE(基于 eclipse)。
更新:
在反汇编窗口中检查异常表明这是发生了异常:
fffffff9: 执行 MI 命令失败: -数据反汇编 -s 4294967289 -e 4294967429 -- 3 来自调试器后端的错误消息: 无法访问地址 0xffffffffe 的内存
有人知道为什么会这样吗?
更新 2:
在汇编指令中调试:
54 const double val = 1;
08000e0a: mov.w r3, #0
08000e0e: ldr r4, [pc, #64] ; (0x8000e50 <myfunc+88>)
08000e10: strd r3, r4, [r7, #16]
55 double log_res = log2(val);
08000e14: vldr d0, [r7, #16] // <------ X THIS LINE CAUSES THE PROBLEM X
08000e18: bl 0x8002a9c <log>
08000e1c: vmov r0, r1, d0
08000e20: add r3, pc, #36 ; (adr r3, 0x8000e48 <myfunc+80>)
08000e22: ldrd r2, r3, [r3]
08000e26: bl 0x800085c <__divdf3>
强调的行有 d0=0, r7=0x2002ffcc
执行此行后,反汇编程序跳转到WWDG_IRQHandler。
更新 3:
GCC 汇编器选项(不确定这是做什么的):
-mcpu=cortex-m4 -g3 -c -x assembler-with-cpp --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb
GCC 编译器选项:
-mcpu=cortex-m4 -std=gnu11 -g3 -DSTM32F429I_DISC1 -DSTM32 -DSTM32F429ZITx -DSTM32F4 -DDEBUG -DSTM32F429xx -c -I..\Inc -I../Inc/CMSIS/Include -I../Inc/CMSIS/Device/ST/STM32F4xx/Include -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb
GCC 链接器选项:
-mcpu=cortex-m4 -T"C:\Users\mne\STM32CubeIDE\workspace_1.0.0\MyUSB\STM32F429ZITX_FLASH.ld" --specs=nosys.specs -Wl,-Map="${ProjName}.map" -Wl,--gc-sections -static --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -Wl,--start-group -lc -lm -Wl,--end-group
更新4:
问题似乎发生在math.h 的许多功能上,例如fmin.
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
-
你的MCU到底是什么?你的编译器选项是什么?看起来您正在使用 MCU 不支持的双精度指令。
-
@BumsikKim 我正在使用 STM32F429ZI,我不确定如何准确地与您分享我的编译器选项。我在问题中添加了 gcc 命令行选项,希望这就是您所需要的。
-
如果您使用优化,编译器可能会为您折叠常量,甚至可能会调用
log2。constexpr double first_set或static const也可能有效。您肯定会希望将它用于您的生产代码。 -
你有
-mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb作为汇编程序而不是编译器选项的原因吗?
标签: c arm stm32 stm32f4 stm32cubeide