- C/C++ code
#pragma pack(2) // 如果不加会出错,如果加了正确typedef struct{ uint16_t FrameStart; uint16_t RelayAddr; uint16_t SrcAddr; uint16_t DestAddr; uint32_t MsgID; uint16_t DataLength; uint8_t MsgType; uint8_t Exception; }STU_NetHead;// 测试代码 uint8_t arr[48]; int i; STU_NetHead head; uint8_t *p; p = arr; for(i = 0; i < 50; i++) { head = *(STU_NetHead *)p; // 不加#pragma pack(2)第二次出错总线错误 p++; }
上面的结构体如果不加#pragma pack(2)结构体是按里面最大的uint32_t 4字节对齐,但是这样会导致第二次执行head = *(STU_NetHead *)p; 时总线错误,如果加上#pragma pack(2)结构体按2字节对齐,程序没有任何问题。现在不明白为什么4字节对齐会出错,求指教。
------解决方案--------------------
和p定义有关吧uint8_t ;试试定义成uint32_t 就不用加#pragma pack(2)了
------解决方案--------------------
4个字节对齐时,你的P++直接访问,会访问到编译器对齐后,留下的“空隙”
以下为印象:
记得ARM的体系结构,是不允许直接访问4倍数以外的地址空间的,据说影响效率,如果用户访问了是要产生一个总线错误
以上印象,不保证科学
:)
通常对于结构里,对次序敏感的话,我个人习惯于按结构内部字长最小的元素作为对齐字长,这样出现这种问题的机率应该要小很多
当然,也有例外的,像STM32里,它写FLASH的接口是以双字为接口,要存FLASH的数据,我就以4字节对齐,那偏移变成+4就OK了