STM32 浮点数传递时HardFault_Handler

博客讲述了在STM32F4设备上,由于浮点数未正确对齐导致的运行时故障。代码中将浮点数写入紧凑的通讯缓存区时,未确保4字节对齐,触发了硬件浮点单元的错误。VSTR指令在非4字节对齐地址执行时崩溃,博主通过检查反汇编代码发现了问题所在。解决方案可能涉及确保浮点数在4字节边界存储或使用软件浮点运算避免硬件异常。
摘要由CSDN通过智能技术生成

如此简单代码,竟会出错!

在编写通讯相关程序时必须把浮点数传递给通讯缓存区,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] 就崩溃。

原来如此!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值