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

news2024/12/23 23:43:46

目录

一、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/650786.html

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

相关文章

发布Android Lib 到 MavenCentral

新建 Sonatype 项目 注册账号: https://issues.sonatype.org/secure/Signup!default.jspa 这里注册不需要什么验证码,很简单。 创建问题 点击新建: 概要:自定义,写项目名称即可。 GroupId:如果是git…

C语音:打印整数二进制的奇数位和偶数位

题目: 获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列 思路: 总体思路: (一). 输入数据 (二). 打印奇数位: 使用 for循环 循环产生 1~32 之间的偶…

2023年5月 青少年软件编程(图形化) 等级考试试卷(一级)

青少年软件编程(图形化) 等级考试试卷(一级)2023.6 一、 单选题(共 25 题, 共 50 分) 1.看图找规律, 请问下图红框中是? ( ) A. B. C. D. 标准答案: D 试题解…

centos系统把.net6 web api部署到docker

为了搞定docker是怎么部署的,做个笔记 前提条件准备一个core项目,使用vs自带的docker打包假如你选择docker支持的时候不小心安装了Docker Desktop;还可以简单的先部署到本地docker中发布到centosdocker常用命令 前提条件 一台centos 8.0 版本以上的linu…

软件测试的7年,我秃了,也变强了...

当前就业环境,裁员、失业消息满天飞,好像能有一份工作就不错了,更别说高薪。其实这只是一方面。另一方面,各大企业依然求贤若渴,高技术人才依然紧缺,只要技术过硬,拿个年包50w不是问题。 人生格…

i.MX RT1010跨界MCU(MCUXpresso IDE上手体验)

MCUXpresso IDE是专为NXP半导体的基于ARM Cortex-M内核的MCU芯片开发而设计的,其优势主要体现在以下几个方面: MCUXpresso IDE集成了MCUXpresso SDK,这是NXP提供的一个软件开发套件,包含了底层驱动、中间件以及大量的示例代码和应…

Charles Windows10使用 证书安装 过期重设 证书加入到受信任根目录 配置访问WhatsApp

普通教程文档 抓包神器 Charles 使用教程详解 - 知乎 界面选项详细讲解 Charles的功能介绍与使用教程,一学就会,不信就来试试? 疑难杂症 由于CA 根证书不在“受信任的根证书颁发机构”存储区中,所以它不受信任 1、winr 运行…

SandQuant停止运营,免费获取A股数据

亲爱的各位朋友们: SandQuant即日起不再对外提供任何服务,为了感恩曾经支持过我们的客户朋友,现免费提供所有A股数据(数据非常庞大,请酌情下载),请通过链接自取。 请关注我们获取链接&#xff…

产品不可或缺的文档——帮助文档

在互联网时代,产品的更新迭代速度越来越快,产品功能也越来越复杂,为了让用户能够更好地理解和使用产品,帮助文档逐渐成为了产品不可或缺的一部分。本文将从帮助文档的作用、设计原则、撰写技巧等方面探讨帮助文档的重要性及如何编…

【AI面试】损失函数(Loss),定义、考虑因素,和怎么来的

神经网络学习的方式,就是不断的试错。知道了错误,然后沿着错误的反方向(梯度方向)不断的优化,就能够不断的缩小与真实世界的差异。 此时,如何评价正确答案与错误答案,错误的有多么的离谱,就需要一个评价指标。这时候,损失和损失函数就运用而生。 开始之前,我们先做…

MySQL数据库——初步安装与数据表结构数据管理

MySQL数据库——初步安装与数据表结构数据管理 一、数据库的基本概念1.数据库基本常识2.数据库系统发展史 二、数据库的分类1.关系数据库(SQL)2.非关系数据库(NO SQL) 三、mysql的数据类型1.常用的数据库类型2.char与varchar的区别…

ijkplayer 支持srt协议 rtmp协议编译步骤

写在前面 ffafaf这个编译真的太垃圾了 一堆毛病 感受下webrtc 傻瓜式编译 环境首先必须ndk 是android-ndk-r15c 或者 android-ndk-r14b ubuntu 系统随便22或者20,18都行 有个非常重要的点python必须是2.7 不然你会看到一大堆报错 高版本的ubuntu默认都是python3…

回溯算法基本思想及其实现

文章目录 基本思想回溯算法的递归框架组合问题组合总和组合去重子集全排列 基本思想 回溯算法是一种递归算法,它试图通过尝试不同的选择,解决一个问题。它的基本思想是从可能的决策开始搜索,如果发现这条路往下走不能得到有效的解答&#xf…

12-事件模型(也就是一个先后触发顺序)

一、事件与事件流 HTML文档、浏览器中发生的一种交互。使得具备互动性,加载、鼠标、自定义事件。 由于DOM是一个树结构,意味着标签存在嵌套关系,当绑定事件的时候,当触发子节点的时候,一个顺序问题,概念-事…

人机交互学习-4 交互设计过程

交互设计过程 交互设计过程基本活动关键特征 设计过程中的问题如何选取用户?如何明确需求?如何提出候选方案?如何在候选方案中选择? 交互设计生命周期模型星型生命周期模型可用性工程生命周期模型 交互设计过程管理界面设计的4个支…

这三个方法可以视频音频转换你知道吗?

小明:你听说过音频转换吗?最近我在学习音乐制作,发现这个功能特别有用! 小红:啊,好像没有听说过。它是用来干嘛的? 小明:简单来说,就是可以将不同格式的音频文件进行转…

嵌入式Linux应用开发笔记:串口

文章目录 目的基础说明开发准备设备树应用程序 应用程序与演示代码演示 总结设备树文件 目的 串口(UART)是嵌入式设备中比较常用的功能。这篇文章将记录下应用程序中串口操作相关内容。 这篇文章中内容均在下面的开发板上进行测试: 《新唐N…

阿里 P8 架构师总结的 Java 面试笔记,上线仅七天,Github 标星 55K

作为一名优秀的程序员,技术面试是不可避免的一个环节,一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识。 如果你参加过一些大厂面试,肯定会遇到一些这样的问题: 1、看你项目都用的框架,熟悉 …

AI翻唱整合

感谢阅读 不完全原创声明环境部署下载工具包安装人声背景音分离工具分离消除脏数据(比如杂音)准备自己的声音预处理完工效果参考 不完全原创声明 本人使用了多个第三方软件,并修改了一部分代码使得其可以在PC上训练,如有侵权请联…

看板是什么?使用看板进行任务管理有哪些好处?

看板是一个易于使用的工具,用于可视化和管理工作流程。 它的特点是有一列代表工作流程的各个阶段。看板卡被用来跟踪各个任务和活动在各个阶段的进展情况。 看板的两种主要类型是实体看板和数字看板。实体看板最适合办公室内、同地办公的团队。数字看板更适合远程和…