ARM架构的中断机制详解(S5PV210芯片)

2023-05-16

1、中断介绍

(1)中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行;
(2)中断是为了实现宏观上的并发。比如我们有一台单核CPU的电脑,我们可以在看视频的同时去操作键盘和鼠标,但是单核CPU在同一时刻是只能做一件事情。CPU在大部分时间都是在播放视频,只有在我们操作鼠标和键盘时才去处理鼠标的键盘,但是因为CPU运行特别快,我们感知不到CPU停止播放视频去处理了鼠标和键盘,当我们操作鼠标和键盘时会产生相应的中断,用中断的方式通知CPU要处理鼠标和键盘,这样CPU只在必要的时候去处理鼠标和键盘,处理时间很短,这样CPU在宏观上就可以同时处理多件事;

2、异常和中断的区别

(1)中断是异常的一种,一般特指SoC内的内部外设产生的打断SoC常规业务,或者外部中断。针对SoC来说,发生复位、软中断、中断、快速中断、取指令异常、数据异常等,我们都统一叫异常;
(2)异常的定义就是突发事件,打断了CPU的正常常规业务,CPU不得不跳转到异常向量表中去执行异常处理程序;

3、异常向量表

3.1、iRAM的地址映射

在这里插入图片描述

这是S5PV210芯片的iRAM的地址映射图,其中就标明了异常向量表的默认地址、SVC模式的栈空间、IRQ模式的栈空间;

3.2、异常向量表的位置

(1)启动初始阶段:在设备启动的初始阶段,DDR还没有初始化,只有内核的iRAM可以使用,三星对96KB的iRAM进行了规划,其中0xD003_7400–0xD003_7480的128字节存放异常向量表;
(2)内核启动结束:S5PV210的异常向量表的起始位置是可以改变(在CP15协处理器中设置),以适应操作系统的需求;
(3)虽然异常向量表的起始位置可以改变,但是各种异常之间的相对偏移量是不会变的;

3.2、异常向量表的实质

在这里插入图片描述

(1)从上面可以看出,异常向量表的每一项只占4字节,而异常向量表是用于处理异常的。当异常发生时,CPU跳转到异常向量表处执行,显然4字节的空间是不能存放
下异常处理函数的;
(2)异常向量表的每一项都是函数指针,当异常发生时就调用异常向量表处的函数指针来处理异常;
(3)异常向量表这个机制是CPU决定的,也就是硬件决定的,硬件决定了发生异常时跳转到某个地址处(函数指针)去执行,但是这个地址存放的函数指针是软件开发人员去指定的。硬件决定了发生异常时跳转到异常向量表,但是怎么处理异常是软件开发人员决定的;
参考博客:《ARM的37个寄存器和异常处理机制详解》;

4、中断的保护现场和恢复现场

4.1、为什么要保护/恢复现场

(1)我们去处理中断时,因为CPU在同一时刻只能处理一件事,所以会打断当前正在处理的任务,当我们在处理完中断后要返回来继续处理之前的任务;
(2)我们处理完中断能继续处理之前的任务,前提是要记录下之前任务的状态,这样处理完中断才知道从哪里开始继续处理之前的任务;
(3)保护现场和恢复现场是互为逆过程,在进入中断前保存好正在处理任务的状态,处理完中断后恢复之前任务的状态;

4.2、保护现场

(1)中断从SVC模式来,则保存SVC模式下的必要寄存器的值;
(2)设置IRQ栈,这样才能在IRQ处理函数中使用C语言;
(3)保存LR,LR保存的中断返回地址;
(4)保存R0~R12寄存器,因为R0~R12寄存器是IRQ模式和其他模式共用的;
(5)保存cpsr寄存器到spsr寄存器;

4.3、恢复现场:

(1)把之前保存的SVC模式的R0~R12寄存器的内容恢复;
(2)把spsr寄存器的内容放到cpsr寄存器;
(3)把LR寄存器的内容放到PC寄存器中;

4.4、汇编实现保存现场和恢复现场

