Cortex-M3与Aurix的堆栈

1. TC397是一个基于ARM Cortex-M3内核的微控制器芯片,其堆栈是由系统初始化代码初始化的。在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. 如何调试

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

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

相关文章

12.0、Java_IO流 - 字节数组输入输出流

12.0、Java_IO流 - 字节数组输入输出流 字节数组流: ByteArrayInputStream 和 byteArrayOutputStream 经常用在需要流和数组之间转化的情况; 字节数组输入流: 说白了,FileInputStream 是把文件当做数据源;ByteArrayInp…

【vue】路由的搭建以及嵌套路由

目的:学习搭建vue2项目基础的vue路由和嵌套路由 1.npm 安装 router npm install vue-router3.6.52.src下新建文件夹router文件夹以及文件index.js index.js import Vue from vue import VueRouter from "vue-router" import Home from ../views/Home.…

H3C-Cloud Lab实验-NAT实验

实验拓扑图: IP地址规划: 实验需求: 1. 按照图示配置 IP 地址 2. 私网 A 通过 R1 接入到互联网,私网 B 通过 R3 接入到互联网 3. 私网 A 内部存在 Vlan10 和 Vlan20,通过 R1 上单臂路由访问外部网络 4. 私网 A 通过…

【数据结构常见七大排序(二)】—选择排序篇【直接选择排序】And【堆排序】

目录 前言 1.直接选择排序 1.1基本思想 1.2直接选择排序实现过程 1.3动图助解 1.4直接选择排序源码 2.堆排序 2.1堆排序的概念 2.2堆排序源码 前言 选择排序有两种常见的【直接选择排序】、【堆排序】 1.直接选择排序 1.1基本思想 每一次从待排序的数据元素中选出最…

(数据结构)(C++)数组——约瑟夫环求解

#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream>#define MaxSize 10using namespace std;void josephus(int n,int m)//一共n个人数到m的出列 {int p[MaxSize];int i,j,t;for(i0;i<n;i){p[i]i1;//构建初始序列&#xff08;1,2,3,4.....) } t0;//首次报数起始位…

接口测试原理及Postman详解

接口测试定义 接口是前后端沟通的桥梁&#xff0c;是数据传输的通道&#xff0c;包括外部接口、内部接口。内部接口又包括:上层服 务与下层服务接口&#xff0c;同级接口 生活中常见接口&#xff1a;电脑上的键盘、USB接口&#xff0c;电梯按钮&#xff0c;KFC下单 接口测试…

解决Bridge材质导入到Blender为白色的问题

文章目录 前言一、复现问题二、解决方案总结 前言 一、复现问题 在Bridge上看到一块不错的草皮, 导入成功后是白色材质: 二、解决方案 以前用这个方法导入过模型, 那时候还没启用汉化, 也没什么材质问题. 这次操作之前刚启用了汉化, 我猜是汉化导致: 取消勾选’新建数据’, 重…

layui介绍以及登录功能的实现

一. layui简介 1.1 layui介绍 Layui 是一套开源免费的 Web UI 组件库&#xff0c;采用自身轻量级模块化规范&#xff0c;遵循原生态的 HTML/CSS/JavaScript 开发模式&#xff0c;非常适合网页界面的快速构建。Layui 区别于一众主流的前端框架&#xff0c;它更多是面向于后端开…

XSS 攻击的检测和修复方法

XSS 攻击的检测和修复方法 XSS&#xff08;Cross-Site Scripting&#xff09;攻击是一种最为常见和危险的 Web 攻击&#xff0c;即攻击者通过在 Web 页面中注入恶意代码&#xff0c;使得用户在访问该页面时&#xff0c;恶意代码被执行&#xff0c;从而导致用户信息泄露、账户被…

MAYA鲨鱼的绑定

最后一个柚有问题 轴向正确的旋转&#xff0c;成C型 弄乱了 W整体移动 D单个移动 X轴没指向下一个关节 控制器创建 根控制器 控制器很好匹配关节 建组 出来了&#xff0c;控制器位置还在 确保旋转关节是0 处理层级 控制器不跟着 没办法刷蒙皮 # 错误: file: H:/Autodesk/May…

浅谈物联网在电力行业的应用

摘要&#xff1a;随着社会经济的快速发展&#xff0c;物联网技术也在各个行业中得到了广泛的应用&#xff0c;特别是在电力行业中应用物联网技术&#xff0c;也有效的促进了电力行业的现代化发展。而物联网与智能电网同样都是当代重要的高新技术以及新兴产业。所以通过对于物联…

Redis+IDEA极速了解和实现单机锁和分布式锁

单机下&#xff1a; 只适用于单机环境下&#xff08;单个JVM&#xff09;&#xff0c;多个客户端访问同一个服务器 1.synchronized package com.cloud.SR.controller;import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.cor…