【裸机开发】Reset 中断服务函数(汇编实现)

news2024/12/25 9:08:34

目录

一、Reset 中断服务函数的实现步骤

二、汇编实现 Reset 中断服务函数

1、禁止/打开全局中断

2、设置SP指针

3、清除 .bss 段

4、完整 Reset 中断服务函数


一、Reset 中断服务函数的实现步骤

实现 Reset 中断服务函数的基本步骤如下:

  • 设置各个模式下的SP指针。当中断发生后,会进入到对应的工作模式下,每个工作模式下要运行程序,肯定要用到栈,因此我们需要初始化不同模式下的栈指针。
  • 清除 bss 段。
  • 跳转到 main 函数。

有的时候我们为了防止执行中断服务函数的时候,不会被其他更高优先级的中断打断,我们可以在最开始禁止全局中断(禁止 IRQ、FIQ中断),然后在末尾打开全局中断。

  • 禁止全局中断
  • 设置各个模式下的SP指针
  • 清除 bss 段
  • 打开全局中断
  • 跳转到 main 函数

二、汇编实现 Reset 中断服务函数

1、禁止/打开全局中断

这里我们可以操作 CPSR 寄存器来实现,但汇编给我们提供了简单快捷的指令来禁用/打开全局中断

指令描述
cpsid i禁止IRQ中断
cpsie i使能IRQ中断
cpsid f禁止 FIQ 中断
cpsie f使能 FIQ 中断

2、设置SP指针

