Cortex-M3与Aurix的堆栈

2023-11-05

1. 在ARM Cortex-M3架构中,堆栈通常由两个寄存器来管理主堆栈指针(MSP)进程堆栈指针(PSP)

        1.1 MSP是处理器的默认堆栈指针,用于保存中断处理程序的现场。当芯片复位或发生中断时,处理器会自动将MSP的值保存到堆栈中,并使用一个新的堆栈来保存中断处理程序的现场。MSP的值可以通过专门的寄存器进行读写,以便在需要时进行堆栈切换。

        1.2 PSP是用于保存应用程序现场的堆栈指针。在应用程序执行期间,PSP用于保存当前执行线程的现场。当发生中断时,处理器会自动将PSP的值保存到堆栈中,并使用MSP来保存中断处理程序的现场。PSP的值也可以通过专门的寄存器进行读写,以便在需要时进行堆栈切换。

        1.3 其实说白了就是如果你跑的是裸机程序,他用的就是一个堆栈的机制,就是只跑MSP的堆栈。但是如果你要跑操作系统,他就要用到双堆栈机制,比如程序正在顺序执行,突然产生一个中断,处理器把TASK的信息现场保存在PSP栈中,然后进入中断服务程序,中断服务程序中使用MSP栈,退出中断时从PSP栈中还原现场,返回用户程序。还有就是TASK的切换也是在PSP里切的,比如在一个时间片里TASK1没有执行完,他就会把TASK的现场保存在PSP栈中,之后执行TASK2,当TASK2执行完后,在还原PSP栈中TASK1的现场继续执行。

        1.4 堆栈是一种用于保存函数调用现场和局部变量的数据结构,它的操作是先进后出(Last-In-First-Out,LIFO)。栈帧(stack frame)是在函数调用期间在堆栈上分配的一块内存区域,用于存储函数的局部变量、参数和返回地址等信息。在函数调用过程中,每个函数都会分配一个新的栈帧,用于保存它的执行上下文。当函数返回时,栈帧被弹出堆栈,释放内存空间,并将控制权返回给调用者。所以说白了栈就是嵌入式RAM的一块连续内存空间,当程序执行时,会将相关数据压入栈中,栈指针会向下移动,分配新的内存空间。当函数执行出栈操作时,栈指针会向上移动,释放内存空间。

2. 上面说的是Cortex-M3内核的指针堆栈寄存器,但是TC397与Cortex-M3不同,他是有五个核,每个核都有自己的堆栈空间,它分为内核堆栈(core stack)和用户堆栈(user stack)和中断堆栈(interrupt stack)。如下图,下图没有说内核堆栈(core stack),是因为(core stack)是用于跑OS的。内核堆栈用于保存操作系统内核的执行上下文,用户堆栈用于保存应用程序的执行上下文。中断栈(interrupt stack)则是用于保存中断处理程序执行上下文的堆栈空间。上面说的3个堆栈空间,其实就是说在跑操作系统和中断的时候用的是MSP,跑任务,用的用户堆栈,也就是PSP。所谓的内核堆栈和用户堆栈是基于OS的堆栈指针的指向是根据当前处理器所处的模式(特权模式或用户权模式)来确定的。

2.1 在特权模式下,处理器可以访问所有的处理器资源和指令,包括特殊的系统寄存器、中断控制器、内存管理单元等。也就是说,在特权模式下,处理器可以访问用户模式下的堆栈。处理器可以使用PSP指针来访问用户堆栈,并读取或写入用户堆栈上的数据。

2.2 而在用户模式下,处理器只能访问受限的处理器资源和指令。用户模式下,处理器只能访问用户的数据和代码,无法访问系统的关键资源。这样可以确保用户代码不会对系统的稳定性和安全性产生影响。

