ARM Cortex-M内核中系统堆栈

news2024/11/25 0:21:00

文章目录

  • 有无OS的栈结构区别:
    • 裸机的任务栈结构
    • 带FreeRTOS操作系统的任务栈
  • ARM的寄存器有哪些
    • 特殊寄存器有哪些
  • 关于FreeRTOS中的SP寄存器
  • 栈操作【压栈与弹栈的操作】
  • 一般函数嵌套调用时sp指针的变化
  • Cortex-M内核的MSP与PSP作用

有无OS的栈结构区别:

裸机的任务栈结构

无OS的堆栈结构:此时每个任务的堆栈都在一起
在这里插入图片描述

带FreeRTOS操作系统的任务栈

在FreeRTOS中对线程、进程没有明显区分,统一称为任务。

有OS的堆栈结构:每个任务都有独立栈空间,用于保存上下文信息和全局变量

在这里插入图片描述

ARM的寄存器有哪些

ARM 架构的寄存器可以分为以下几类:

  • 通用寄存器:ARM 架构有 17 个 32 位的通用寄存器,它们命名为 R0-R15,其中 R13-R15 被用作栈指针、链接寄存器(LR)和程序计数器(PC)。

  • 状态寄存器:也称为程序状态寄存器(PSR),用于存储当前处理器的状态信息,例如条件码、中断使能位等。

  • 特殊寄存器:包括控制寄存器、处理器 ID 寄存器、系统控制寄存器等,它们用于控制处理器的一些重要行为和特性。

  • 浮点寄存器:ARMv7 架构引入了 VFP 协处理器,增加了 32 个浮点寄存器(S0-S31),可用于高精度浮点运算。

特殊寄存器有哪些

特殊寄存器是指在 ARM 架构中具有特殊用途的寄存器,包括以下几个:

  1. 控制寄存器(Control Register):用于控制处理器的一些重要行为和特性,如异常处理、缓存设置等。

  2. 处理器 ID 寄存器(Processor ID Register):用于标识处理器的类型和版本信息。

  3. 系统控制寄存器(System Control Register):用于控制系统级的功能和特性,如内存管理单元(MMU)的设置、缓存控制等。

  4. 中断控制寄存器(Interrupt Control Register):用于控制中断的使能和屏蔽,包括中断优先级、中断屏蔽位等。

  5. 定时器控制寄存器(Timer Control Register):用于控制定时器的计数和触发方式,包括定时器的频率、计数模式等。

  6. 异常控制寄存器(Exception Control Register):用于控制异常处理和异常向量表的地址。

这些特殊寄存器在 ARM 架构中扮演着关键的角色,可以控制和配置处理器的各种功能和特性,用于实现更高级的操作和控制。

关于FreeRTOS中的SP寄存器

一般来说Cortex-M系列有两种工作模式:

  • Thread Mode (线程模式):程序按照编译好的代码顺序执行

  • ​Handler Mode(中断模式):收到中断信号并执行中断处理函数

所以,Cortex-M系列内核使用了双堆栈,即MSP和PSP

  • MSP : Main_Stack_Pointer 主栈
  • PSP : Process_Stack_Pointer 任务栈
  • SP : 堆栈指针,指向最后一个被压入元素的地址

R13在任何时刻只能是其中一个,默认情况为MSP,可以通过控制寄存器:CONTROL寄存器的bit1来改变。
在这里插入图片描述

关于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。

在这里插入图片描述

控制寄存器有两个用途,其一用于定义特权级别,其二用于选择当前使用哪个堆栈指针。由两个比特来行使这两个职能。

在这里插入图片描述
在裸机开发中,CONTROL的bit1始终是0,也就是说裸机开发中全程使用程MSP,并没有使用PSP。在执行后台程序(大循环程序)SP使用的是MSP,在执行前台程序(中断服务程序)SP使用的是MSP

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

栈操作【压栈与弹栈的操作】

Cortex-M0中堆栈方向是向低地址方向增长,为满堆栈机制。堆栈操作是通过PUSH和POP来完成操作的。实际上,除了POP指令可以从栈顶中取数据外;MOV指令也可从任意位置取数据,但不会影响栈结构(即不影响其sp)

压栈与弹栈的操作:

  • 压栈:SP先自减4,然后将待压入的数据存放到SP所指的地址
  • 弹栈:从SP指针所指的地址读出数据,然后SP指针自增4

一般函数嵌套调用时sp指针的变化

