iar 堆栈设置_浅析Cortex-M系统堆栈机制
发布日期:2021-06-24 13:54:56 浏览次数:2 分类:技术文章

本文共 1754 字,大约阅读时间需要 5 分钟。

今天给大家分享的这篇依旧是 2016 年之前痞子衡写的技术文档,花了点时间重新编排了一下格式。前面痞子衡讲过 《嵌入式里的堆栈原理》,本篇算是堆栈原理的工程实践,更具体点说是在 ARM Cortex-M上的应用。ARM Cortex-M 家族发展至今已经很多代,我们且以最简单的 Cortex-M0 为例来讲述堆栈机制:

15457b25244eab24648ac795aaf0fe37.png

1. 基本规则

1.1 R13 / sp 寄存器

R0-R12 为通用寄存器,R13 为系统堆栈指针 sp,堆栈指针是用于访问堆栈,也即系统的 RAM 区。Cortex-M0 中采用了两个堆栈指针:主堆栈指针(MSP)和进程堆栈指针(PSP),R13 在任何时刻只能是其中一个,默认情况为 MSP,可以通过控制寄存器(CONTORL)来改变。

c2c6bfd4c55774b433eca7277f3f5fd5.png

MSP 是系统复位后(即其处于 Handler Mode)的指定 sp(vector table 的前 4Byte 自动载入),用于处理异常中断。当结束 Reset_Handler 后,cpu 进入正常运行状态(即其处于 Thread Mode),仅在此状态下 PSP 才能被使用,当然 MSP 也可以使用。其后如有硬中断来临,则进入 Handler Mode,如果硬件中断结束,则返回 Thread Mode。

e463a7f71dbb4639449b33dcbedd5a27.png

关于 MSP 和 PSP 的选用,其是通过 CONTORL 寄存器来配置,仅在 Thread Mode 下才可设置 CONTORL 寄存器。一般情况下,没有必要使用 PSP,除非是有 os 存在时,MSP 用于 os 内核的 sp,而 PSP 用于 thread 级 app 的 sp,这两个 sp 需严格分开。

在编译器中,可以通过 r13(R13)或 sp(SP)来访问堆栈(具体是 MSP 和 PSP 由当时环境决定);也可以通过指定的 MRS、MSR 指令来访问 MSP 和 PSP。

1.2 栈结构

无 OS 的堆栈结构:

1e542226e3a7355ca743e67f12cdd21a.png

有 OS 的堆栈结构:

0b75ef8bbf779088e6a171f84cd76595.png

1.3 栈操作

Cortex-M0 中堆栈方向是向低地址方向增长,为满堆栈机制。堆栈操作是通过 PUSH 和 POP 来完成操作的。

a15ccb4619bbb9b3e86ebb763d482a66.png

栈一般放在 ARM 的 RAM 高位区,如某 MCU 中 RAM 地址为 0x20000000-0x20007fff,共 32KByte。栈大小设为 4KByte 的话,其地址一般就放在 0x20007000-0x20007fff,其中 0x20007000 为绝对栈顶,0x20007ffc 为绝对栈底,sp 总是指向相对栈顶。第一个 PUSH 数据被存在绝对栈底(此时绝对栈底也是相对栈顶)。实际上,除了 POP 指令可以从栈顶中取数据外;MOV 指令也可从任意位置取数据,但不会影响栈结构(即不影响其 sp)。

由于 ARM 寄存器均是 32bit,故 PUSH 和 POP 指令均是 32bit 访问,故 sp 指针总是至少 4Byte 对齐(低 2bit 永远为 0)。有时编译器也会分配 8Byte 对齐的栈,这是由于 double 浮点类型需要占用 8Byte,为了处理方便,故将栈设为 8Byte 对齐。

2. 入栈顺序

入栈顺序因编译器、处理器系统、OS 而异,C 语言中并没有强制规定入栈顺序,此处主要是讲 ARM Cortex-M 系列处理器在指定编译器情况下的入栈顺序。

2.1 一般函数调用(通用)

aeb874e4efeed3413657ca3ddb744dea.png

上图展示了在一般函数(无参无局部变量无返回值)嵌套调用时,关于 sp 的操作。在执行 BL FunctionA 指令时,LR 记录的是 BL FunctionA 的下一条顺序指令,在进入 FunctionA 后执行的第一条操作便是 PUSH {LR}即将下一条顺序指令压入栈中,然后才开始执行 FunctionA 函数体。函数体执行结束之后,使用 POP {PC}指令将栈顶数据弹到 PC 中,即可返回继续执行 BL FunctionA 的下一条顺序指令。

2.2 极端函数调用(平台而异)

考虑一种极端情况来详细讲述入栈顺序,即函数含有 4 个参数以上,函数体内定义了多个局部变量,并且还有返回值。这个情况比较特殊,痞子衡专门在 IAR 上做过一次实验,详见今天次条推文(是个长图,看懂需要有一定汇编基础):

转载地址:https://blog.csdn.net/weixin_33283907/article/details/112208552 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:android 获取元素的下标_互联网人工智能编程语言Python的下标与切片详解
下一篇:三星内存编码_【科普】内存颗粒版本判断方法和编号解析V2.0

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月11日 10时52分35秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

安卓开发详解!深入解析Android-AutoLayout,不吃透都对不起自己 2019-04-29
巩固知识体系!为什么Android要采用Binder作为IPC机制?深度好文 2019-04-29
带你全面掌握高级知识点!Android面试知识点总结宝典助你通关!搞懂这些直接来阿里入职 2019-04-29
查漏补缺!Android开发还会吃香吗?Android面试题及解析 2019-04-29
查漏补缺!双非渣本Android四年磨一剑,不吃透都对不起自己 2019-04-29
毕业工作5年被裁,学习Binder前必须要了解的知识点,附答案 2019-04-29
涨知识!2021最新Android中级面试题目汇总解答,分享PDF高清版 2019-04-29
实践出真知!如何成为一个更好的Android开发者?已开源 2019-04-29
小白看完都学会了!Android面试心得必备技能储备详解,详细的Android学习指南 2019-04-29
小白看完都学会了!全世界都在问Android开发凉了吗?BAT大厂面试总结 2019-04-29
带你彻底弄明白!如何才能通过一线互联网公司面试?面试建议 2019-04-29
干货来袭!字节跳动Android面试全套真题解析在互联网火了,附答案 2019-04-29
快点来白嫖!被面试官问的Android问题难倒了,附面试题答案 2019-04-29
快速上手!最全面试考点与面试技巧,吐血整理 2019-04-29
想学IT的必看!Android平台HTTPS抓包解决方案及问题分析,送大厂面经一份! 2019-04-29
想提高开发效率的必看!写给互联网大厂员工的真心话,深度好文 2019-04-29
安卓系统开发!Android性能优化之启动优化实战篇,大厂面试题汇总 2019-04-29
帮你快速拿Offer!Android高级工程师进阶学习,分享PDF高清版 2019-04-29
干货精讲!Android社招最全面试题,面试建议 2019-04-29
快点来白嫖!分享一些行业经验,全套教学资料 2019-04-29