当前位置: 首页 > news >正文

STM32在bootloader跳转到application时设置MSP

1. 简介

在做bootloader 跳转到application时,经常会看到设置MSP的操作__set_MSP(*(__IO uint32_t*) APPLICATION_ENTRY);

1.1 MSP的作用

在STM32微控制器中,MSP(Main Stack Pointer,主堆栈指针)是一个非常重要的寄存器,它用于管理堆栈。堆栈是用于临时存储数据和保持子程序返回地址的区域。MSP在以下几种情况下发挥关键作用:

  1. 启动时初始化:在系统启动时,MSP会被初始化为向量表中的初始值。这个初始值通常在启动文件(如startup_stm32fxx.s)中定义。

  2. 异常和中断处理:当发生异常或中断时,MSP用于保存当前的程序状态,包括寄存器内容。这样,当异常或中断处理完成后,可以恢复原来的程序状态并继续执行。

  3. 操作系统使用:在使用实时操作系统(RTOS)时,MSP通常用于处理系统级的中断和异常,而每个任务可能有自己的堆栈指针(PSP,Process Stack Pointer)。MSP和PSP的切换由操作系统来管理,以实现任务之间的切换。

  4. 函数调用:在函数调用过程中,MSP用于保存局部变量、函数参数和返回地址。当函数调用结束时,MSP会恢复到调用前的状态。

MSP的值可以通过特定的汇编指令(如MRSMSR)来读取和修改。在C语言编程中,通常不需要直接操作MSP,但在底层驱动开发或调试时,了解MSP的作用和如何操作它是很有帮助的。

下面是一个简单的汇编代码示例,展示如何读取和写入MSP:

MRS R0, MSP  ; 读取MSP的值到R0寄存器
MSR MSP, R0  ; 将R0寄存器的值写入MSP

通过这些操作,可以查看和修改MSP的值,以便进行调试或特定的系统级操作。

1.2 MSP的设置

MSP 通常在特权模式下使用, 由硬件自动管理和切换, 在系统启动时初始化。

  • 系统初始化时,会执行Reset_Handler, 先看下这个函数
Reset_Handler:ldr   r0, =_estackmov   sp, r0          /* set stack pointer *//* Call the clock system initialization function.*/bl  SystemInit/* Copy the data segment initializers from flash to SRAM */ldr r0, =_sdataldr r1, =_edataldr r2, =_sidatamovs r3, #0b LoopCopyDataInit......

从上述代码的可以看出, Reset_Handler_estack加载到SP(堆栈指针), 而_estack在链接文件中定义
/* Highest address of the user mode stack */ _estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */

以STM32G070为例, 在.map文件中可以看到_estack的值

0x20009000                        _estack = (ORIGIN (RAM) + LENGTH (RAM))
0x00000200                        _Min_Heap_Size = 0x200
0x00000400                        _Min_Stack_Size = 0x400

所以上电初始化时, MSP的值应该是 0x20009000.

2. 跳转时是否必须显示的设置MSP的值

2.1 _estack的值存储在哪里

上述1.2节,介绍了_estack的初始化值为0x20009000,但这个值存储在哪个地址?答案是在中断向量表中:

 .section .isr_vector,"a",%progbits.type g_pfnVectors, %objectg_pfnVectors:.word _estack.word Reset_Handler.word NMI_Handler.word HardFault_Handler.word 0.word 0.word 0.word 0.word 0.word 0.word 0.word SVC_Handler.word 0.word 0.word PendSV_Handler.word SysTick_Handler.word WWDG_IRQHandler                   /* Window WatchDog              */.word 0                                /* reserved                     */......

由中断向量表代码段可看出, _estack在向量表的首地址; 查看.map文件:

.isr_vector     0x08000000       0xb80x08000000                        . = ALIGN (0x4)*(.isr_vector).isr_vector    0x08000000       0xb8 ./Core/Startup/startup_stm32g070cbtx.o0x08000000                g_pfnVectors0x080000b8                        . = ALIGN (0x4)