在普通的函数嵌套调用中,当一个函数调用另一个函数时,程序会将当前函数的执行现场(包括 PC(程序计数器)、当前函数的状态、参数、返回地址等)保存在当前函数的栈帧中。接着,将栈指针 SP(stack pointer)移动到新的栈帧的栈顶位置(一般是上一个栈帧的底部位置),然后继续执行被调用的函数。

在这个过程中,SP 指针的变化如下:

  1. 进入被调用函数前:将当前函数的执行现场保存在当前函数的栈帧中,SP 指针不变。

  2. 进入被调用函数时:将新的栈帧的起始位置指定为上一个栈帧的底部,这个位置需要根据前一个栈帧的大小确定,即 SP 指针移动到新的栈帧的底部位置。

  3. 执行被调用函数时:如果有局部变量,则将这些变量分配在新的栈帧中。此时,SP 指针可能会进一步移动到这些变量的内存起始位置。

  4. 返回到调用函数时:将被调用函数的返回值或状态存储在新的栈帧中,并且将 SP 指针恢复到上一个栈帧的底部位置,以便取出当前函数的执行现场,同时恢复上一个栈帧中的现场并继续执行。

需要注意的是,在函数嵌套调用过程中,递归调用、多层嵌套和异常处理等情况会使 SP 指针的变化更加复杂。因此,在编写和调试程序时,需要仔细注意栈帧的大小、内存分配和释放以及异常处理等问题,以确保程序的正确性和稳定性。

Cortex-M内核的MSP与PSP作用

首先,设立双指针是为了保证OS的安全性和稳健性。通常来说,操作系统和异常事件(中断或其他fault)使用MSP,用户程序(线程)使用PSP。MSP与PSP指针之间的切换会在处理异常事件时自动完成。

本质上,区别于用户程序使用PSP,操作系统和异常事件单独使用一个MSP指针的目的,是为了保证栈数据不会被用户程序意外访问或栈空间被用户程序占用。比如,当应用程序发生栈溢出问题时,必须要确保应用程序的故障不会影响到操作系统的运行和异常事件的处理——也就需要保证始终要有栈空间来执行异常事件。

裸机操作时,使用的就是MSP指针。其实OS在上电复位到切换线程之前用的都是MSP指针,也就是线程切换之前都是一个裸机程序的状态。

参考博文:
关于FreeRTOS的底层实现和基础认识

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1036831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

雷达设备问题(从另一个角度看待区间合并 + 贪心思路 + 未发现关键的错误样例)

雷达设备问题 文章目录 雷达设备问题前言题目描述题目分析代码详解错误案例分析:思路代码: 前言 对于区间合并问题,我们一般会将区间按照左端点或者是右端点进行排序,至于其中的选择要依据题目的分析,这里给大家用贪心…

Nginx 设置禁用 OPTIONS 请求

1、修改 nginx 配置 在 nginx.conf 配置文件中,增加如下内容: if ($request_method ~* OPTIONS) {return 403; }效果如下: 2、重启 nginx 服务 systemctl restart nginx或者 service nginx restart3、功能验证 使用如下命令&#xff…

【Java毕设项目】基于SpringBoot+Vue教务管理系统的开发与实现

博主主页:一季春秋博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容:毕业设计(Java项目、小程序、安卓等)、简历模板、学习资料、…

提升群辉AudioStation音乐体验,实现公网音乐播放

文章目录 本教程解决的问题是:按照本教程方法操作后,达到的效果是本教程使用环境:1 群晖系统安装audiostation套件2 下载移动端app3 内网穿透,映射至公网 很多老铁想在上班路上听点喜欢的歌或者相声解解闷儿,于是打开手…

Unity WebSocket-Server

🌼WebSocket-Server 🥪效果展示🌭启动Server🍱连接Server 🥪效果展示 在Unity中创建WebSocket服务器,从网页连接到该服务器进行消息通信,在Unity中接收到的消息都在主线程中 🌭启…

基于ssm的学生综合测评管理系统047

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…

C\C++ 设置Visual Studio编译器使用C++17标准

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C-CSDN博客 简介: 使用ISO C17标准可以为开发人员带来许多好处,包括更简洁的代码、更高的运行效率、更好的硬件支持、更好的兼容性和可移植性&am…

