如此简单代码,竟会出错!
在编写通讯相关程序时必须把浮点数传递给通讯缓存区,C 代码如下:
byte * buffer=p;
float print_position[MAX_N]
....
....
for (int idx = 0; idx < MAX_N; idx++)
{
*(float *)buffer = print_position[idx] ;
buffer += 4;
}
以上代码看起来没问题,测试也貌似正常,但是在运行时会偶尔会进入:void HardFault_Handler(void), 花费几个小时发现问题。
查看反汇编代码发现采用了硬件浮点单元 S0 ,VSTR s0, [r4,#0x00]
*(float *)buffer = print_position[idx] ; 编译为:
ADD r1,sp,#0x18
ADD r1,r1,r0,LSL #2
VLDR s0,[r1,#0x00]
VSTR s0,[r4,#0x00]
STM32F4xxx 要求浮点数必须放在4对齐位置,但是通讯电文一般是紧凑形式,由于上下文的差异,不能保证每次buffer 都是4 对齐。没有对齐时
VSTR s0,[r4,#0x00] 就崩溃。
原来如此!