ARM 一共有九种工作模式,但是这里我们不打算一个个设置,只设置一些可能会用到的,比如 SVC、IRQ、USER、SYS 等。因为 SYS 和 USER 模式共用一个SP指针,即共用一个栈,所以二选一设置即可。(每种模式下的栈都给 2 M 大小

每一种模式下的 SP 设置方式都类似:

  • 修改 CPSR 寄存器切换到某一模式下
  • 设置该模式下的SP指针(R13寄存器)

/* 切换到 SVC 模式 */
mrs r0, cpsr                @ 将 cpsr 寄存器的内容读取到 r0 寄存器
bic r0, r0, #0x1f           @ 将 r0 的低五位清零,运算结果放到 r0
orr r0, r0, #0x13           @ 让 r0 的低五位或上 10011(0x13),结果保存到 r0
msr cpsr, r0                @ 将 r0 的值写入到 cpsr 寄存器
ldr sp,=0x80200000          @ 设置栈指针

/* 切换到 SYS 模式 */
mrs r0, cpsr                @ 将 cpsr 寄存器的内容读取到 r0 寄存器
bic r0, r0, #0x1f           @ 将 r0 的低五位清零,运算结果放到 r0
orr r0, r0, #0x1f           @ 让 r0 的低五位或上 11111(0x1f),结果保存到 r0
msr cpsr, r0                @ 将 r0 的值写入到 cpsr 寄存器
ldr sp,=0x80400000          @ 设置栈指针

/* 切换到 IRQ 模式 */   
mrs r0, cpsr                @ 将 cpsr 寄存器的内容读取到 r0 寄存器
bic r0, r0, #0x1f           @ 将 r0 的低五位清零,运算结果放到 r0
orr r0, r0, #0x12           @ 让 r0 的低五位或上 10010(0x12),结果保存到 r0
msr cpsr, r0                @ 将 r0 的值写入到 cpsr 寄存器
ldr sp,=0x80600000          @ 设置栈指针

3、清除 .bss 段

4、完整 Reset 中断服务函数

/* 复位中断 */ 
Reset_Handler:
    cpsid i                     /* 禁止IRQ */
    cpsid f                     /* 禁止FIQ */

    /* 切换到 SVC 模式 */
    mrs r0, cpsr                @ 将 cpsr 寄存器的内容读取到 r0 寄存器
    bic r0, r0, #0x1f           @ 将 r0 的低五位清零,运算结果放到 r0
    orr r0, r0, #0x13           @ 让 r0 的低五位或上 10011(0x13),结果保存到 r0
    msr cpsr, r0                @ 将 r0 的值写入到 cpsr 寄存器
    ldr sp,=0x80200000          @ 设置栈指针

    /* 切换到 SYS 模式 */
    mrs r0, cpsr                @ 将 cpsr 寄存器的内容读取到 r0 寄存器
    bic r0, r0, #0x1f           @ 将 r0 的低五位清零,运算结果放到 r0
    orr r0, r0, #0x1f           @ 让 r0 的低五位或上 11111(0x1f),结果保存到 r0
    msr cpsr, r0                @ 将 r0 的值写入到 cpsr 寄存器
    ldr sp,=0x80400000          @ 设置栈指针

    /* 切换到 IRQ 模式 */   
    mrs r0, cpsr                @ 将 cpsr 寄存器的内容读取到 r0 寄存器
    bic r0, r0, #0x1f           @ 将 r0 的低五位清零,运算结果放到 r0
    orr r0, r0, #0x12           @ 让 r0 的低五位或上 10010(0x12),结果保存到 r0
    msr cpsr, r0                @ 将 r0 的值写入到 cpsr 寄存器
    ldr sp,=0x80600000          @ 设置栈指针

    /* bss 段清零 */
    ldr r0, =__bss_start
    ldr r1, =__bss_end
    mov r2, #0
    bl bss_loop                 @ 跳转到 bss_loop,LR寄存器自动保存下一条指令地址

    cpsie f                     /* 使能FIQ */
    cpsie i                     /* 使能IRQ */

    b main                      @ 跳转到 main 函数

bss_loop:
    stmia, r0!, {0}
    cmp r0, r1
    bne bss_loop

    mov pc, lr                  @ 清零完毕后回到原位置

跳转指令参考:b、bl 跳转指令

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关联式容器set和map

文章目录 一.容器二.set的介绍1.insert2.lower_bound&&upper_bound3.find和countfindcount 三. multiset四.map最特别的operator[] 四.multimap,因为允许键值冗余,所以它没有operator[],它的find返回的是中序遍历第一次遇到的节点五.…

ChatGPT办公自动化实战

ChatGPT从入门到精通,一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定 让ChatGPT帮你高效实现职场办公!行动起来吧 1、ChatGPT从入门到精通,一站式掌握办…

对象的销毁

析构函数 C 中的类可以定义一个特殊的清理函数 这个特殊的清理函数叫做析构函数析构函数的功能与构造函数相反 定义&#xff1a;~ClassName() 析构函数没有参数也没有返回值类型声明析构函数在对象销毁时自动被调用 析构函数使用初探 #include <stdio.h>class Test …

Threadlocal 必会的9个知识点

1.什么是ThreadLocal&#xff1f;它在多线程环境下有什么用处&#xff1f; ThreadLocal是在多线程环境下提供的一种简单的机制&#xff0c;使得每个线程都能拥有一个独立的变量副本。它避免了线程安全问题&#xff0c;并提高了程序的并发性能。 2.ThreadLocal是如何工作的&am…

规则引擎--规则逻辑形如“1 (2 | 3)“的抽象设计

目录 规则下逻辑表达和条件的抽象表达逻辑的编码和抽象 规则规则下的条件操作符抽象定义规则类规则执行表达式遍历进行操作符计算添加规则下一个具体条件的执行 规则执行完成后得到最后的结果 规则下逻辑表达和条件的抽象 对于任何一个规则&#xff0c;当然包括多个条件&#…

市面上最强PDF:GcPDF 6.1.4 Grapecity -Crack

适用于 .NET 6 的功能丰富的 PDF API 库 完全控制 PDF - 快速生成文档、提高内存效率且无依赖性。 在代码中生成、加载、编辑和保存 PDF 文档 支持多种语言的全文、段落格式和字体 使用新的编辑工具编辑 PDF 中的内容 支持数百种PDF功能 Windows、macOS 和 Linux 完全支持所有…

PhotoShop Beta(爱国版)安装教程-内置AI绘画功能

PS beta版安装教程 Window和Mac版都有&#xff0c;里面内置AI绘画功能 ps Beta版真的太爽了&#xff0c;今天来和大家分享下安装教程。 很多人拿这资料卖5块 9.9 19.9&#xff0c;球友们直接用&#xff0c;建议赶紧装&#xff0c;以免PS更新后&#xff0c;很多pojie程序没法用了…

ChatGPT数据分析与可视化实战

ChatGPT从入门到精通&#xff0c;一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定 让ChatGPT帮你高效实现职场办公&#xff01;行动起来吧1、ChatGPT从入门到精通&#xff0c;一站式掌握办…

docker安装drone

目录 Drone简介docker安装drone创建Drone-server容器创建Drone-runner-docker容器 访问drone-server面板操作 Drone简介 Drone是基于GO语言开发的持续集成&#xff08;Continuous integration&#xff0c;CI&#xff09;引擎&#xff0c;它可以借助Docker容器技术&#xff0c;…

Autosar RTE C/S接口实现及synchronous与asynchronous的区别

文章目录 前言Server接口设计server接口Simulink实现server函数mapping Function生成的代码 Client接口设计Client接口Simulink实现ClientFunction Caller Mapping生成的代码Rte_CallRte_Result 总结 前言 在之前的一篇文章中&#xff0c;介绍了RTE中的S/R接口&#xff0c;也是…

(一)WPF - WPF

一、Window 图形演化 创建用户界面&#xff1a; User32&#xff1a; 该部分为许多元素&#xff08;如窗口、按钮和文本框等&#xff09;提供了熟悉的 Windows 外观。GDI/GDI&#xff1a; 该部分为渲染简单形状、文本以及图像提供了绘图支持&#xff0c;但增加了复杂程度&…

Nginx使用

说明&#xff1a;Nginx是静态资源服务器&#xff0c;可以部署静态资源&#xff0c;并对请求进行策略分发。 下载 第一步&#xff1a;可在官网&#xff08;http://nginx.org/en/download.html&#xff09;下载&#xff0c;建议安装稳定版本&#xff08;Stable version&#xf…

【力扣刷题 | 第十三天】

前言&#xff1a; 今天随机进行练习&#xff0c;题型上不会有什么限制&#xff0c;主要还是练习STL算法。 88. 合并两个有序数组 - 力扣&#xff08;LeetCode&#xff09; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分…

[RocketMQ] Broker与NameServer的心跳服务源码 (四)

文章目录 1.Broker发送心跳注册请求源码1.1 发送心跳包入口1.2 registerBrokerAll注册broker信息 2.NameServer处理心跳注册请求2.1 处理心跳包入口2.2 NameServer注册broker信息2.2.1 RouteInfoManager介绍2.2.2 registerBroker注册broker 3.NameServer的心跳检测服务3.1 scan…

GIS坐标系统

最新在看GIS的理论知识&#xff0c;坐标系统这块比较抽象&#xff0c;B站上搜到到一个博主的视频&#xff0c;对这块讲解的比较通俗易懂&#xff0c;这里记录一下&#xff1a; 地理坐标系统 地理坐标系统是地球表面空间要素的定位参照系统。地理坐标系统是由经度和维度定义的。…

记录Unity Endless Runner要点

1. Array.IndexOf()查找数组中指定项的索引&#xff0c;如果没找到&#xff0c;就返回-1 2. 如果粒子不是循环播放的&#xff0c;则在粒子播放完毕之后销毁它 if (!m_ParticleSpawned.main.loop)Destroy(m_ParticleSpawned.gameObject, m_ParticleSpawned.main.duration); 3. 检…

普通单目相机标定

前言 这里我们还是以普通相机为例(非鱼眼相机)来进行后续的相关标定操作,再回顾下相机的成像模型如下所示。 已知相机内参(fx,fy,u0,v0),畸变系数[k1,k2,k3,p1,p2],相机外参[R|T]。世界坐标系中点Pw(Xw,Yw,Zw),投影至像素坐标系点p(u,v)的计算过程如下。 1)由世…

操作系统———文件管理

目录 一、初识文件管理1.文件属性2.文件内部数据组织3.文件之间组织4.操作系统向上提供的功能5.文件如何存放在外存6.其他需要由操作系统实现的文件管理功能7.总结 二、文件的逻辑结构1.无结构文件与有结构文件2.有结构文件的逻辑结构2.1顺序文件2.2索引文件2.3索引顺序文件 3.…

ChatGPT 指令知识要点

ChatGPT从入门到精通&#xff0c;一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定1、ChatGPT从入门到精通&#xff0c;一站式掌握办公自动化/爬虫/数据分析和可视( 点击观看完整版本 )https…