当我运行我的程序时,它只计算一个正弦波:
for(i = 0; i < ADS1299_SIGNAL_WINDOW; i++){
TEST[i] = (float32_t)(10.0f * (float32_t)(arm_sin_f32((float32_t)(3.14f * i/ADS1299_SIGNAL_WINDOW))));
}
编译器生成以下行,导致硬错误:
800702a: ed2d 8b04 vpush {d8-d9}
发生了什么事?作为引用,这里是我的编译器标志:
SETTINGS="-g -nostartfiles -mthumb -mthumb-interwork -march=armv7e-m -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -fsingle-precision-constant -fdata-sections -ffunction-sections -O3 -Wl,-T,../STM32F407VG_FLASH.ld"
DECLARE="-DARM_MATH_CM4 -D__FPU_PRESENT=1 -D__FPU_USED"
.... -larm_cortexM4lf_math
最佳答案
问题是您在同一范围内同时执行 CPACR 启用、和一些浮点运算。因为 main
中的代码使用浮点寄存器,编译器(行为良好并尊重 ABI)将发出代码以在进入 main
时保留这些寄存器。 在 main
中的任何其他代码执行之前。包括对 CAPCR 的写入,这使得它们可以访问。糟糕。
为避免这种情况,要么在重置处理程序中之前进入 main 的 CPACR 中启用 FP(如果您的工具链允许),要么简单地在另一个函数中执行所有 FP 操作,并确保 main
本身不接触任何 FP 寄存器。
确保您有一个 DSB 也是明智的(如果您还没有的话); CPACR 写入后的 ISB
同步序列。否则,您可能仍然会从管道中已有的任何陈旧的 FP 指令中得到错误。
关于gcc - ARM Cortex M4 硬故障 - float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27116011/