指针访问结构体出现硬件错误

2019-07-14 14:42发布

我在MDK518环境下, 使用STM32F072芯片,在做结构体时,定义了两个变量saveblock,Storage。用指针访问saveblock成功,访问Storage时就跳转到硬件错误,  两个变量是同一个结构,进行的同样的操作,为什么先定义的那个就没事,后定义的那个旧不能正常访问。

typedef union
{
        u8 Mem[6];
        struct
        {
                u8 ID            : 8;
                u8 Year                : 8;
                u8 Month        : 4;
                u8 Day                : 6;
                u8 Hour                : 6;
                u8 Minute        : 8;
                u8 Second        : 8;                        
        }Date;
}Date_Union;

typedef struct {
               
        u8 Machine_State[2];
        Date_Union Date_Result;               
        
}STORAGE;

STORAGE saveblock,Storage;


int main()
{        
        u16 *Tmp;        
        u16 TestValue;
                        
        saveblock.Date_Result.Date.ID=0x15;
        Storage.Date_Result.Date.ID=0x16;
        
        Tmp = (u16*)&saveblock;
        Tmp+=2;
        TestValue = *Tmp;
        
        Tmp = (u16*)&Storage;
        Tmp+=1;
        TestValue = *Tmp;        //调试的时候  在这里跳转到硬件错误  不能正常读取
        
        while(1);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
sagitturius
2019-07-16 13:46
看到楼主 和 moyanming2013的回复蛮有感触上来发个言.
昨晚出现的这个问题,类似楼主,不过我注意到可能通过指针读写结构体会出现一些问题,为了协议组包方便,我们结构体定义的时候全部都使用
#pragma pack (1)
声明结构体
#pragma pack()
禁止keil编译器的字节对齐.
但是还是出现了问题,一个指针很明显是指向的结构体那块存储空间了,但是一旦向指针指向的空间写入数据就会进入硬件故障中断.
我的认识,如果禁止字节对齐,那么存储空间都是以个字节为单位,我用指针指向结构体的内存空间,然后写入数据,多么天经地义,这不就是指针的魅力所在.....可是不知道为什么报错了,有点颠覆认知.如果像楼上那位老师说的可能换芯片同样的写法就会不能使用,那对我来说可能是个灾难了...

一周热门 更多>