也就是说内核堆栈是在特权模式下,并且用的MSP,但是他可以方访问PSP。而中断也是在特权模式下的MSP里,可以方访问PSP。用户堆栈就是在非特权模式下只能用的PSP。

        2.3 因为中断和异常处理通常需要访问操作系统内核代码和资源,而这些资源只能在特权模式下访问,所以中断堆栈必须位于特权模式下。

        2.4 中断堆栈包含了一些重要的信息,如 CPU 寄存器、程序计数器、堆栈指针等,这些信息用于在中断或异常处理完成后恢复原来的执行上下文。

        2.5 内核堆栈和用户堆栈用于保存执行上下文,中断堆栈用于保存中断处理程序的执行上下文。

除此之外还有三个寄存器,一个是SP也就是A[10],一个ISP,还有一个PSW。

        1. A[10]:这个就在GPR中,也称之为SP(Stack Pointer),与传统内核的SP类似.如下图:

        2. ISP:在CSFR中,专用于中断的Stack.进入中断后自动切换使用ISP,以防止对主任务Stack的误操作.

        3. PSW中的IS用于标记当前Stack Pointer状态. PSW.IS==0时,表示Upper Context已经报保存,A10(SP)已经装入ISP的值.当PSW.IS==1时,表示已经使用的ISP的值(比如中断嵌套),此时SP已经是ISP的值,无须再装入ISP的值.

