首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

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

2012-04-14 
Cortex-M3字节对齐的问题C/C++ code#pragma pack(2)// 如果不加会出错,如果加了正确typedef struct{uint16

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了

热点排行