简单地说非对齐内存访问就是被访问的地址不是4字节对齐的,非对齐内存访问的用处很多,有的时候可以精简不少程序,尤其是在帧数据处理的时候。例如有一个整形变量A存放在内存的0x0000 0000处,访问变量A的时候就是对齐访问,因为地址0x0000 0000是4字节对齐的,再比如又有一个整形变量B的存放地址为0x0000 0003,那么对B的访问就是非对齐内存访问了,因为地址0x0000 0003不是4的整数。
貌似没有什么问题,就像上面的例子中的变量B,我们读取变量B的时候不就是从地址0x0000 0003处开始读取4个字节到CPU的寄存器中去么?是这样,但是很多处理器设计的时候为了运算速度的考虑只允许对齐的内存访问方式,非对齐访问会出现异常中断,所以不能进行非对称内存访问。但是Cortex M3内核是支持非对齐内存访问的,在ARM Cortex M3权威指南(英文版)中有写到“The Cortex-M3 processor also supports unaligned data accesses, a feature previously available only in high-end processors.”,这段话说的很清楚,高档的Cortex-M3处理器是支持非对齐内存访问的,STM32F1xx系列算是高档芯片么?做个试验就行了。
简单写个程序进行测试:
void main() { unsigned char buff[10] = {0,0,0,0,0,0,0,0,0,0,}; int i; for(i=0;i<10;i++) printf("%.2x ",buff[i]); printf("\r\n"); *(unsigned int *)(buff + 0) = 0x11223344; for(i=0;i<10;i++) printf("%.2x ",buff[i]); printf("\r\n"); *(unsigned int *)(buff + 3) = 0x11223344; for(i=0;i<10;i++) printf("%.2x ",buff[i]); printf("\r\n"); }
在STM32F103上运行的结果是:
00 00 00 00 00 00 00 00 00 00 44 33 22 11 00 00 00 00 00 00 44 33 22 44 33 22 11 00 00 00
结果很明显,STM32 series is high-end Cortex-M3 processors.
结果让人惊喜,但是需要注意的是如果程序中有非对齐的内存访问的话,程序的可移植性可能会降低,因为不是所有处理器都可以进行非对齐内存访问,例如使用Cortex-M0内核的STM32F0系列处理器就不支持非对齐内存的访问。