ADS编译器定义结构体内存分配时不是连续的?

[复制链接]
4560|10
 楼主| xl042140 发表于 2008-5-9 09:32 | 显示全部楼层 |阅读模式
....在给SD卡上FAT16文件系统.出现的让人崩溃的问题....<br />函数如下:<br />uint8&nbsp;ReadBPB(void){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读取BPB数据结构<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;ok;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;FAT_BPB&nbsp;*&nbsp;BPB;<br />&nbsp;&nbsp;&nbsp;&nbsp;ok=ReadFatBlock(FAT_Sector);<br />&nbsp;&nbsp;&nbsp;&nbsp;BPB=(&nbsp;FAT_BPB*)BUFFER;<br />typedef&nbsp;struct{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BS_jmpBoot[3];<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BS_OEMName[8];<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;&nbsp;&nbsp;&nbsp;BPB_BytesPerSec;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BPB_SecPerClus;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;&nbsp;&nbsp;&nbsp;BPB_RsvdSecCnt;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BPB_NumFATs;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;&nbsp;&nbsp;&nbsp;BPB_RootEntCnt;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;&nbsp;&nbsp;&nbsp;BPB_TotSec16;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BPB_Media;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;&nbsp;&nbsp;&nbsp;BPB_FATSz16;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;&nbsp;&nbsp;&nbsp;BPB_SecPerTrk;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;&nbsp;&nbsp;&nbsp;BPB_NumHeads;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;&nbsp;&nbsp;&nbsp;BPB_HiddSec;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;&nbsp;&nbsp;&nbsp;BPB_TotSec32;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BS_DrvNum;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BS_Reservedl;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BS_BootSig;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;&nbsp;&nbsp;&nbsp;BS_VolID;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BS_VolLab[11];<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BS_FilSysType[8];<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExecutableCode[448];<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExecutableMarker[2];<br />}&nbsp;FAT_BPB;<br />函数READ_BPB&nbsp;读取的值都是对的.但是传给FAT_BPB&nbsp;BPB时.值就开始的<br />BS_jmpBoot[3];和BS_OEMName[8];是对的.后面基本上是乱的.<br />然后我试了几种方法。基本上判断,结构体在定义时是不连续分配的。<br />(与我平常见的其他编译器不一样)<br />请问那位知道在ADS编译器中可以设置定义结构体时,内存分配连续..<br />或者有其他方法解决不?~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;那位知道的高手一定告诉我啊。FAT16文件系统全都是结构体传值,这个解决不了,基本上做不下去了。.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;提前感谢回答的大虾.也感谢路过的朋友.
农民讲习所 发表于 2008-5-9 10:11 | 显示全部楼层

你把U32放最前,U16其次,U8最后,一定不会有问题。

  
农民讲习所 发表于 2008-5-9 10:13 | 显示全部楼层

搜索结构对齐 ARM

__packed
农民讲习所 发表于 2008-5-9 11:36 | 显示全部楼层

是两个下杠吧?

  
微风 发表于 2008-5-9 11:48 | 显示全部楼层

对齐的问题

我弄SD卡的时候改用数组的方式来访问
 楼主| xl042140 发表于 2008-5-9 11:52 | 显示全部楼层

感谢农民讲习所

确实是2个扛....多谢多谢多谢<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;多谢多谢多谢<br />多谢多谢多谢<br />多谢多谢多谢多谢多谢多谢<br />多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢<br />
Swd21ic 发表于 2008-5-9 23:55 | 显示全部楼层

RE

为什么?<br /><br />解释下.不packed的话也不应该被分配在不连续的地址
wishcom 发表于 2008-5-10 18:59 | 显示全部楼层

如果没有__packed的话

如果没有__packed,则编译器是按照结构体内最大的成员的SIZE为对齐单位的。
xibailiqian 发表于 2008-5-10 23:56 | 显示全部楼层

可能是对齐问题

保证没有内存空洞,例如long,short,long三个连续变量,在short后面应该补充一个空的short,保证第三个long是4字节对齐的;
tides 发表于 2008-5-11 00:27 | 显示全部楼层

2楼正解

U8是会被整数对齐的,中间会被插入别的数据<br />如果是你访问的芯片结构是这种非对齐的,个人建议你还是放弃这种方法,采用U8的数组比较合适,被ADS1.2整过无数次的苦恼办法,希望有达人有更好的办法
djyos 发表于 2008-5-12 17:34 | 显示全部楼层

为了保证可移植性

16位和32位数的成员我都是按字节访问,然后移位组装起来的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

24

帖子

0

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