我在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);
}
昨晚出现的这个问题,类似楼主,不过我注意到可能通过指针读写结构体会出现一些问题,为了协议组包方便,我们结构体定义的时候全部都使用
#pragma pack (1)
声明结构体
#pragma pack()
禁止keil编译器的字节对齐.
但是还是出现了问题,一个指针很明显是指向的结构体那块存储空间了,但是一旦向指针指向的空间写入数据就会进入硬件故障中断.
我的认识,如果禁止字节对齐,那么存储空间都是以个字节为单位,我用指针指向结构体的内存空间,然后写入数据,多么天经地义,这不就是指针的魅力所在.....可是不知道为什么报错了,有点颠覆认知.如果像楼上那位老师说的可能换芯片同样的写法就会不能使用,那对我来说可能是个灾难了...
一周热门 更多>