关于CM3内核堆栈8字节对齐
2017-12-01 14:39
204 查看
看的有点迷糊。把几篇文章列出来:STM32中断和异常cortex-m3 栈的8字节对齐对堆栈8字节对齐问题的讨论其中第三篇在末尾总结道:
综上所述,为了能够安全的使用严格遵守AAPCS规则的函数(比如sprintf)需要做到以下几点:1.保证MSP在初始的时候是8字节对齐的2.如果用到OS的话需要保证给每个任务分配的栈是保持8字节对齐的3.如果用的是基于CM3内核的处理器需将NVIC配置控制寄存器的STKALIGN置位对于第三条“STKALIGN置位”,没看到程序里面有相关设置。值得注意的是:在启动文件就是 .S文件 里面有:AREA STACK, NOINIT, READWRITE, ALIGN=3AREA HEAP, NOINIT, READWRITE, ALIGN=3ALIGN=3的意思就是2的3次方=8字节对齐。所以我们在手动给变量分配地址的时候一定要8字节对齐。但是我早就发现编译器对固定分配的内存都是4字节对齐的啊!!摘个MAP如下:从上图看出,编译器通过PAD把变量分配到了不是8的倍数的地址上(因为不能被8整除),只是分配到了4的倍数的地址。所以,难道是编译器把进入stack的临时变量都是8字节对齐?对于栈看样子很可能是这个意思。在非操作系统下,对于启动文件中的堆就有点复杂了,一方面在启动文件中设置为8字节对于,但是如果在链接到启动文件的堆的函数的对齐语句如果设置的是4字节对齐,那么这种情况听谁的呢?挺麻烦的,有时间可以试试。总结一下:在CM3中,对于OS或非OS下的固定内存分配,编译器并不是都将变量分配为8字节对齐对于OS或非OS下的堆栈,设置为8字节对齐是比较稳妥的,因为启动文件就是这么弄的。
相关文章推荐
- 关于字节对齐存储的问题
- 关于字节对齐
- 关于C++ 字节对齐 (结构体)
- 关于C的字节对齐
- 关于字节对齐方式的语句用法
- 关于C/C++的字节对齐
- 转载:关于字节对齐
- 关于C++内存中字节对齐问题的详细介绍
- 关于字节对齐的一些理解
- 关于C/C++的字节对齐
- 关于字节对齐问题的解释.
- 关于#pragma pack()字节对齐问题
- 关于n字节对齐和sizeof的用法
- 关于C语言中结构体字节对齐问题
- coding---关于字节对齐
- 关于字节对齐,和程序优化有关 值得一看
- 关于struct结构中字节对齐问题
- 转:关于n字节对齐和sizeof的用法
- Linux下的 arm-linux-gcc 与 gcc 关于字节对齐问题
- 关于c语言字节对齐(结构体)