#define IRQ_STACK	0xd0037f80

IRQ_handle:
	// 设置IRQ模式下的栈
	ldr sp, =IRQ_STACK
	
	// 保存LR:因为ARM有流水线(默认是3级流水线),所以PC的值会比真正执行的代码+8
	//因为当中断发生时,当前这句指令会执行完,所以我们要保存的是当前指令的下一条指令,这里要将"lr-4"
	sub lr, lr, #4
	
	// 保存r0-r12和lr到irq模式下的栈上面
	stmfd sp!, {r0-r12, lr}
	
	// 在此调用真正的isr来处理中断
	bl irq_handler
	
	// 处理完成开始恢复现场,其实就是做中断返回,关键是将r0-r12,pc,cpsr一起回复
	ldmfd sp!, {r0-r12, pc}^

(1)上面汇编代码是irq中断的处理部分,其中在保存现场和恢复现场中,cpsr寄存器的处理是CPU硬件自动完成的;
(2)IRQ_STACK:这个是IRQ模式下的栈地址,具体信息参考3.1节;注意ARM是用的满减栈,所以栈地址要设置成高位的0xd0037f80地址;

5、异常处理的两个阶段

5.1、第一阶段:异常向量表的跳转

(1)第一个阶段:异常向量表的跳转,硬件自动完成,几乎所有CPU都是一样的;
(2)异常在ARM中是分为几类,比如复位中断(reset)、普通中断(IRQ)、快速中断(FIQ)、未定义指令中断(undefine instruction)等等;
(3)当发生中断时,硬件会判断发生的是哪种中断,并且跳转到对应异常向量表的位置去执行;
(4)前面介绍了异常向量表每个表项实质就是函数指针,这个异常处理函数是需要我们去编写;

5.2、第二阶段:区分出是哪个中断源

(1)异常分为几类,其中中断又分为多个(比如:S5PV210芯片支持上百个中断),在第一阶段中已经跳转到异常向量表的中断处理(IRQ);
(2)IRQ程序的工作逻辑:保存现场->区分出是哪一个中断->调用对应中断处理函数->恢复现场;
(3)芯片会提供机制来让程序员区分出当前发生的是哪一个中断,程序员阅读芯片数据手册中中断部分的说明,就知道如何操作相关寄存器;

6、S5PV210的异常处理机制

