打印

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

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

相关帖子

沙发
农民讲习所| | 2008-5-9 10:11 | 只看该作者

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

使用特权

评论回复
板凳
农民讲习所| | 2008-5-9 10:13 | 只看该作者

搜索结构对齐 ARM

__packed

使用特权

评论回复
地板
农民讲习所| | 2008-5-9 11:36 | 只看该作者

是两个下杠吧?

使用特权

评论回复
5
微风| | 2008-5-9 11:48 | 只看该作者

对齐的问题

我弄SD卡的时候改用数组的方式来访问

使用特权

评论回复
6
xl042140|  楼主 | 2008-5-9 11:52 | 只看该作者

感谢农民讲习所

确实是2个扛....多谢多谢多谢
     多谢多谢多谢
多谢多谢多谢
多谢多谢多谢多谢多谢多谢
多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢多谢

使用特权

评论回复
7
Swd21ic| | 2008-5-9 23:55 | 只看该作者

RE

为什么?

解释下.不packed的话也不应该被分配在不连续的地址

使用特权

评论回复
8
wishcom| | 2008-5-10 18:59 | 只看该作者

如果没有__packed的话

如果没有__packed,则编译器是按照结构体内最大的成员的SIZE为对齐单位的。

使用特权

评论回复
9
xibailiqian| | 2008-5-10 23:56 | 只看该作者

可能是对齐问题

保证没有内存空洞,例如long,short,long三个连续变量,在short后面应该补充一个空的short,保证第三个long是4字节对齐的;

使用特权

评论回复
10
tides| | 2008-5-11 00:27 | 只看该作者

2楼正解

U8是会被整数对齐的,中间会被插入别的数据
如果是你访问的芯片结构是这种非对齐的,个人建议你还是放弃这种方法,采用U8的数组比较合适,被ADS1.2整过无数次的苦恼办法,希望有达人有更好的办法

使用特权

评论回复
11
djyos| | 2008-5-12 17:34 | 只看该作者

为了保证可移植性

16位和32位数的成员我都是按字节访问,然后移位组装起来的。

使用特权

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

本版积分规则

14

主题

24

帖子

0

粉丝