ARM Cortex-M内核中系统堆栈

文章目录

  • 有无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.rhkb.cn/news/140367.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信店铺小程序开通的效果是什么

微信已经成为众多商家经营的主要场景,随着互联网电商深入,对经营者来说每天线上分享产品/服务/门店信息等已经成为日常,但为了打造品牌及解决传统线下经营困境和线上混乱的信息集、客户便捷触达提升商家效率等难题。 各行业/企业商家都在积极…

基于SpringBoot的社区医院信息平台

目录 前言 一、技术栈 二、系统功能介绍 患者信息管理 护士信息管理 医生信息管理 药品管理员管理 患者添加 安排检查 完成注射列表 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系…

Leetcode刷题笔记--Hot51-60

1--环形链表II 主要思路: 快慢指针,快指针每次走两步,慢指针每次走一步; 第一次相遇时,假设慢指针共走了 f 步,则快指针走了 2f 步; 假设起点到环入口结点的长度为 a(不包括入口结点…

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

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

[管理与领导-102]:经营与管理的关系:攻守关系;武将文官关系;开疆拓土与守护城池的关系;战斗与练兵的关系;水涨船高,水落船低的关系。

目录 前言: 一、手中拿着锤子,一切看起来都像钉子 1.1 企业经营中过渡强调管理的表现? 1.2 企业经营中过渡强调管理的误区(背后深层次的原因) 二、无知者的无畏,独断者的自high 2.1 企业经营中过度忽律管理的表…

在线商城项目EShop【ListView、adapter】

要求如下: 1、创建在线商城项目EShop; 2、修改布局文件activity_main.xml,使用LineaLayout和ListView创建商品列表UI; 3、创建列表项布局list_item.xml,设计UI用于显示商品图标、名称和价格信息; 4、创…

能跑通的mmdet3d版本

能跑通的mmdet3d版本 1.0版本 2.0版本

ArrayList常见面试题

简介 ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于对元素进行查找,效率非常高。 线程安全性 对ArrayList的操作…

Node.js环境安装与服务设置,结合内网穿透随时随地公网访问!

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

Hadoop的HDFS高可用方案

一、Hadoop高可用简介 Hadoop 高可用 (High Availability) 分为 HDFS 高可用和 YARN 高可用,两者的实现基本类似,但 HDFSNameNode 对数据存储及其一致性的要求比 YARN ResourceManger 高得多,所以它的实现也更加复杂 1、HDFS系统高可用简介…

【PowerShell】PowerShell的Core版本的额外配置

在PowerShell 7.1 安装完成后,默认情况下打开PowerShell 会直接进入到系统内置的PowerShell,如果希望通过远程连接或者PowerShell Web Access 进入到PowerShell 7环境的界面,就需要进行环境的再配置才能实现PowerShell 7.1 的环境连接。需要为外部的环境提供连接的话需要按照…

linux安装配置 flume

目录 一 解压安装包 二 配置部署 (1)修改配置 (2)下载工具 (3)创建配置文件 (4)启动监听测试 (5)flume监控文件 一 解压安装包 这里提供了网盘资源 链…

【计算机基础】让我们重新认识一下Visual Stduio及其操作,知识点汇总!!

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

iOS加固保护技术:保护你的iOS应用免受恶意篡改

目录 转载:开始使用ipaguard 前言 下载ipa代码混淆保护工具 获取ipaguard登录码 代码混淆 文件混淆 IPA重签名与安装测试 转载:开始使用ipaguard 前言 iOS加固保护是直接针对ios ipa二进制文件的保护技术,可以对iOS APP中的可执行文件…

ARMv8 cache的包含策略inclusive 和 exclusive之间的区别以及Cortex-A55示例详解

Inclusive 和 Exclusive 一, 什么是cache的inclusive 和 exclusive二,Inclusive 和 Exclusive cache示例2.1 Inclusive cache2.2 Exclusive cache 三, inclusive cache和 exclusive cache的比较3.1 cache coherency3.2 miss rate3.3 cache ca…

马尔可夫链预测 (Markov Chain)

一、人寿保险案例(两状态) 人寿保险公司把人的健康状态分为健康和疾病两种,以一年为一个时段,研究健康状态的转变。假设对某一年龄段的人来说,今年健康,明年继续保持健康的概率为0.8,即明年转为疾病的概率…

AI 编码助手 Codewhisperer 安装步骤和使用初体验

文章作者:为了自己加油 最近亚⻢逊云科技推出了一款基于机器学习的AI编程助手 Amazon Code Whisperer,可以实时提供代码建议。在编写代码时,它会自动根据现有的代码和注释给出建议。Amazon Code Whisperer与 GitHub Copilot 类似,…

Python异步编程并发执行爬虫任务,用回调函数解析响应

一、问题:当发送API请求,读写数据库任务较重时,程序运行效率急剧下降。 异步技术是Python编程中对提升性能非常重要的一项技术。在实际应用,经常面临对外发送网络请求,调用外部接口,或者不断更新数据库或文…

测试与FastAPI应用数据之间的差异

【squids.cn】 全网zui低价RDS,免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 当使用两个不同的异步会话来测试FastAPI应用程序与数据库的连接时,可能会出现以下错误: 在测试中,在数据库中创建了一个对象&#x…