打印
[STM32F1]

从MDK4.1升级到MDK4.7 同样的工程出现诡异现象,求解

[复制链接]
850|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cbx_xx|  楼主 | 2017-8-28 09:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 cbx_xx 于 2017-8-28 09:24 编辑

我一个工程是读取sd卡里的BPB参数. 我定义了一个u8 BUFFER[512];读取的数据就放进这个BUFFER里.
#pragma pack(1)

typedef  struct
{
        u8 BS_jmpBoot[3];
        u8 BS_OEMName[8];
        u16 BPB_BytesPerSec;
        u8 BPB_SecPerClus;
        u16 BPB_RsvdSecCnt;
        u8 BPB_NumFATs;
        u16 BPB_RootEntCnt;
        u16 BPB_TotSec16;
        u8 BPB_Media;
        u16 BPB_FATSz16;
        u16 BPB_SecPerTrk;
        u16 BPB_NumHeads;
        u32 BPB_HiddSec;
        u32 BPB_TotSec32;
        u8 BS_DrvNum;
        u8 BS_Reservedl;
        u8 BS_BootSig;
        u32 BS_VolID;
        u8 BS_VolLab[11];
        u8 BS_FilSysType[8];
        u8 ExecutableCode[448];
        u8 ExecutableMarker[2];
} FAT_BPB;

#pragma pack()

在一个函数里操作
        FAT_BPB* BPB = (FAT_BPB*)BUFFER;
        ReadBlock(0,BUFFER);

        在MDK4.1没事,读取BUFFER的完全符合BPB参数,查看BUFFER内存数据如下:0xeb,0x3c,0x90,0x4d,0x53,0x44,0x53,0x35,0x2e,0x30.....
        但是在MDK4.7和MDK5.23里却是这样. 假设BUFFER的地址是0x2000053B,则开头数据如下0x4d,0x53,0x44,0x53,0x35,0x2e,0x30..... 我通过内存往后看,发觉0x20000538开始就是0xeb,0x3c,0x90.
       也就是说,读取的数据放到BUFFER里,开始的地址变了. 我SD卡是通过DMA放的.
      为什么MDK4.1没事呢





1.png (29.2 KB )

1.png

2.png (32.55 KB )

2.png
沙发
Xflyan| | 2017-8-28 10:03 | 只看该作者
估计是字节对齐的问题,建议别用 pack(1) 字节对齐,至少要用 pack(4) 字对齐,或者 pack(8),应该就可以了,DMA可能忽略地址最低两个比特了

使用特权

评论回复
板凳
maiweiqi| | 2017-8-28 14:36 | 只看该作者
估计是你BUFFER的起始地址是个基数导致的。把BUFFER定义成int [128]的数组试试

使用特权

评论回复
地板
mmuuss586| | 2017-8-28 14:45 | 只看该作者
本帖最后由 mmuuss586 于 2017-8-28 14:50 编辑

编译器优化升级了吧,占用长度不一样吧;想办法对齐;

使用特权

评论回复
5
稳稳の幸福| | 2017-8-28 15:56 | 只看该作者
现在出到5了吧,换最新版用。

使用特权

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

本版积分规则

13

主题

41

帖子

0

粉丝