向量表的首地址为isr_vector 0x08000000;所以_estack的值存储在 0x08000000, 值为 0x20009000.
通过JLINK可以读出FLASH里的值
在这里插入图片描述

或者查看hex文件,同样可以找到
在这里插入图片描述

2.2 跳转时设置 MSP

跳转时设置MSP的值:

__set_MSP(*(__IO uint32_t*) APPLICATION_ENTRY);

其中APPLICATION_ENTRY就是application的起始地址, 这里假设APPLICATION_ENTRY = 0x0800a200, 那这个地址理论上存放的也是application的 _estack, 通过JLINK读取这个地址的值验证:
在这里插入图片描述

所以,__set_MSP(*(__IO uint32_t*) APPLICATION_ENTRY);这句话的意思也就是把application的_estack赋值给MSP。

2.3 跳转时不显式的设置MSP

如果跳转时不加__set_MSP(*(__IO uint32_t*) APPLICATION_ENTRY);, 会不会有问题?
先看跳转的代码:

// Start applicationdw_reset = *(uint32_t *)(APPLICATION_START);pf_reset = (t_VOID_FUNC)( dw_reset );pf_reset();

这里APPLICATION_START = 0x0800A204,也就是bootloader 直接跳转到application的 Reset_Handler。至此,又回到了1.2节, 在Reset_Handler里会自动将 _estack的值赋给SP。
所以,如果Reset_Handler里设置了SP的值,则跳转时,不是必须要显式的设置MSP的值。

相关文章:

STM32在bootloader跳转到application时设置MSP

1. 简介 在做bootloader 跳转到application时,经常会看到设置MSP的操作__set_MSP(*(__IO uint32_t*) APPLICATION_ENTRY);。 1.1 MSP的作用 在STM32微控制器中,MSP(Main Stack Pointer,主堆栈指针)是一个非常重要的…...

SDMTSP:黑翅鸢算法(Black-winged kite algorithm,BKA)求解单仓库多旅行商问题,可以更改数据集和起点(MATLAB代码)

一、黑翅鸢算法BKA 黑翅鸢算法(Black-winged kite algorithm,BKA)由Wang Jun等人于2024年提出,该算法受黑翅鸢的迁徙和掠食行为启发而得。BKA集成了柯西突变策略和领导者策略,增强了算法的全局搜索能力,提…...

我们来学mysql -- 区分大写

区分大写 题记大小写不敏感文件文件系统大小写敏感文件文件系统mysql认不认大小写lower_case_table_names 题记 混沌初开,万物共享盛世,自由自在好不快活然,人性难掩,初露獠牙,喊杀一片,好不热闹族群&…...

显示器“刷新率”的通俗理解

显示器刷新率的定义 显示器的刷新率(Refresh Rate)是指屏幕每秒刷新图像的次数,以赫兹(Hz)为单位。比如,刷新率为 60Hz 表示屏幕每秒能够刷新 60 次图像。 刷新率是显示器硬件特性的一部分,定…...

25计软新增考研院校!或可捡漏上岸!

C哥专业提供——计软考研院校选择分析专业课备考指南规划 新增的计算机与软件工程考研院校为考研同学带来了多方面的机遇,这些机遇不仅体现在过国家线后可能面临的更低竞争压力,还包括更多元化的教育选择和更广阔的就业前景: 一、降低竞争压…...

[入门JAVA数据结构 JAVADS] 哈希表的初步介绍和代码实现

目录 前言 哈希表的概念和诞生的原因 哈希冲突 简单实现哈希表 基本属性 插入 获取key的val 计算负载因子 扩容(难点) 完整代码(方便大家复制自己去调试) 数据是int的 使用泛型实现的 结尾 前言 笔者鸽了接近两个月后决定"勤政"了.尽力把学过的知识写下…...

谷歌外链好不好,关键看“搭配”!