3. 代码中的堆栈

        3.1 栈(操作系统存局部变量、函数,调用函数时会开辟栈区,函数结束时就自动回收,遵循后进先出的原则,从高地址向低地址增长。

静态内存分配:静态内存是程序编译执行后系统自动分配,由系统自动释放静态内存是栈分配的,特点:不持久。

使用静态内存分配的变量有:全局变量&静态变量

 

        3.2 堆(操作系统) malloc、realloc、calloc等开辟的内存就在堆,从低地址向高地址增长,由程序员分配和释放,系统不自动回收,所以一定要记得申请了就要释放,以免溢出。

在嵌入式系统中,使用堆内存相对于栈内存来说是比较少的。嵌入式系统通常拥有有限的内存资源,而使用堆内存可能会导致内存碎片和性能问题。在嵌入式系统中,通常会限制堆内存的大小,并且使用堆内存时需要非常小心,以确保不会出现内存泄漏或者堆溢出等问题。在某些情况下,嵌入式系统需要使用堆内存,例如当需要动态创建对象或者动态分配数组时。在这种情况下,程序员需要小心地管理堆内存,以确保不会出现内存泄漏或者堆溢出等问题。

动态内存分配:动态内存是开发者手动分配的,是堆分配的。特点:持久。

在C语言中,全局变量分配在内存中的静态存储区非静态的局部变量【动态局部变量】(包括形参)是分配在内存的动态存储区该存储区被称为栈。除此之外,c语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要是随时释放。这些数据临时存在一个特别的自由存储区,称为堆区

4. 如何调试

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cortex-M3与Aurix的堆栈 的相关文章

  • ARM——体系架构

    1 ARM简介 ARM是Advanced RISC Machines的缩写 它是一家微处理器行业的知名企业 该企业设计了大量高性能 廉价 耗能低的RISC 精简指令集 处理器 公司的特点是只设计芯片 而不生产 它将技术授权给世界上许多著名的
  • 09_Uboot启动流程_1

    目录 链接脚本u boot lds详解 U Boot启动流程详解 reset函数源码详解 lowlevel init函数详解 s init函数详解 链接脚本u boot lds详解 要分析uboot的启动流程 首先要找到 入口 找到第一行程
  • 交通路标识别(毕业设计)

    概述 代码获取 可私信 在TensorFlow中实现单镜头多盒检测器 SSD 用于检测和分类交通标志 该实现能够在具有Intel Core i7 6700K的GTX 1080上实现40 45 fps 请注意 此项目仍在进行中 现在的主要问题
  • C++字符串常量跨平台编译问题

    C 字符串常量跨平台编译问题 与字符串编码相关 有需要的朋友可以参考下 问题 在C 代码中 给一个string类型的变量赋值一个中文字符串常量 例如 string s 中文字符串 变量s中保存的字节内容是什么 如果源文件的编码格式转换了 比
  • RTL8762DK PWM(七)

    概述 本示例 只要介绍 如何使用PWM 又离成功进了一步 一 环境 1 硬件 RTL8762DK 128M Bits Falsh 2 软件 keil IDE 二 PWM的使用 1 创建examples ble pwm工程 基于 exampl
  • linux 网络

    网络基础 协议的概念 什么是协议 从应用的角度出发 协议可理解为 规则 是数据传输和数据的解释的规则 假设 A B双方欲传输文件 规定 第一次 传输文件名 接收方接收到文件名 应答OK给传输方 第二次 发送文件的尺寸 接收方接收到该数据再次
  • Zynq7000硬件开发之芯片供电电源功耗(电流)评估

    案头语 单板硬件的主控芯片集成度越来越高 多核处理器越来越多 一块单板可能只需要1块芯片就能满足整体需求 一方面减少设计复杂度 另一面节省PCB面积成本 能同时掌握硬件原理设计以及PCB Layout设计逐渐成为主流 本系列文章同时包含有两
  • 小米汽车,能否在新能源汽车江湖站稳脚跟?

    最近 圈内都在传小米汽车亦庄工厂已试生产近一个月 每周可产50辆样车 正在为首款新能源汽车量产做最后的准备 此前的业绩交流会上 小米集团总裁卢伟冰透露 小米汽车结束了夏测且进展非常顺利 2024年上半年量产的目标明确 同时 界面新闻的报道也
  • linux的应用线程同步与驱动同步机制

    同步机制 在 Linux 应用程序和内核中的驱动程序中 有一些常见的同步机制用于实现线程或进程之间的同步和数据访问保护 下面是它们的一些主要机制 Linux 应用程序中的同步机制 互斥锁 Mutex 用于保护共享资源 确保只有一个线程可以访
  • 极氪汽车的云资源治理细探

    作者 极氪汽车吴超 前言 2021 年 极氪 001 迅速崭露头角 仅用 110 天便创下了首款车型交付量 最快破万 的纪录 2022 年 11 月 极氪 009 在短短 76 天内便率先完成了首批交付 刷新了中国豪华纯电品牌交付速度的纪录
  • Linux学习第17天:pinctrl和gpio子系统开发:由0到1

    Linux版本号4 1 15 芯片I MX6ULL 大叔学Linux 品人间百味 思文短情长 本篇笔记的题目为 pinctrl和gpio子系统开发 由0到1 做嵌入式系统开发 肯定经历过单片机 ARM Linux这么一个过程 这是一个8位单
  • RTOS专栏(一) —— rt-thread简单介绍和qemu使用

    本期主题 简单介绍rt thread 介绍qemu和rt thread怎么配合使用 qemu的简单例子 rt thread qemu 1 rt thread介绍 2 qemu介绍 3 搭建rt thread和qemu开发环境 4 简单例子
  • 汽车信息安全标准ISO/SAE21434与UN/WP.29阅读总结

    1 序言 伴随着汽车与外界的交互手段不断丰富 车联网相关设备 系统间的数据交互更加频繁 万物互联下的网络攻击也逐渐渗透延伸到车联网的领域 这给汽车行业带来了新的 专属挑战 我这几天简要阅读了汽车信息安全领域的几个重要的国际规范 本文就简要讨
  • 【电赛-软件】CCS安装教程

    CCS安装教程 下载 下载地址 下载地址 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img WhFWuuUy 1679146802762 ccspicture ccs download png 选择第二个CCSTU
  • 变速箱壳体铸造件自动化三维测量室厂家自动化检测偏差比对-CASAIM-IS(2ND)

    一 背景介绍 随着制造业的快速发展 对产品质量和生产效率的要求不断提高 壳体铸造件作为一种常见的机械零部件 广泛应用于各个领域 对壳体铸造件的质量可靠性的要求也越来越高 因此 对壳体铸造件进行精确的三维测量显得尤为重要 CASAIM作为自动
  • 学 Linux 必会的 ARM 汇编指令

    学习 Linux 系统启动流程 必须熟悉几个汇编指令 总结给大家 这里不是最全的 只列出一些最常用的汇编指令 一 数据处理指令 1 数据传送指令 MOV指令 把一个寄存器的值 立即数 赋给另一个寄存器 或者将一个常量赋给寄存器 MOV指令的
  • lv12 uboot源码配置编译 8

    目录 1 uboot源码获取 2 uboot特定 3 uboot源码结构 3 1 平台相关代码 3 1 1 arch 3 1 2 board 3 2 平台无关代码 3 2 1 common下放的都是uboot的命令 3 3 配置文件 帮助文
  • linux应用程序直接return与exit的区别

    在Linux应用程序中 可以使用 return 语句直接从 main 函数返回 这将导致程序终止并返回给操作系统 然而 有时候使用 exit 函数比直接使用 return 语句更有优势 以下是一些原因 清理资源 exit 函数可以确保在程序
  • 智能座舱的下一个价值“爆点”——让“光”更智能

    汽车智能化快速升级 智能座舱作为人机交互的主要窗口 交互模态 用户体验也呈现多维度升级 例如 今年下半年上市的多款高端智能车型纷纷基于高性能座舱硬件平台 集成了AR HUD DMS OMS等高阶功能 同时结合超大屏 多屏联动 联动舱内氛围灯
  • 锚定「中央计算+区域控制」,确定性机遇已凸显!

    中央计算 区域控制 的新一代整车电子架构 已经成为车企继电动化 智能化后的新竞争焦点 有关整车计算与域控 业界普遍认为将过去在不同域 座舱 智驾等 功能转移到集中的计算平台 可以更容易地进行整车OTA 以及灵活部署新功能 同时 基于通用操作

随机推荐

  • 【Excel VBA】得到最后数据的行数

    纲举目张 得到最后数据的行数 说明 代码 code 解析 拓展 得到最后数据的行数 说明 在编写代码时我们时常用到的是 取得数据表的最后一行数据所在的行号 这样在编写循环语句时就不用猜着自定义终止值 代码 code Dim FinalRow
  • Vue 的实用开发技巧

    文章目录 v for 中使用 key 何时使用何种key 所以使用 index 作为 key 需要满足 哪何时使用 id 作为 key 呢 v if v else if v else 中使用 key 使用条件 例子 v for 和 v if
  • 共享DLL中使用MFC 和在静态库中使用MFC

    使用VS2008 在项目属性中有一项MFC的使用 有三种设置 1 使用标准Windows库 2 在共享DLL中使用MFC 3 在静态库中使用MFC 第一种顾名思义 第二种指的是打包时一些MFC的DLL的内容没有被包含在EXE文件中 所以EX
  • 树莓派4B 安装preem-PT 实时系统那些坑

    拿到一个树莓派之后 最好uname a 看一下内核版本号 比如同样的树莓派4B 不同出厂批次和时间 是有一定改动的 比如有些是4 14 4 19 而有些是5 4 5 15 等 较新的树莓派如果向下刷固件 比如用树莓派最新的4B 刷ubunt
  • ZooKeeper集群环境搭建

    大数据学习记录篇 持续更新中 个人主页 beixi 本文章收录于专栏 点击传送 大数据学习 持续更新中 感谢各位前辈朋友们支持学习 文章目录 1 ZooKeeper集群环境介绍 2 搭建环境准备 3 搭建步骤 1 ZooKeeper集群环境
  • 网络安全事件应急响应实战

    一 应急响应 1 Window入侵排查 当企业发生黑客入侵 系统崩溃或其它影响业务正常运行的安全事件时 急需第一时间进行处理 使企业的网络信息系统在最短时间内恢复正常工作 进一步查找入侵来源 还原入侵事故过程 同时给出解决方案与防范措施 为
  • hyper-v开启与关闭

    1 控制面板 2 服务 以管理员身份运行msconfig 3 cmd命令 以管理员运行 开启 上次关闭docker服务时 重新启动虚拟化技术执行了上面个两个步骤 未执行下面命令 检查了好久查了网上的资料才想起来 bcdedit set hy
  • java 遍历map 方法 集合 五种的方法

    package com jackey topic import java util ArrayList import java util HashMap import java util Iterator import java util
  • git如何克隆代码

    首先你要去官网安装 Git Downloads 下载好了一直下一步就行 找到一个装文件的文件夹右击 点击git bash here 然后 git clone 加上git上的网址 回车就可以下载了 希望有帮助到你
  • crm服务器 系统盘,crm搭建云服务器

    crm搭建云服务器 内容精选 换一换 购买多台云服务器时 有以下两种方式设置有序的云服务器名称 自动排序 购买多台云服务器时自动按序增加4位数字后缀 正则排序 按照name prefix begin number bits name suf
  • Windows系统缺失crypt32.dll文件导致程序无法运行解决办法

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个crypt32
  • JDBC的两种实现方法及区别

    文章目录 toc JDBC 一 JDBC简介 二 通过DriverManager实现JDBC 三 通过DataSource实现JDBC 四 DataSource和DriverManager的区别 JDBC 一 JDBC简介 JDBC Jav
  • JPA最终对象转换为sql的位置

    这里以spring data jpa 3 1 1版本为例 Jpa最终是采用的hibernate进行数据库查询 因此其最终由对象转为sql的语句可以在 类ConcreteSqmSelectQueryPlan gt 方法listInterpre
  • openMPI在Linux环境下的安装和部署

    Linux环境背景 CentOS7 安装步骤 进入官网openmp org 下载压缩包openmpi 4 1 4 tar gz 将openmpi 4 1 4 tar gz放到 opt文件夹内 解压tar zxvf openmpi 4 1 4
  • vscode ~~出现黄色波浪线,解决办法~

  • SPSS(八)logistic回归(图文+数据集)

    SPSS 八 logistic回归 我们之前的线性回归也好 线性回归衍生方法也好 非线性回归也好 因变量的类型都是连续性的 假如因变量的类型是分类的呢 logistic回归针对的是二分类的因变量 logistic回归 基于线性回归模型发展而
  • VS2010每次调试都出现“此项目已经过期”提示

    问题描述 最近因为项目需要 开发平台从VS2005切换成了VS2010 把一些老项目也转换到VS2010平台 因为是从低到高升级 微软还是做了很多兼容 基本上可以无缝切换 编译调试也基本正常 但是发现有些项目 尤其是比较大的项目 刚刚编译完
  • 1.linux安装oracle12c及测试连接(详细讲解)

    1 虚拟机配置 系统Centos7 6 CPU 4H 内存 4G 硬盘 128G GUI 有 2 安装前准备 2 1配置静态IP 我们是安装服务 一个服务主机IP地址不应该的变化的 所以设置为静态 vim etc sysconfig net
  • 算法练习之反转链表

    比较久没有写算法题了 还是应该复习回顾一下 这次用新学的 rust 语言来解决算法问题 个人认为学习算法题目重要的不是解法 而是解法背后的思想 要从每一道题目中学习到解决问题的思路 定义一个函数 输入一个链表的头节点 反转该链表并输出反转后
  • Cortex-M3与Aurix的堆栈

    1 在ARM Cortex M3架构中 堆栈通常由两个寄存器来管理 主堆栈指针 MSP 和进程堆栈指针 PSP 1 1 MSP是处理器的默认堆栈指针 用于保存中断处理程序的现场 当芯片复位或发生中断时 处理器会自动将MSP的值保存到堆栈中