看的有点迷糊。
把几篇文章列出来:
其中第三篇在末尾总结道:
综上所述,为了能够安全的使用严格遵守AAPCS规则的函数(比如sprintf)需要做到以下几点:
1.保证MSP在初始的时候是8字节对齐的
2.如果用到OS的话需要保证给每个任务分配的栈是保持8字节对齐的
3.如果用的是基于CM3内核的处理器需将NVIC配置控制寄存器的STKALIGN置位
对于第三条“ STKALIGN置位”,没看到程序里面有相关设置。
值得注意的是:在启动文件就是 .S文件 里面有:
AREA STACK, NOINIT, READWRITE, ALIGN=3
AREA HEAP, NOINIT, READWRITE, ALIGN=3
ALIGN=3的意思就是2的3次方=8字节对齐。所以我们在手动给变量分配地址的时候一定要8字节对齐。
但是我早就发现编译器对固定分配的内存都是4字节对齐的啊!!摘个MAP如下:
从上图看出,编译器通过PAD把变量分配到了不是8的倍数的地址上(因为不能被8整除),只是分配到了4的倍数的地址。
所以,难道是编译器把进入stack的临时变量都是8字节对齐?对于栈看样子很可能是这个意思。
在非操作系统下,对于启动文件中的堆就有点复杂了,一方面在启动文件中设置为8字节对于,但是如果在链接到启动文件的堆的函数的对齐语句如果设置的是4字节对齐,那么这种情况听谁的呢?
挺麻烦的,有时间可以试试。
总结一下:
在CM3中,
对于OS或非OS下的固定内存分配,编译器并不是都将变量分配为8字节对齐
对于OS或非OS下的堆栈,设置为8字节对齐是比较稳妥的,因为启动文件就是这么弄的。