做SEO的人都知道外链很重要,但有一个误区是只追求“高质量外链”,却忽略了外链结构的合理性。其实,外链就像饮食,光吃好东西不够,营养搭配得当才能健康发展。 谷歌对外链的要求,不仅是看它是不是dofollow、…...

【AI驱动的数据结构:包装类的艺术与科学】

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” 文章目录 包装类装箱和拆箱阿里巴巴面试题 包装类 在Java中基本数据类型不是继承来自Object,为了…...

ElasticSearch 的核心功能

要深入理解 ElasticSearch 的核心功能,需要全面掌握其 全文搜索、分析、聚合 和 索引生命周期管理(ILM) 的设计原理和实际应用。 1. 全文搜索 ElasticSearch 的全文搜索是其核心功能之一,依赖于倒排索引和强大的分词、相关性评分…...

任务2 配置防火墙firewalld

基本概念 概述 支持动态更新防火墙规则 不重启即可创建、修改和删除规则 使用区域和服务来简化防火墙配置 区域 一组预定义的规则,防火墙策略集合(或策略模板) 把网络分配到不同的区域中,并为网络及其关联的网络接口或流量源…...

PHP入门到高级 -- 学习基础语法和概念

学习PHP的基础语法和概念是成为一名高级PHP开发者的关键。以下是一个逐步学习PHP并逐渐深入了解其高级特性的指南。 学习基础语法: 变量和数据类型:了解如何声明和使用变量,以及PHP支持的不同数据类型。运算符:掌握算术&#xf…...

MKS SERVO42E57E 闭环步进电机_系列5 串口(RS485)通讯示例

第1部分 产品介绍 MKS SERVO42E/57E 闭环步进电机是创客基地为满足市场需求,按工业级标准自主研发的一款产品。具备脉冲接口、RS485接口以及CAN接口,内置高效FOC矢量算法,采用高精度编码器,通过位置反馈,有效防止电机…...

自然语言编写的prompt为啥比不上编程语言prompt高效?

为什么会这样?从底层逻辑开始分析 这个问题本质上是在比较两种完全不同的"语言系统"。 就像去一家餐厅点菜,你可以说"我想来一份不太咸、稍微辣一点的宫保鸡丁"(自然语言),也可以直接在平板上点…...

C#—LINQ详解及汇总

LINQ详解及汇总 LINQ(Language Integrated Query)是微软的一项技术,允许开发者以一种简洁的方式查询和操作数据,支持多种数据源,包括对象、数据库、XML和数据集。LINQ定义了约40个查询操作符,如select、fr…...

WebGAL 项目下载及安装教程