基于springboot+vue的重庆旅游网(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

二、逻辑回归算法(LR,Logistic Regression)(有监督学习)

一、算法思路 逻辑回归本质就是基于多元线性回归,多元线性回归就是yw0 w1*x1 w2*x2 ... wn*xn 多元函数的值域是(-∞,∞),逻辑回归就是将值域映射到(0,1)之间,因为这样就可以变成一个概率值。常用的方法是将多元函数求解得到…

vscode调试webpack项目的方法

vscode调试webpack项目的方法 首先安装vscode插件Javascript Debugger 这个插件的介绍也写清楚了: An extension for debugging Node.js programs and Chrome. 那就是用来调试Node.js和Chrome的vscode扩展插件,包括typescript. 然后按F5启动调试&…

【LeetCode-简单题】589. N 叉树的前序遍历

文章目录 题目方法一:单循环栈做法方法二:递归 题目 方法一:单循环栈做法 关键在于子节点的入栈顺序,决定了子节点的出栈顺序, 因为是前序遍历 所以压栈顺序先让右边的入栈 依次往左 这样左边的节点会在栈顶 这样下次…

Linux CentOS7 vim多文件编辑

使用vim编辑多个文件,十分常用的操作。本文从打开、显示、切换文件到退出,进行简单讨论。 一、打开文件 1.一次打开多个文件 vim还没有启动的时候,在终端里输入vim file1 file2 … filen便可以打开所有想要打开的文件。 执行命令 vim fil…

深入解析哈希表、哈希映射和并发哈希映射的区别,以及死锁的成因和解决方案

目录 死锁死锁产生条件解决方案 HashTableConcurrentHashMapHashMap 死锁 死锁是多线程编程中常见的问题,当两个或多个线程互相等待对方持有的资源而无法继续执行时,就会发生死锁。这种情况下,程序会陷入无法恢复的状态,造成程序…

215. 数组中的第K个最大元素+17.14. 最小K个数(优先级队列)

目录 一、第K个最大元素 二、代码 三、最小K个数 四、代码 一、第K个最大元素 215. 数组中的第K个最大元素 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:int findKthLargest(vector<int>& nums, int k) {priority_queue data(nu…

MySQL数据库的存储引擎

目录 一、存储引擎概念 二、存储引擎 2.1MyISAM 2.11MyISAM的特点 2.12MyISAM表支持3种不同的存储格式&#xff1a; 2.2 InnoDB 2.21InnoDB特点介绍 三、InnoDB与MyISAM 区别 四、怎么样选择存储引擎 五、查看存储引擎 六、查看表使用的存储引擎 七、修改存储引擎 …

Leetocde 404. 左叶子之和

左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 提示: 节点数在 [1, 1000] 范围内-1000 < Node.val < 1000 采用的是递归法 s1. 确定递归函数的参数和返回值 s2. 确定终止条件 if(root NULL)return 0;s3. 确定单层递归的逻辑 当遇到左叶…

华为云Stack的学习(七)

八、华为云Stack存储服务介绍 1.云硬盘EVS 云硬盘&#xff08;Elastic Volume Service&#xff0c;EVS&#xff09;&#xff0c;又名磁盘&#xff0c;是一种虚拟块存储服务&#xff0c;主要为ECS&#xff08;Elastic Cloud Server&#xff09;和BMS&#xff08;Bare Metal Se…

2023年苏工展丨合共软件诚邀您参观苏州工业制造展,全新一代制造运营管理平台RockPlus MOM即将亮相!

2023年09月25日至27日一场智能制造的盛宴将于苏州国际博览中心盛大召开&#xff0c;合共软件受邀参展&#xff0c;展位&#xff1a;D馆1区A06-8。此次展览中&#xff0c;我们将向参观者展示最新产品——RockPlus MOM&#xff0c;一种颠覆性的数字化智能制造解决方案。上海合共软…

东芝第一代20T MAMR HDD实现PB级存储方案

近日&#xff0c;荷兰国际广播电视技术展览会(IBC 2023&#xff09;上东芝展示出来基于20T MARM HDD MARM&#xff0c;该盘基于FC-MAMR新技术&#xff0c;不是传统的CMR。 该产品的SPEC信息&#xff1a; 东芝本次公布的解决方案涉及的系统硬件主要包括&#xff1a; 东芝企业20…

新手学习:ArcGIS 提取SHP 路网数据、节点

新手学习&#xff1a;ArcGIS 提取SHP 路网数据、节点 参考连接 OSM路网提取道路节点 ArcGIS&#xff1a;如何创建地理数据库、创建要素类数据集、导入要素类、表&#xff1f; 1. 导入开源路网SHP文件 2. 在交点处打断路网数据 未打断路网数据 有一些路径很长&#xff0c;…