硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1851|回复: 5
收起左侧

字节指针 强制转 (uint32*)指针,数据会不会丢?

[复制链接]

41

主题

112

回帖

235

积分

高级会员

积分
235
发表于 2020-11-5 16:16:01 | 显示全部楼层 |阅读模式
1,代码有一处需要类型强制转换:
unsigned char* data;
unsigned int* p;
p = (uint32*)data;

这段代码要把字节型指针转换成整型指针。对于32位的系统,默认4字节对齐的话,可能会发生异常。因为data不一定在4字节的边界上。

据说有些CPU会自动转换成4字节对齐,造成读取数据效率低下;然而有些系统会直接报错。有什么办法能解决这个问题呢?

2,stm32,如果定义一个大数组,char aaa[1000]; 默认是几个字节对齐?还是与编译器有关?


谢谢!


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2020-11-6 02:10:22 | 显示全部楼层
1、对于CM内核来说,指针变量一定是4字节对齐的,如果你想表达的是data指向的存储单元不是四节对齐的,
这个更不用担心,CM内核支持非对齐访问。

2、MDK中全局变量的数据对齐问题说明
http://www.armbbs.cn/forum.php?m ... 3511&fromuid=58
(出处: 硬汉嵌入式论坛)


回复

使用道具 举报

210

主题

1043

回帖

1683

积分

至尊会员

More we do, more we can do.

积分
1683
发表于 2020-11-9 18:40:55 | 显示全部楼层
1.  M3以上核支持不对齐访问,我目前用的M0(不支持),我会用静态检查工具检查这类问题,当然平时也会可以扼杀这类问题的可能性,轮不到工具检查
2.  单字节数组随链接器分配的,没有对齐要求,与编译器无关
回复

使用道具 举报

41

主题

112

回帖

235

积分

高级会员

积分
235
 楼主| 发表于 2020-11-10 09:15:28 | 显示全部楼层
eric2013 发表于 2020-11-6 02:10
1、对于CM内核来说,指针变量一定是4字节对齐的,如果你想表达的是data指向的存储单元不是四节对齐的,
这 ...

谢谢!再举个例子:
char aaa[1024];
unsigned int * bbb=(unsigned int *) aaa;

stm32里,用bbb指针访问这1024的空间,会不会出现丢数据或数据错位呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2020-11-11 08:50:57 | 显示全部楼层
bear_yh 发表于 2020-11-10 09:15
谢谢!再举个例子:
char aaa[1024];
unsigned int * bbb=(unsigned int *) aaa;

没问题。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2020-11-11 16:56:29 | 显示全部楼层
我也碰到过类似的问题,给你一个解决方案。 使用union结构即可。
typedef union {
    float ffff;
    char cccc[4];
    uint8_t iiii[4];
} UserFtoCtoI;    //联合体,方便整形和浮点转换。

你可以用这个新的类型定一个变量,然后随便转换成不同格式的。必然是4字节对齐的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 12:31 , Processed in 0.272017 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表