关于CM3内核堆栈8字节对齐

看的有点迷糊。

把几篇文章列出来:

STM32中断和异常

cortex-m3 栈的8字节对齐

对堆栈8字节对齐问题的讨论

其中第三篇在末尾总结道:


综上所述,为了能够安全的使用严格遵守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字节对齐是比较稳妥的,因为启动文件就是这么弄的。



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值