参考博客:《S5PV210的中断处理机制详解》;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM架构的中断机制详解(S5PV210芯片) 的相关文章

  • 在 ARM 处理器上执行存储在外部 SPI 闪存中的程序

    我有一个 ARM 处理器 能够与外部闪存芯片连接 写入芯片的是为 ARM 架构编译的程序 可供执行 我需要知道如何将这些数据从外部闪存获取到 ARM 处理器上以供执行 我可以提前运行某种复制例程 将数据复制到可执行内存空间吗 我想我可以 但
  • 手臂“版本”之间的差异? (仅限 ARMv7)

    基本上我想知道ARMv7l和ARMv7之间的区别hl 我有一个带有armv7l的arm处理器 并且有很多armv7的rpmhl 我完全不知道我必须搜索什么才能获得相关信息 这个 后缀 叫什么 还有其他类型吗 他们的做法有何不同 我假设它指示
  • 用于 RHEL 的 gdb-multiarch

    我正在尝试寻找方法来运行gdb 多架构RHEL 中的命令 我已经安装了用于 ARM 处理的 QEMU 模拟器 我想安装GDB进行调试 我能够安装GDB 多体系结构在 Ubuntu 中运行命令成功 sudo apt get GDB multi
  • 如何使用 gcc 编译代码和 ARM Cortex A8 目标进行调用图分析?

    我对这个已经咬牙切齿了 我需要在 ARM 板上进行分析并需要查看调用图 我尝试使用 OProfile Kernel perf 和 Google 性能工具 一切正常 但不输出任何调用图信息 这使我得出结论 我没有正确编译代码 我在编译 C 代
  • DSP 库 - RFFT - 奇怪的结果

    最近我一直在尝试在我的STM32F4 Discovery评估板上进行FFT计算 然后将其发送到PC 我已经调查了我的问题 我认为我对制造商提供的 FFT 函数做错了 我正在使用 CMSIS DSP 库 现在我一直在用代码生成样本 如果工作正
  • ARM Cortex A8 PMNC 读取在启用后也给出 0.. 有什么想法/建议吗?

    MODULE LICENSE GPL MODULE DESCRIPTION user mode access to performance registers int init arm init void unsigned int valu
  • 在嵌入式设备上使用new或malloc引起的段错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • 使用 NEON 内在函数除以浮点数

    我当时正在处理四个像素的图像 这是在armv7对于 Android 应用程序 我想分一个float32x4 t向量由另一个向量组成 但其中的数字与大约不同0 7 to 3 85 在我看来 除法的唯一方法是使用右移 但这是针对一个数字2 n
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 如何在WinMobile6上启用ARMv6非对齐访问?

    ARMv6 引入了一个很棒的功能 未对齐的内存访问 这使得代码中的某些事情变得更加简单和更快 但微软只在winCE6中提供了API 现在大多数 PDA 都基于 WinMobile6 基于 CE 5 x 默认情况下禁用未对齐访问 我尝试在 C
  • ARM Cortex-M3 启动代码

    我试图了解 STM32 微控制器的 Keil realview v4 附带的初始化代码是如何工作的 具体来说 我试图了解堆栈是如何初始化的 In the 文档 http infocenter arm com help index jsp t
  • 让 TensorFlow 在 ARM Mac 上使用 GPU

    我已经安装了TensorFlow在 M1 上 ARM Mac 根据这些说明 https github com apple tensorflow macos issues 153 一切正常 然而 模型训练正在进行CPU 如何将培训切换到GPU
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2