WebGAL 项目下载及安装教程 WebGAL A brand new web Visual Novel engine | 全新的网页端视觉小说引擎 [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/web/WebGAL 1、项目介绍 WebGAL 是一个全新的网页端视觉小说引擎,旨在提供美观、功能强大且易于…...

虚幻引擎游戏开发系列专题-官方编码标准或规约

遵守既定标准和最佳实践来编写可维护的代码。在虚幻游戏引擎中,存在着一些既定的编码标准和约定 ,养成良好的编码规范是写好一份优雅代码的第一步,并且在虚幻官方也强调了,某些编码标准的遵循是强制性的。 编码规约对程序员来说意味着什么 在软件开发中,软件生命周期的80%的成…...

n阶Legendre多项式正交性的证明

前言 在《n次Legendre(勒让德)多项式在区间(-1, 1)上根的分布及证明》这篇文章中,我们阐述了Legendre多项式在 [ − 1 , 1 ] [-1,1] [−1,1]上的根分布情况并给出了证明。本文将证明Legendre多项式在 [ − 1 , 1 ] [-1,1] [−1,1]上的正交性质。 正交多项式的定义…...

初学stm32 --- PWM输出

目录 STM32 PWM工作过程​编辑 STM32 PWM工作过程(通道1为例) PWM模式1 & PWM模式2 向上计数配置说明​编辑 STM32 定时器3输出通道引脚 自动重载的预装载寄存器 ​编辑 PWM输出相关库函数 输出比较初始化函数: 设置比较值函数&a…...

Git:查看分支、创建分支、合并分支

一、查看分支 查看的git命令如下: git branch # 列出本地已经存在的分支,并且当前分支会用*标记 git branch -r # 查看远程版本库的分支列表 git branch -a # 查看所有分支列表(包括本地和远程,remotes/开头的表示远程分支&…...

爬虫学习案例8

爬取京东评论信息 采用DrissionPage自动化工具采集,感觉比Selenium工具好,真香。 安装第三方库 pip install DrissionPage pip install pandas pip install pyecharts pip install jieba pip install wordcloud1.安装DrissionPage库 DrissionPage安装…...

git 提交代码无法连接:Failed to connect to github.com port 443 after 21060 ms

项目场景: 在能够访问github仓库的情况下,生成本地代码并提交到github上时会遇到提交不成功的问题,如下: fatal: unable to access ‘https://github.com/Pitt-ding/opc_comm.git/’: Failed to connect to github.com port 443 …...

麒麟系统修改配置镜像源地址并安装openGL

1.编辑文件/etc/apt/sources.list 进入目录 cd /etc/apt/ 编辑文件(需要root权限) sudo vi sources.list 将镜像地址改为你指定的镜像地址 #deb http://archive.kylinos.cn/kylin/KYLIN-ALL 10.1 main restricted universe mul tiverse #deb http:…...

如何使用Navigator实现导航功能

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了Widget的State,本章回中将介绍Route和Navigator,闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 到目前为止,我们介绍的内容都在一个页面中,本章回中将介绍中在Flutter中如何进行页面切换,这里说的页面切…...

MyBatis-Plus分页拦截器,源码的重构(重构total总数的计算逻辑)

1.1创建ThreadLocal工具类&#xff08;作为业务逻辑结果存放类&#xff09; package org.springblade.sample.utils;public class QueryContext {private static final ThreadLocal<Long> totalInThreadLocal new ThreadLocal<>();public static void setTotalIn…...

Jmeter对图片验证码的处理【超详细】

Jmeter对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过jmeter对图片验证码…...

匈牙利算法

匈牙利算法 1 概念2 依据3 目的4步骤5 案例6 测试 1 概念 匈牙利算法基于代价矩阵找到最小代价的分配方法&#xff0c;是解决分配问题中最优匹配(最小代价)的算法。 2 依据 代价矩阵的行或列同时加或减一个数&#xff0c;得到新的代价矩阵的最优匹配与原代价矩阵相同。 3 目…...

nginx学习总结(不包含安装过程)

1. nginx常见配置 http服务上支持【若干虚拟主机】。每个虚拟主机对应一个server配置项&#xff0c;配置项里面包含该虚拟主机相关的配置。 server{listen 80 default;server_name www.yonqin.com;index index.html index.htm index.php;root /data/www;location ~ .*\.(gif|…...

Android10 rk3399 以太网接入流程分析

Netd守护进程服务 Netd模块是Android中专门负责网络管理和控制的后台守护进程开发板路径./etc/init/netd.rc service netd /system/bin/netdclass mainsocket dnsproxyd stream 0660 root inetsocket mdns stream 0660 root systemsocket fwmarkd stream 0660 root inetonres…...

HTML与数据抓取:GET与POST方法详解

讲GET和POST就不能只讲GET和POST 你要讲HTTP请求的基本概念&#xff1a; HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最为广泛的一种网络协议&#xff0c;主要用于Web浏览器与Web服务器之间的数据通信。HTTP是一个基于…...

DG常用启动方法与异常查找

--查看主库的状态&#xff1a; select a.inst_id,a.db_unique_name,a.database_role, a.protection_level,a.protection_mode,a.open_mode,a.log_mode,a.switchover_status, b.host_name,b.thread# from gv$database a left join gv$instance b on a.inst_idb.inst_id order by…...

C++ OpenGL学习笔记(4、绘制贴图纹理)

相关链接&#xff1a; C OpenGL学习笔记&#xff08;1、Hello World空窗口程序&#xff09; C OpenGL学习笔记&#xff08;2、绘制橙色三角形绘制、绿色随时间变化的三角形绘制&#xff09; C OpenGL学习笔记&#xff08;3、绘制彩色三角形、绘制彩色矩形&#xff09; 通过前面…...

以二进制形式创建gitea仓库

1、官方文档&#xff1a; 数据库准备 | Gitea Documentation 使用二进制文件安装 | Gitea Documentation 2、具体操作 1&#xff09;创建gitea数据库 2&#xff09;检查是否安装 Git。要求 Git 版本 > 2.0。 如需升级git请参考以下链接&#xff1a;linux升级git版本-C…...

数据库系统原理:数据库安全性与权限控制

2.1vue技术 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。 [5] 与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项…...

bugkctf 渗透测试1超详细版

bugkctf 渗透测试1 下发环境进行访问 场景1 通过查看网页源代码成功找到1个flag 得到flag和提示 <!--flag{950d83a16ad47127859d414009432171} PS&#xff1a;下个flag网站管理员才能看到哦-->场景2 根据提示需要管理员权限&#xff0c;进行登录,直接登录需要邮箱和…...

window安装TradingView

目录 下载安装包 修改文件后缀&#xff0c;解压 将K线换成国内涨红跌绿样式 下载安装包 https://www.tradingview.com/desktop/ 下载完成后是.msix格式文件 &#xff08;我在win10和win11的系统中尝试运行msix都没有成功&#xff0c;所以放弃直接双击运行msix&#xff…...

网络下载ts流媒体

网络下载ts流媒体 查看下载排序合并 很多视频网站&#xff0c;尤其是微信小程序中的长视频无法获取到准确视频地址&#xff0c;只能抓取到.ts片段地址&#xff0c;下载后发现基本都是5~8秒时长。 例如&#xff1a; 我们需要将以上地址片段全部下载后排序后再合成新的长视频。 …...

log4j2漏洞复现(CVE-2021-44228)

靶场环境 步骤一&#xff1a;设置出战规则 步骤二&#xff1a;开启靶场 cd vulhub cd log4j cd CVE-2021-44228 docker-compose up -d docker ps 访问端口 靶机开启 步骤三&#xff1a;外带注入 获得dnslog 靶机访问dnslog 得到dnslog的二级域名信息 步骤四&#xff1a;构造…...

应用(APP)部署容器化演进之路

应用&#xff08;Application&#xff09;部署容器化演进之路 一、应用程序部署痛点 1.1 应用程序部署流程 举例&#xff1a;部署一个JAVA编程语言开发的Web应用&#xff0c;以War包放入Tomcat方式部署。 部署过程如下&#xff1a; 服务器配置运行环境:JAVA代码运行环境&am…...

Pytorch | 从零构建EfficientNet对CIFAR10进行分类

Pytorch | 从零构建EfficientNet对CIFAR10进行分类 CIFAR10数据集EfficientNet设计理念网络结构性能特点应用领域发展和改进 EfficientNet结构代码详解结构代码代码详解MBConv 类初始化方法前向传播 forward 方法 EfficientNet 类初始化方法前向传播 forward 方法 训练过程和测…...

Saprk和Flink的区别

1 、设计理念方面 Spark 的技术理念是使用微批来模拟流的计算&#xff0c;基于 Micro-batch &#xff0c;数据流以时间为单位被切分为一个个 批次&#xff0c;通过分布式数据集RDD 进行批量处理&#xff0c;是一种伪实时。 Flink 是基于事件驱动的&#xff0c;是面向流的处理…...

Spring Boot 动态定时任务管理系统(轻量级实现)

Spring Boot项目中&#xff0c;实现动态增删和启停定时任务的功能对于许多应用场景来说至关重要。虽然Quartz框架是一个广泛使用的解决方案&#xff0c;但其复杂性和重量级特性可能使得项目变得臃肿和难以维护。为了解决这个问题&#xff0c;本项目旨在实现一个轻量级的定时任务…...

开发微信小程序的过程与心得

起因 作为家长&#xff0c;我近期参与了学校的护学岗工作。在这个过程中&#xff0c;我发现需要使用水印相机来记录护学活动&#xff0c;但市面上大多数水印相机应用都要求开通会员才能使用完整功能。作为一名程序员&#xff0c;我决定利用自己的技术背景&#xff0c;开发一个…...

项目代码第6讲:UpdownController.cs;理解 工艺/工序 流程、机台信息;前端的“历史 警报/工艺 记录”

一、UpdownController.cs 1、前端传入 当用户在下图的“记录查询”中的 两个界面选项 中,点击“导出”功能时,向后端发起请求,请求服务器下载文件的权限 【权限是在Program.cs中检测的,这个控制器里只需要进行“谁在哪个接口下载了文件”的日志记录】 【导出:是用户把…...

Apache RocketMQ 5.1.3安装部署文档

官方文档不好使&#xff0c;可以说是一坨… 关键词&#xff1a;Apache RocketMQ 5.0 JDK 17 废话少说&#xff0c;开整。 1.版本 官网地址&#xff0c;版本如下。 https://rocketmq.apache.org/download2.配置文件 2.1namesrv端口 在ROCKETMQ_HOME/conf下 新增namesrv.pro…...

uni-app开发收货地址管理

目录 一:功能描述 二:功能实现 一:功能描述 收货地址在个人中心的我的地址里面,点击我的地址可以查看我的收货地址列表,可以新增收货地址,点击特定收货地址可以编辑和删除该地址信息。 二:功能实现 1:收货地址列表 <view v-for="(item, index) in data_lis…...

BOE(京东方)“向新2025”年终媒体智享会落地成都 持续创新引领产业步入高价值增长新纪元

12月20日,BOE(京东方)“向新 2025”年终媒体智享会的脚步从上海延伸至成都。川渝之地,作为 BOE(京东方)产业生态战略布局中的关键一子,此刻再度成为行业瞩目的焦点。本次活动全面回溯了BOE(京东方)在2024年多个关键领域斩获的斐然佳绩,深入剖析了六大维度构建的“向新”发展格局…...

JavaWeb - ⭐ AOP 面相切面编程原理及用户校验功能实战

一、概述 定义&#xff1a; AOP (Aspect Oriented Programming 面向切面编程) &#xff0c;一种面向方法编程的思想 功能&#xff1a;管理 bean 对象的过程中&#xff0c;通过底层的动态代理机制对特定方法进行功能的增强或改变 实现方式&#xff1a;动态代理技术&#xff0c…...

鸿道Intewell工业操作系统,三大关键技术,领跑行业前沿

鸿道工业操作系统&#xff0c;是软件定义控制的工业实时操作系统&#xff0c;具备三大关键技术&#xff1a; 1、确定性计算与高实时响应(微秒级、关键指标) 提供确定性的计算与高实时的系统环境&#xff0c;保障工业生产运作的灵活高效。 2、微内核、并发处理(微内核的强大…...

java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)

在 Java 中封装 ElasticSearch&#xff08;ES&#xff09;数据库操作&#xff08;ES版本之间变动挺大的&#xff0c;别轻易换版本&#xff09;&#xff0c;可以使得与 ES 的交互更加简洁和易于维护。通过封装常见的操作&#xff0c;如插入文档、查询、更新和删除等&#xff0c;…...

HarmonyOS NEXT 技术实践-基于基础视觉服务实现骨骼点识别

本示例展示了如何在HarmonyOS Next中实现基于基础视觉服务的骨骼点识别功能。骨骼点识别是计算机视觉中的一项重要技术&#xff0c;广泛应用于运动分析、健身监控和增强现实等领域。通过使用HarmonyOS Next提供的视觉API&#xff0c;开发者能够轻松地对人物图像进行骨骼点检测&…...