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

ARM IRQ中断

1.中断方式

中断:CPU能打断当前正在进行的工作,去处理更为紧急的任务,并且在处理完中断任务后,能回到原先的地方继续工作
中断流程
(1)中断源发出中断请求。
(2)CPU检查是否响应中断以及该终端是否被屏蔽。
(3)检查当前产生的中断的中断优先级。
(4)保护现场
(5)执行中断服务函数
(6)恢复现场
kernal:被打断的
外设:发出中断
GPIO发出的中断:外部中断(EINT)

2.中断控制器GIC

1.概念

在计算机体系结构中,中断控制器(Interrupt Controller) 是连接 CPU 与外部设备(如键盘、硬盘、网卡、定时器等)的核心 “管理枢纽”,其核心作用是统一接收、优先级排序、转发外部设备的 “中断请求”,确保 CPU 能高效响应设备需求,避免 CPU “轮询等待” 设备,从而大幅提升整机资源利用率。

GIC(Generic Interrupt Controller):通用的中断控制器

2.协处理器

1.概念

协处理器(Coprocessor)是一种辅助中央处理器(CPU)执行特定计算任务的专用处理器,旨在分担 CPU 的部分工作负载、提升特定场景下的计算效率或实现 CPU 不具备的特殊功能。它不能独立运行完整程序,需依赖 CPU 的指令调度和控制,本质是 CPU 的 “专用计算助手”。

2. 系统控制单元(CP15):“管理型” 协处理器

CP15 是 ARM 架构中负责系统级控制的专用单元,虽不直接参与数据计算,但承担 CPU 与内存、缓存、权限管理的 “桥梁” 角色,本质是 “系统管理协处理器”,在 Cortex-A 系列中全程内置(无独立版本)。

其核心功能包括:

  • 内存管理:配置 MMU(内存管理单元)的页表基地址、内存权限(读写 / 执行),实现虚拟内存到物理内存的映射;

  • 缓存控制:启用 / 禁用 L1/L2 缓存、清空缓存数据、配置缓存策略(如写回 / 写透);

  • 权限与安全:管理 ARM 的异常级别(EL0-EL3)、配置安全状态(Secure/Non-Secure),是 TrustZone 安全架构的核心控制单元;

  • 性能监控:统计 CPU 指令执行数、缓存命中 / 缺失次数,用于性能分析。

  • 调用方式:CPU 通过 “协处理器指令”(如MCR/MRC,即 “协处理器寄存器到 CPU 寄存器的传输”)操作 CP15,例如通过MCR p15, 0, r0, c1, c0, 0指令启用 MMU。

同时还可以开启icache

ARMv7-A 架构(如 Cortex-A9/A15)通过CP15 协处理器的 SCTLR(系统控制寄存器) 控制 ICache,核心步骤如下:

mrc p15, 0, r0, c1, c0, 0   //读取cp15协处理器值到r0寄存器中
bic r0, r0, #(1 << 13)     //修改异常向量表映射方式
orr r0, r0, #(1 << 12)     //打开ICache
mcr p15, 0, r0, c1, c0, 0  //往协处理器写入

3.中断相关寄存器配置

c0 registers:
MIDR(Main ID Register):存储内核的一些基本信息

c1 registers:
SCTLR(System Control Register):
bit13:V
0 : Normal exception vectors, base address 0x00000000. Software can remap this base address using the VBAR.

                        正常异常向量,基址0x00000000。软件可以使用以下命令重新映射此基址
VBAR。
1 : High exception vectors, base address 0xFFFF0000. This base address is never remapped.
bit12:是否开启icache
0  Instruction caches disabled, this is the reset value.
1  Instruction caches enabled.

c12 registers:
VBAR(Vector Base Address Register):
demo:

 __set_VBAR(0x87000000);


c15 registers:
CBAR(Configuration Base Address Register):Holds the physical base address of the memory-mapped GIC registers.

保存内存映射的GIC寄存器的物理基址。

    mrc p15, 4, r1, c15, c0, 0     //取出GIC基地址到r1add r1, r1, #0x2000ldr r0, [r1, #0x0C]            //中断通知寄存器, C_IAR,同时传r0值给接下来的函数stmfd sp!, {r0, r1}cps #0x1F                      //设置为sys模式,可以中断的嵌套stmfd sp!, {lr}                //保护lr防止bl后lr被修改bl system_interrupt_handlercps #0x12                      //设为irq模式stmfd sp!, {lr}str r0, [r1, #0x10]            //中断标志寄存器, C_EOIR,结束中断ldmfd sp!, {r0-r12, pc}^

3.相关指令

1.mrc

在 ARM 架构中,MRC 指令(Move to ARMRegister from Coprocessor) 是用于从协处理器(Coprocessor)读取数据到 ARM 核心寄存器的专用指令。它是 ARM 处理器与协处理器(如系统控制协处理器 CP15、浮点协处理器 VFP 等)通信的关键接口,主要用于获取协处理器的状态、配置信息或运算结果。

