gcc - ARM Cortex M4 硬故障 - float

标签 gcc floating-point arm stm32 stm32f4discovery

当我运行我的程序时,它只计算一个正弦波:

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/

相关文章:

linux - 如何安装特定版本的gcc

java - char c = 一些整数文字可能会编译,但 float f = 一些浮点文字永远不会编译。为什么?

python - 将 32 位 int 值转换为 float

assembly - 什么是添加到ARM汇编指令.W和.N后缀?

assembly - 编译器添加的分支和进位

gcc - 找不到入口符号 _start

gcc - avr-gcc内联汇编: Jump to label with runtime offset

c++ - 在 C++ 中创建对三元运算符结果的 const 引用是否安全?

c - 你如何在c中使用 float 作为指数

assembly - ARM NEON 代码中冒号的含义是什么