定义一个字节数组,能不能使得数组半字对齐?

[复制链接]
4244|8
 楼主| hwk612167 发表于 2012-11-8 11:41 | 显示全部楼层 |阅读模式
RT,如:unsigned char arr[10];
有什么办法能使得arr的地址为16位对齐?或32位对齐?
试过#pragma pack(2) 不行。
ayb_ice 发表于 2012-11-8 11:44 | 显示全部楼层
这个取决于编译器,MCU内核,8位机总是对齐的
airwill 发表于 2012-11-8 11:54 | 显示全部楼层
不知道有啥意义.
不如就定义 unsigned short arr[10];
8位数据当16位写入没有问题, 读出也可以强制转换的处理
 楼主| hwk612167 发表于 2012-11-8 11:55 | 显示全部楼层
我现在的MCU是16位,小端格式
试过定义:unsigned char arr[10];
              unsigned char arr[11];
都是从奇数地址开始,并不对齐。如果我想对齐,没有办法么?只能定义成unsigned short型数组?
ayb_ice 发表于 2012-11-8 13:36 | 显示全部楼层
我现在的MCU是16位,小端格式
试过定义:unsigned char arr[10];
              unsigned char arr[11];
都是从奇数地址开始,并不对齐。如果我想对齐,没有办法么?只能定义成unsigned short型数组? ...
hwk612167 发表于 2012-11-8 11:55


可以用共用体解决问题
airwill 发表于 2012-11-9 09:13 | 显示全部楼层
要个对齐问题, 我想编译器应该有这方面的控制命令. 不知道是什么编译器?
另外可能也就是个碰巧问题, 调整一下变量位置关系, 我想也能碰巧成偶地址的.
qqlvjh 发表于 2012-11-9 10:37 | 显示全部楼层
_align(2)
 楼主| hwk612167 发表于 2012-11-9 17:08 | 显示全部楼层
IAR碰巧可不行啊,要强制必须 6# airwill
john_lee 发表于 2012-11-9 20:41 | 显示全部楼层
有一个简单的办法,只是使用上稍嫌麻烦:把你希望对齐的宽度(一般是16位或32位),用一个哑元数据表示,并把这个数据与你希望对齐的数据本身,组成一个联合(union)。
例如你希望把字节数组对齐到16位:
  1. union {
  2.     uint16_t __dummy;    // 这个哑元数据可以使编译器让整个 union 对齐到16位,
  3.     uint8_t arr[10];          // 从而保证了 arr 也是对齐的。
  4. } aligned_arr;
访问数据时,要注意 arr 数组是联合变量 aligned_arr 的成员。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:前进 前进 前进

20

主题

511

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部