一、字节对齐的含义
4字节对齐的含义就是变量地址对4求余数为0;8字节对齐就是地址对8求余等于0,依次类推,比如:
如果让p去访问0x20000001, 0x20000002,0x20000003这都是不对齐访问。
二、背景知识
对于M3和M4而言,可以直接访问非对齐地址(注意芯片要在这个地址有对应的内存空间), 因为M3和M4是支持的,而M0/M0+/M1是不支持的,不支持的内核芯片,只要非对齐访问就会触发硬件异常。
图片来自安富莱电子
三、全局变量对齐问题
uint8_t定义变量地址要1字节对齐。
uint16_t定义变量地址要2字节对齐。
uint32_t定义变量地址要4字节对齐。
uint64_t定义变量地址要8字节对齐。
指针变量是4字节对齐。
四、结构体成员对齐问题
#pragma pack(1)//使用了宏pack(x)按x字节对齐
typedef struct
{
uint16_t cmd;
uint32_t length;
uint8_t content;
}ex_485_t;
#pragma pack()//恢复原有对齐规则
typedef struct
{
uint16_t cmd;
uint32_t length;
uint8_t content;
}ex__t;
五、M4支持的非结构体成员对齐问题
在《Arm® Cortex®-M4 Processor Technical Reference Manual》译文如下:未对齐支持仅适用于加载/存储单个(LDR、LDRH、STR、STRH)。加载/存储双重已经支持单词对齐的访问,但不允许其他未对齐的访问,如果尝试这样做,则会产生错误。