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

[复制链接]
5008|10
 楼主| IC1008 发表于 2007-10-22 00:05 | 显示全部楼层 |阅读模式
移植8位机的C的程序<br />&nbsp;&nbsp;&nbsp;&nbsp;8位C的读取4个字节的数据<br />&nbsp;&nbsp;&nbsp;&nbsp;Block0_offset=*((ULONG*)(&SD_Buffer[0x1c6]));<br />&nbsp;&nbsp;&nbsp;&nbsp;可能因为在ARM中&SD_Buffer[0x1c6]不是一个4的倍数<br />&nbsp;&nbsp;&nbsp;&nbsp;我在IAR调试中就跑到__HaltDAbort错误中去了<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;只能改为这个了<br />&nbsp;&nbsp;&nbsp;&nbsp;Block0_offset=SD_Buffer[0x1c6];<br />&nbsp;&nbsp;&nbsp;&nbsp;Block0_offset+=SD_Buffer[0x1c7]&lt&lt8;<br />&nbsp;&nbsp;&nbsp;&nbsp;Block0_offset+=SD_Buffer[0x1c8]&lt&lt16;<br />&nbsp;&nbsp;&nbsp;&nbsp;Block0_offset+=SD_Buffer[0x1c9]&lt&lt24;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;有没有其他办法呢<br /><br />还有数据结构中这样定义&nbsp;bpb=(struct&nbsp;bpb710&nbsp;*)(&SD_Buffer[0x0B]);<br />也跑飞了<br />在32位机器中&nbsp;定义的struct<br />typedef&nbsp;struct&nbsp;TEST_ST<br />{<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;a;<br />&nbsp;&nbsp;unsigned&nbsp;long&nbsp;b;<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;c;<br />}S_T;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;
size&nbsp;of&nbsp;struct:%d&quot;,sizeof(S_T));<br /><br />得到的结果是&nbsp;size&nbsp;of&nbsp;struct:12<br /><br />typedef&nbsp;struct&nbsp;TEST_ST<br />{<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;a;<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;a1;<br />&nbsp;&nbsp;unsigned&nbsp;long&nbsp;b;<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;c;<br />}S_T;<br /><br />得到的结果是&nbsp;size&nbsp;of&nbsp;struct:12<br /><br /><br />只要不是连续放置的的字节,都放在长整形里面了&nbsp;看来<br /><br />我如此定义的数据&nbsp;bpb=(struct&nbsp;bpb710&nbsp;*)(&SD_Buffer[0x0B]);<br />就要改成自己写一个程序&nbsp;慢慢小心的放置了&nbsp;看来<br />有更好的方法吗?<br /><br />
luocolor 发表于 2007-10-22 00:39 | 显示全部楼层

我晕,太巧了!

两个相关问题在一起了!
 楼主| IC1008 发表于 2007-10-22 09:10 | 显示全部楼层

楼上的兄弟 给一个方案吧

  
wishcom 发表于 2007-10-22 09:10 | 显示全部楼层

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

重点关注:<br />__align<br />__packed<br />两个关键字,相信能够解决
 楼主| IC1008 发表于 2007-10-22 10:57 | 显示全部楼层

我用IAR哦 郁闷

前几天将折磨我的ADS给删除了
sharpchang 发表于 2007-10-22 11:04 | 显示全部楼层

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

  
wlq_9 发表于 2007-10-22 11:45 | 显示全部楼层

#pragma pack(1)

强制字节对齐.<br /><br />#pragma&nbsp;&nbsp;&nbsp;pack(1)&nbsp;&nbsp;//强制结构字节对齐<br />typedef&nbsp;&nbsp;struct{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}a;<br />#pragma&nbsp;&nbsp;&nbsp;pack()&nbsp;&nbsp;&nbsp;//恢复默认的对齐方式<br /><br />仔细看看IAR的文档,IAR的文档做得还是挺不错的,很详尽.
 楼主| IC1008 发表于 2007-10-22 15:00 | 显示全部楼层

谢谢 我找到了 就是找个

做了这个就OK了
d358009670 发表于 2014-5-20 21:36 | 显示全部楼层
IC1008 发表于 2007-10-22 15:00
做了这个就OK了

请问 你是怎么解决的啊,我现在也遇见类似的问题,不知道怎么修改求帮助啊!!
ayb_ice 发表于 2014-5-21 09:53 | 显示全部楼层
本帖最后由 ayb_ice 于 2014-5-21 09:54 编辑

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

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


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

本版积分规则

41

主题

229

帖子

0

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