MRC{<cond>} p<coproc>, <opcode1>, <Rt>, <CRn>, <CRm>{, <opcode2>}
  • p<coproc>:协处理器编号(p0-p15),如p15表示系统控制协处理器(最常用)。
  • <opcode1>:协处理器操作码 1(0-7),由协处理器定义的基本操作类型。
  • <Rt>:ARM 核心的目标寄存器(r0-r15),用于存储从协处理器读取的数据。
  • <CRn>:协处理器的寄存器编号(c0-c15),指定要读取的协处理器寄存器。
  • <CRm>:协处理器的附加寄存器编号(c0-c15),用于扩展地址空间(部分协处理器可能忽略)。

2.mcr

在 ARM 架构中,MCR 指令(Move from ARM Register to Coprocessor) 是与 MRC 指令配对使用的协处理器通信指令,用于将 ARM 核心寄存器中的数据写入到协处理器(Coprocessor)的寄存器中。它主要用于配置协处理器的工作模式、设置控制参数或向协处理器传递运算所需的数据,是底层系统编程中配置硬件的关键指令。

MCR{<cond>} p<coproc>, <opcode1>, <Rt>, <CRn>, <CRm>{, <opcode2>}

各字段含义与 MRC 指令一致,仅数据流向相反


文章转载自:

http://lqOlIsyJ.rksnk.cn
http://DMpS1MGO.rksnk.cn
http://EyNLO12m.rksnk.cn
http://Gp5SPfNY.rksnk.cn
http://Da5TO8JL.rksnk.cn
http://ffFuDe4i.rksnk.cn
http://9gJtLpjI.rksnk.cn
http://6fK3f9pj.rksnk.cn
http://0FIatUxz.rksnk.cn
http://X4R2CTw9.rksnk.cn
http://51WC6B7m.rksnk.cn
http://5NCcn5Eg.rksnk.cn
http://MlYoVZiW.rksnk.cn
http://hY2tHT8A.rksnk.cn
http://bMWL6Ydg.rksnk.cn
http://5DlsFJo3.rksnk.cn
http://JbQI2CiI.rksnk.cn
http://np1YNwnR.rksnk.cn
http://vXyTFDL3.rksnk.cn
http://Jb2A3f4X.rksnk.cn
http://fKpbL5Uj.rksnk.cn
http://Y5ZFFzAP.rksnk.cn
http://2zN4inaO.rksnk.cn
http://wQBikf2q.rksnk.cn
http://iZ1IpRwu.rksnk.cn
http://DlUMv13X.rksnk.cn
http://L1XLRPOf.rksnk.cn
http://voqy245q.rksnk.cn
http://WDlarcBx.rksnk.cn
http://JoWAA9BR.rksnk.cn
http://www.dtcms.com/a/380652.html

相关文章:

  • Ruoyi-vue-plus-5.x第八篇文件管理与存储: 8.2 OSS云存储集成
  • 解决:NVIDIA-SMI couldn‘t find libnvidia-ml.so library in your system.
  • 【LLM】VLLM:容器运行 ModelScope 模型
  • HarmonyOS 应用开发深度解析:基于 Stage 模型与 ArkUI 的跨组件状态共享最佳实践
  • TOGAF——战术性调整,战略性变更
  • 【计算机 UTF-8 转换为本地编码的含义】
  • 当人工智能遇上知识检索:RAG技术的深度解析与实践探索
  • 在线商城管理系统功能清单的系统设计
  • SLAM 系统设计是如何保证前端(tracking/VO)和后端(优化/BA/图优化)如何同步实时性思路汇总思考
  • 代码随想录二刷之“动态规划”~GO
  • zynq arm全局计时器和私有定时器
  • TCP套接字的使用
  • 红日靶场(三)——个人笔记
  • Linux 进程和线程基础知识解析
  • MySQL 查询不正确身份证号的方法
  • 淘宝商品详情 API 的安全强化与生态协同创新路径
  • 全志A133 android10 secure boot 安全启动
  • 储能电站的监控运维软件推荐,降低运营成本
  • 麒麟v10系统内存不足
  • fpga图像处理
  • 使用netstat 获取各Oracle数据库实例对应应用IP地址脚本
  • QT M/V架构开发实战:QAbstractItemModel介绍
  • PHP 与 WebAssembly 的 “天然隔阂”
  • QML 的第一步
  • IP验证学习之env集成编写
  • Android8 binder源码学习分析笔记(四)——ServiceManager启动
  • fastapi搭建Ansible Playbook执行器
  • 第四阶段C#通讯开发-1:通讯基础理论,串口,通讯模式,单位转换,代码示例
  • 微信小程序——云函数【使用使用注意事项】
  • 【java】常见排序算法详解