问题是这样的:
环境keil(一种嵌入式的IDE)
typedef struct _RIP_MSG
{
uint8_t op;
uint8_t htype;
uint8_t hlen;
uint8_t hops;
uint32_t xid;
uint16_t secs;
uint16_t flags;
uint8_t ciaddr[4];
uint8_t yiaddr[4];
uint8_t siaddr[4];
uint8_t giaddr[4];
uint8_t chaddr[16];
uint8_t sname[64];
uint8_t file[128];
uint8_t OPT[312];
}RIP_MSG;
uint8_t EXTERN_DHCPBUF[1024];
RIP_MSG* pRIPMSG = (RIP_MSG*)EXTERN_DHCPBUF;
上面是定义了一个结构体,一段可用空间,以及让结构体指针指向这段空间的首地址。一切看上去还很平静。
当执行:
memset((void *)pRIPMSG, 0, sizeof(RIP_MSG));语句时,偶尔会死机。
原因后来发现了,当
uint8_t EXTERN_DHCPBUF[1024] __attribute__((aligned(4))); 对该数组四字节对齐时,就不会出错。
然后本人就怀疑是 memset的问题,网上也有提到,memset需要4字节对齐。
好奇的本人又在VS2010下执行了memset((void *)pRIPMSG, 0, sizeof(RIP_MSG));语句,而且还特意
pRIPMSG = (RIP_MSG*)((uint64_t)pRIPMSG | 1); 让它地址不对齐。运行时不会死机。
本人觉得可能是,在嵌入式开发时,基本是直接对内存进行操作,所以不对齐,执行到memset就会死机;
但在vs环境下,本身提供的地址就是虚拟地址,全部与硬件相关的操作都被封装起来了,屏蔽掉了。希望大家来讨论下。谢谢。
说了这么多本人有两个疑惑:
1、为什么VS不会死机,在KEIL下会出现死机?本人上面的想法对不?
2.KEIL下为什么不对齐就会死机?想高手从memset实现的方式上进行分析。
环境keil(一种嵌入式的IDE)
typedef struct _RIP_MSG
{
uint8_t op;
uint8_t htype;
uint8_t hlen;
uint8_t hops;
uint32_t xid;
uint16_t secs;
uint16_t flags;
uint8_t ciaddr[4];
uint8_t yiaddr[4];
uint8_t siaddr[4];
uint8_t giaddr[4];
uint8_t chaddr[16];
uint8_t sname[64];
uint8_t file[128];
uint8_t OPT[312];
}RIP_MSG;
uint8_t EXTERN_DHCPBUF[1024];
RIP_MSG* pRIPMSG = (RIP_MSG*)EXTERN_DHCPBUF;
上面是定义了一个结构体,一段可用空间,以及让结构体指针指向这段空间的首地址。一切看上去还很平静。
当执行:
memset((void *)pRIPMSG, 0, sizeof(RIP_MSG));语句时,偶尔会死机。
原因后来发现了,当
uint8_t EXTERN_DHCPBUF[1024] __attribute__((aligned(4))); 对该数组四字节对齐时,就不会出错。
然后本人就怀疑是 memset的问题,网上也有提到,memset需要4字节对齐。
好奇的本人又在VS2010下执行了memset((void *)pRIPMSG, 0, sizeof(RIP_MSG));语句,而且还特意
pRIPMSG = (RIP_MSG*)((uint64_t)pRIPMSG | 1); 让它地址不对齐。运行时不会死机。
本人觉得可能是,在嵌入式开发时,基本是直接对内存进行操作,所以不对齐,执行到memset就会死机;
但在vs环境下,本身提供的地址就是虚拟地址,全部与硬件相关的操作都被封装起来了,屏蔽掉了。希望大家来讨论下。谢谢。
说了这么多本人有两个疑惑:
1、为什么VS不会死机,在KEIL下会出现死机?本人上面的想法对不?
2.KEIL下为什么不对齐就会死机?想高手从memset实现的方式上进行分析。
解决方案
20
印象中VS的memset的实现是不需要4字节对齐的
也可能某些系统上memset使用特殊的实现,要求数据必须对齐。
也可能某些系统上memset使用特殊的实现,要求数据必须对齐。
20
但他说的是“偶尔会死机”,并不是数组没有32位对齐就导致死机。所以本人觉得这不是memset要求目标地址4字节对齐造成的,应该没有这种限制。而是struct _RIP_MSG这个结构编译器是做了对齐处理的,你把它放在非对齐地址上,生成的代码访问成员可能错位了,这本身也不会造成死机,而是在数据处理部分出现问题。