IAP在线升级二

news/2025/3/18 13:49:22/文章来源:https://www.cnblogs.com/Charles-Hui/p/18503141

一.分析JumpToApp函数

点击查看代码
void JumpToApp(uint32_t addr)
{	__disable_irq();//这个函数调用会禁用中断。在跳转到新的应用程序之前,通常需要确保当前的中断状态不会干扰跳转过程。uint32_t sp = *((volatile uint32_t *)(addr));//从addr指定的地址读取栈指针(Stack Pointer,SP)的值。volatile关键字告诉编译器不要优化这部分代码,因为它可能会在程序执行过程中改变。uint32_t pc = *((volatile uint32_t *)(addr + 4));//从addr + 4的地址读取程序计数器(Program Counter,PC)的值,这是新应用程序的入口地址。typedef void (*Func_void_void)(void);Func_void_void ResetHandler = (Func_void_void)pc;//将pc的值转换为Func_void_void类型的函数指针,并将其赋值给ResetHandler变量。SCB->VTOR = addr;//设置向量表偏移寄存器(Vector Table Offset Register,VTOR)的值为addr。这个寄存器定义了中断向量表的起始地址。在跳转到新应用程序时,需要更新这个寄存器,以便中断能够正确地跳转到新应用程序的中断处理函数。					__set_MSP(sp);//设置主堆栈指针(Main Stack Pointer,MSP)为从addr读取的栈指针值。这是为了确保新应用程序能够使用正确的堆栈。ResetHandler();//调用ResetHandler函数,这实际上是跳转到新应用程序的入口点。while(1) __NOP();//在跳转到新应用程序后,如果函数返回,这将导致程序进入一个无限循环,执行空操作(No Operation,NOP)。这通常是为了防止程序返回到旧的上下文中。
}#define FLASH_APP1_ADDR		0x00008000
JumpToApp(FLASH_APP1_ADDR);	

二.三个核心寄存器

  • 1.三级流水线
    ARM-CPU属于属于精简指令集,三级流水线。取指、译指、执行。

    ARM指令是三级流水线,取指,译指,执行时同时执行的,现在PC指向的是正在取指的地址,那么cpu正在译指的指令地址是PC-4(ARM RISC指令集,通常一个基础指令占4个字节),cpu正在执行的指令地址是PC-8,也就是说PC所指向的地址和现在所执行的指令地址相差8。
    当突然发生中断的时候,保存的是PC的地址
    如果返回的时候返回PC,那么中间就有一个指令没有执行,所以用SUB pc lr-irq

  • 2.寄存器介绍
    SP寄存器(R13):堆栈指针,SP总是指向栈顶。
    LR寄存器(R14):LR寄存器存的是,执行子函数后,PC指针应该跳转回去的地方。
    PC寄存器(R15): 程序计数器,内部存的值是当前执行到了哪个地址;PC 总是指向“正在取指”的指令

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

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

相关文章

动态语言有哪些

在开头段落,请允许我一句言归正传地回答这个问题:动态语言主要有Python、JavaScript、Ruby、Perl、PHP和Groovy等。这类语言的主要特点是它们在运行期间能够改变其结构,如新的函数、对象、甚至代码可以被引入,已有的函数可以被删除或其他结构上的改变。这使得动态语言在写代…

C堆和栈的区别有哪些

在C编程中,堆和栈是两个重要的内存管理概念,它们在:1.分配方式;2.生命周期;3.内存管理;4.访问速度;5.使用场景等方面有明显的区别。本文将深入探讨C堆和栈之间的区别,以帮助程序员更好地理解如何使用它们。1.分配方式 堆:堆是动态分配的内存区域,程序员可以在运行时请…

激光雷达和毫米波雷达的区别

本文将深入探讨激光雷达(Lidar)和毫米波雷达(Millimeter Wave Radar)这两种远程感测技术之间的区别。虽然它们都用于测量距离和位置,但它们采用不同的传感技术和工作原理。我们将在以下几个方面详细比较激光雷达和毫米波雷达:工作原理、应用领域、性能受限因素和成本等方…

Paper Reading: Multi-class Imbalance Classification Based on Data Distribution and Adaptive Weights

针对当前多分类不平衡问题仅依靠不平衡比,以及数据集的不平衡信息无法在训练过程中动态调整的问题。本文首先提出了基于自适应分布的样本权值,将类间不平衡比、类内密度变量和自适应裕度综合起来处理多类不平衡。接着将提出的自适应样本权值与 AdaBoost 学习框架相结合,提出…

CRM工具中纷享销客、销售易怎么样

CRM系统对公司业务开展很有必要,它是对于销售机会的预先判定和年度战略决策依据。研究机构softwarepath调研了100家正在使用CRM的公司,结论是CRM完成选型的平均时间是11周,公司规模越大,选型时间越长。其中一个重要原因在于:无论国内国外,CRM都是竞争相当激烈的市场,你会…

redis安装与部署

一、下载 1、华为镜像站下载https://mirrors.huaweicloud.com/redis/2、将下载的资料包上传到Linux中3、解压缩文件tar -zxvf redis-7.0.10.tar.gz4、安装gcc,和tclyum install -y gcc yum install -y tcl5、进入解压目录执行下面的命令make MALLOC=libc6、编译完成后执行如下命…

如何进行多线程优化?

为了提高程序的运行效率,多线程优化成为了一种重要的方法。本文将详细指导你如何进行多线程优化:1.识别并行化机会;2.保证线程安全;3.选择正确的并发工具;4.避免死锁和竞态条件;5.优化线程间的通信。为了成功地实施多线程优化,首先需要了解程序的瓶颈所在。1.识别并行化…

E71 树形DP+二分 P3523 [POI2011] DYN-Dynamite

视频链接: P3523 [POI2011] DYN-Dynamite - 洛谷 | 计算机科学教育新生态// 树形DP+二分 O(nlogn) #include <iostream> #include <cstring> #include <algorithm> using namespace std; int read(){int x=0,f=1;char c=getchar();while(c>9||c<0)…

聊聊gitlab免费版和收费版本有哪些区别

GitLab,一款受欢迎的代码托管和持续集成工具,有多个版本,包括免费版(GitLab Community Edition)和多种收费版本(GitLab Enterprise Edition)。这些版本主要有以下不同:1、功能上的差异;2、性能与可扩展性;3、专业支持;4、集成与API;5、定价与许可;6、安全性与合规…

PHP与Ruby on Rails的性能比较

在比较PHP与Ruby on RAIls的性能时,我们需要考虑几个关键因素:执行速度、资源消耗、开发效率、社区支持、以及应用场景。PHP是一种广泛使用的开源脚本语言,执行速度快、资源消耗相对较低,尤其适合用于Web开发。相比之下,Ruby on Rails是一个基于Ruby的全栈Web应用框架,它…

perror和fprintf有什么区别

perror 和 fprintf 是两个不同的函数,虽然它们都可以用于输出信息,但有几个关键的区别: 1. 功能和用途perror:专门用于输出与系统错误相关的消息。根据全局变量 errno 的值生成相应的错误信息。自动处理错误描述,方便用于错误处理场景。fprintf:用于格式化输出任意类型的信…

计量经济学(十四)——面板数据模型的固定效应和随机效应

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 面板数据模型是一类常见于经济学、社会科学等领域的计量经济模型,广泛用于分析具有时间维度和个体维度的多维数据。相比于传统的横截面数据模型或时间序列模…