打印

关于ARM 等32位机C编译器的字节对齐问题 请教

[复制链接]
4141|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
IC1008|  楼主 | 2007-10-22 00:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
移植8位机的C的程序
    8位C的读取4个字节的数据
    Block0_offset=*((ULONG*)(&SD_Buffer[0x1c6]));
    可能因为在ARM中&SD_Buffer[0x1c6]不是一个4的倍数
    我在IAR调试中就跑到__HaltDAbort错误中去了

    只能改为这个了
    Block0_offset=SD_Buffer[0x1c6];
    Block0_offset+=SD_Buffer[0x1c7]<<8;
    Block0_offset+=SD_Buffer[0x1c8]<<16;
    Block0_offset+=SD_Buffer[0x1c9]<<24;

    有没有其他办法呢

还有数据结构中这样定义 bpb=(struct bpb710 *)(&SD_Buffer[0x0B]);
也跑飞了
在32位机器中 定义的struct
typedef struct TEST_ST
{
  unsigned char a;
  unsigned long b;
  unsigned char c;
}S_T;

    Uart_Printf(" size of struct:%d",sizeof(S_T));

得到的结果是 size of struct:12

typedef struct TEST_ST
{
  unsigned char a;
  unsigned char a1;
  unsigned long b;
  unsigned char c;
}S_T;

得到的结果是 size of struct:12


只要不是连续放置的的字节,都放在长整形里面了 看来

我如此定义的数据 bpb=(struct bpb710 *)(&SD_Buffer[0x0B]);
就要改成自己写一个程序 慢慢小心的放置了 看来
有更好的方法吗?

相关帖子

沙发
luocolor| | 2007-10-22 00:39 | 只看该作者

我晕,太巧了!

两个相关问题在一起了!

使用特权

评论回复
板凳
IC1008|  楼主 | 2007-10-22 09:10 | 只看该作者

楼上的兄弟 给一个方案吧

使用特权

评论回复
地板
wishcom| | 2007-10-22 09:10 | 只看该作者

建议LZ看看ADS的编译器文档

重点关注:
__align
__packed
两个关键字,相信能够解决

使用特权

评论回复
5
IC1008|  楼主 | 2007-10-22 10:57 | 只看该作者

我用IAR哦 郁闷

前几天将折磨我的ADS给删除了

使用特权

评论回复
6
sharpchang| | 2007-10-22 11:04 | 只看该作者

我也用IAR,请问为什么不能单步运行!

使用特权

评论回复
7
wlq_9| | 2007-10-22 11:45 | 只看该作者

#pragma pack(1)

强制字节对齐.

#pragma   pack(1)  //强制结构字节对齐
typedef  struct{
         }a;
#pragma   pack()   //恢复默认的对齐方式

仔细看看IAR的文档,IAR的文档做得还是挺不错的,很详尽.

使用特权

评论回复
8
IC1008|  楼主 | 2007-10-22 15:00 | 只看该作者

谢谢 我找到了 就是找个

做了这个就OK了

使用特权

评论回复
9
d358009670| | 2014-5-20 21:36 | 只看该作者
IC1008 发表于 2007-10-22 15:00
做了这个就OK了

请问 你是怎么解决的啊,我现在也遇见类似的问题,不知道怎么修改求帮助啊!!

使用特权

评论回复
10
ayb_ice| | 2014-5-21 09:53 | 只看该作者
本帖最后由 ayb_ice 于 2014-5-21 09:54 编辑

#pragma pack(1)
这个虽然可以解决问题,但效率低下,内部是按字节访问的,一般用在通信里

本质就是个对齐,大小端的问题


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

229

帖子

0

粉丝