NFYG2022 发表于 2024-9-25 21:55:55

有谁遇到过四字节转浮点数导致程序卡死

例如想把uint8_t数组rxbuffer的2、3、 4、 5四个字节组合成一个float数

float a = *((float *)(rxbuffer+2));

如果rxbuffer数组是全局变量,程序就会卡死
如果新创建一个局部变量数组rxbuffer2,把rxbuffer的数据赋值过去,就没有问题

float a = *((float *)(rxbuffer2+2));

有大佬知道是什么原因吗?

lindabell 发表于 2024-9-25 21:59:03

没有对齐吧

PPS 发表于 2024-9-25 21:59:36

字节对齐问题,M0内核?

PPS 发表于 2024-9-25 22:08:45

也就是地址没有四字节对齐,访问就出现Hardfault

NFYG2022 发表于 2024-9-25 22:13:56

PPS 发表于 2024-9-25 22:08
也就是地址没有四字节对齐,访问就出现Hardfault
(引用自4楼)

感觉应该就是这个原因

redroof 发表于 2024-9-25 22:26:22

NFYG2022 发表于 2024-9-25 22:13
感觉应该就是这个原因
(引用自5楼)

就是了。对齐问题跟你数组是局部还是全局无关,只跟它前面是啥有关。你要从偏移2开始,所以如果这个数组原来是对齐的,实际访问的就不齐了。如果原来刚好是4N+2地址开始的,你实际访问的就是正确对齐的。
不要依赖这一点,正规写法就是用memcpy从这个字节数组拷到一个float变量即可。

NFYG2022 发表于 2024-9-25 22:28:09

redroof 发表于 2024-9-25 22:26
就是了。对齐问题跟你数组是局部还是全局无关,只跟它前面是啥有关。你要从偏移2开始,所以如果这个数组 ...
(引用自6楼)

高{:handshake:}

zyw19987 发表于 6 天前

float 和拆 合一般用共用体比较省事

lb0857 发表于 6 天前

共用体不香么
最高效最省事的做法

d__xin 发表于 6 天前

一直共同体的飘过

dswkl11 发表于 6 天前

变量定义补加这个 __attribute__((aligned(4)))就可以解决问题了
char __attribute__((aligned(4))) rxbuffer;

hexenzhou 发表于 4 天前

dswkl11 发表于 2024-9-27 17:48
变量定义补加这个 __attribute__((aligned(4)))就可以解决问题了
char __attribute__((aligned(4))) rxbu ...
(引用自11楼)

你这个只能保证首字节对齐,后面的还是不行。

yuyu87 发表于 4 天前

字节不对齐就这样,再申明一个u32类型,先用memcpy将数组中的4字节复制到这个u32类型中,再将u32强制转换为flaot即可.
页: [1]
查看完整版本: 有谁遇到过四字节转浮点数导致程序卡死