随机推荐

  • Haar特征类有哪些最新发表的毕业论文呢?

    一 总体简介 Haar特征的相关文献在2006年到2020年内共计132篇 xff0c 主要集中在自动化技术 计算机技术 无线电电子学 电信技术 公路运输 等领域 xff0c 其中期刊论文100篇 会议论文4篇 专利文献28篇 xff1b
  • 查阅国外文献的网站有哪些?

    毕业季不知道小伙伴们有没有为了论文感到头秃 xff0c 参考文献在我们的论文中有着举足轻重的作用 xff0c 每年这个时候都有大批小伙伴为这个寻找参考文献发愁 有些专业的小伙伴由于专业的特殊性很多需要的文献还是外文文献 xff0c 对他们来
  • 使用Python和C++的写数据结构和算法

    使用Python和C 43 43 的写数据结构和算法 1 数据结构和算法简介2 数据结构2 1 堆栈2 2 队列2 3 散列表2 4 二叉树2 5 线性搜索2 6 二进制搜索2 7 递归2 8 递归二进制搜索2 9 QuickSort2 1
  • Hive与Hbase的区别与联系

    一 概念 1 xff0c Hive hive是基于Hadoop的一个数据仓库工具 xff0c 用来进行数据提取 转化 加载 xff0c 这是一种可以存储 查询和分析存储在Hadoop中的大规模数据的机制 hive数据仓库工具能将结构化的数据
  • ros 命名空间

    文章目录 全局命名空间相对名称私有名称节点命名空间 全局命名空间 rosout前面的反斜杠 表明该节点名称属于全局命名空间 之所以叫做全局名称因为它们在任何地方 xff08 包括代码 命令行工具 图形界面工具等的任何地方 xff09 都可以
  • DenseNet及torchvision中的实现

    ResNets Highway Networks Stochastic depth DenseNet他们的共同的特点是 They create short paths from early layers to later layers 他们
  • Xmanager5用Xstart连接CentOS7

    今天安装了Xmanager5 xff0c 原本已经有了Xshell5 xff0c 没有冲突 xff0c 测试Xftp Xshell使用上均无问题 到了Xstart却出错了 xff0c 客户端设置完后点击运行 xff0c 出现报错 查找了许多
  • CAN总线入门学习(一)

    今天带着大家学习 xff0c CAN总线 1 概要 本资料是面向 CAN 总线初学者的 CAN 入门 对 CAN 是什么 CAN 的特征 标准规格下的位置分布等 CAN 的概要及 CAN 的协议进行了说明 2 使用注意事项 本资料对博世 B
  • java调用接口

    long dateStr 61 System currentTimeMillis 1000 String url 61 34 34 创建参数 JSONObject jsonObject 61 new JSONObject jsonObjec
  • 英特尔NUC 11板载USB3.0座子接口定义

    规格书没有座子PIN定义 xff0c 于是我找技术支持提供了定义
  • 宝塔配置Workerman

    map span class token variable http upgrade span span class token variable connection upgrade span span class token punct
  • px4飞控和机载电脑通信:机载电脑接收飞控的自定义px4消息

    机载电脑接收飞控的自定义px4消息 mavros功能包能够实现px4飞控和机载电脑之间的实时通信 而对于大部分的消息通信mavros都已经有相应接口可以调用 xff0c 例如 xff1a 位置 期望位置 速度 四元素等消息都可以通过C 43
  • px4飞控和机载电脑通信:飞控接收机载电脑的自定义mavlink消息

    前面一篇讲了机载电脑怎么接受飞控的px4消息 这一篇讲解如何飞控怎么接收从机载电脑传过来的消息 分成两部分 机载电脑发送消息 飞控接收消息 pixhawk版本 pixhawk4 px4版本 1 11 2 ros版本 1 14 10 机载电脑
  • 多无人机通信-路由器实现

    多无人机通信 多无人机之间相互通信是实现编队飞行的基础 而想要实现通信就需要组建网络 在网络之间实现数据信息的互相传输 按结构分成两大类 中心节点网络和无中心节点网络 我们这里所用的路由器就是中心节点网络 所有的数据的传输都要经过中心节点
  • js做文件分片上传

    js做文件分片上传 分片上传视频 xff0c 图片 xff0c 音频 xff0c 转base64 64 Layout 61 null lt DOCTYPE html gt lt html gt lt head gt lt meta name
  • 锐捷交换机基本配置命令

    锐捷交换机基本配置命令 锐捷交换机 xff0c 忘记colsole口的en密码 xff0c 重启交换机 xff0c 立即按ctrl 43 c xff0c 进入bootloader 菜单 xff0c 再按ctrl 43 q xff0c 然后输
  • 驱动设计思想(机制、策略、分离、分层)

    1 机制和策略 1 机制就是提供什么功能 xff0c 策略就是怎么使用这些功能 在编写驱动时需要在编程时间和驱动的灵活性之间取一个可接受的折中 xff0c 驱动提供机制 xff0c 尽量不提供策略 xff0c 策略让上层应用去做 2 机制和
  • debian重启没办法进入图形界面

    在遇到重启有时候没办法进入图形界面的情况下 xff0c 你可以考虑是自己电脑或者服务器显卡的问题 xff0c 如果你进入了命令行的界面 xff0c 执行 etc init d kdm restart 可以重新启动图形界面的话那么就可以肯定时
  • linux线程详解:线程概念、线程调度、线程安全、线程模型

    1 线程与进程的区别 1 线程是轻量级的进程 xff0c 是程序执行流的最小单位 xff1b 2 进程是资源分配的最小单位 xff0c 线程是调度的最小单位 xff1b 3 进程可以创建线程 xff0c 线程不可以创建进程 xff1b 4
  • ARM架构的中断机制详解(S5PV210芯片)

    1 中断介绍 1 中断是指计算机运行过程中 xff0c 出现某些意外情况需主机干预时 xff0c 机器能自动停止正在运行的程序并转入处理新情况的程序 xff0c 处理完毕后又返回原被暂停的程序继续运行 2 中断是为了实现宏观上的并发 比如我