当前位置: 代码迷 >> 单片机 >> Cortex-M3字节对齐的有关问题
  详细解决方案

Cortex-M3字节对齐的有关问题

热度:234   发布时间:2016-04-28 16:05:01.0
Cortex-M3字节对齐的问题
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了
  相关解决方案