有谁遇到过四字节转浮点数导致程序卡死
例如想把uint8_t数组rxbuffer的2、3、 4、 5四个字节组合成一个float数float a = *((float *)(rxbuffer+2));
如果rxbuffer数组是全局变量,程序就会卡死
如果新创建一个局部变量数组rxbuffer2,把rxbuffer的数据赋值过去,就没有问题
float a = *((float *)(rxbuffer2+2));
有大佬知道是什么原因吗? 没有对齐吧 字节对齐问题,M0内核? 也就是地址没有四字节对齐,访问就出现Hardfault PPS 发表于 2024-9-25 22:08
也就是地址没有四字节对齐,访问就出现Hardfault
(引用自4楼)
感觉应该就是这个原因 NFYG2022 发表于 2024-9-25 22:13
感觉应该就是这个原因
(引用自5楼)
就是了。对齐问题跟你数组是局部还是全局无关,只跟它前面是啥有关。你要从偏移2开始,所以如果这个数组原来是对齐的,实际访问的就不齐了。如果原来刚好是4N+2地址开始的,你实际访问的就是正确对齐的。
不要依赖这一点,正规写法就是用memcpy从这个字节数组拷到一个float变量即可。 redroof 发表于 2024-9-25 22:26
就是了。对齐问题跟你数组是局部还是全局无关,只跟它前面是啥有关。你要从偏移2开始,所以如果这个数组 ...
(引用自6楼)
高{:handshake:} float 和拆 合一般用共用体比较省事 共用体不香么
最高效最省事的做法 一直共同体的飘过 变量定义补加这个 __attribute__((aligned(4)))就可以解决问题了
char __attribute__((aligned(4))) rxbuffer; dswkl11 发表于 2024-9-27 17:48
变量定义补加这个 __attribute__((aligned(4)))就可以解决问题了
char __attribute__((aligned(4))) rxbu ...
(引用自11楼)
你这个只能保证首字节对齐,后面的还是不行。 字节不对齐就这样,再申明一个u32类型,先用memcpy将数组中的4字节复制到这个u32类型中,再将u32强制转换为flaot即可.
页:
[1]