嵌入式学习的第四十八天-中断+OCP原则

一、GIC通用中断控制器

1.GIC通用中断控制器

        GIC 是 ARM 公司给 Cortex-A/R 内核提供的一个中断控制器,GIC接收众多外部中断,然后对其进行处理,最终通过VFIQ、VIRQ、FIQ 和 IRQ给内核;这四个 信号的含义如下: VFIQ:虚拟快速 FIQ。 VIRQ:虚拟 IRQ。 FIQ:快速中断 IRQ。 IRQ:中断 IRQ。

2.GIC中断分类

SPI(Shared Peripheral Interrupt),共享中断, (注意!不是 SPI 总线那个中断),这类中断泛指所有的 外设中断;
PPI(Private Peripheral Interrupt),私有中断,我们说了 GIC 是支持多核的,每个核肯定有自己独有 的中断。这些独有的中断肯定是要指定的核心处理,因此这些中断就叫做私有中断;
SGI(Software-generated Interrupt),软件中断,由软件触发引起的中断,通过向寄存器GICD_SGIR 写入数据来触发,系统会使用 SGI 中断来完成多核之间的通信。

 从图中可以明显看出,Distributor(分发器)可以分发所有共享中断给8个内核,但是私有中断和 软件中断只出现自己独自的内核中。

中断ID:中断源有很多,为了区分这些不同的中断源肯定要给他们分配一个唯一 ID,这些 ID 就 是中断 ID。每一个 CPU 最多支持 1020 个中断 ID,中断 ID 号为 ID0~ID1019。

ID0~ID15:这 16 个 ID 分配给 SGI; ID16~ID31:这 16 个 ID 分配给 PPI;ID32~ID1019:
这 988 个 ID 分配给 SPI。

3.GIC的组成

   由分发器 (1个)、CPU接口(几核就几个)

(1)分发器

功能:

  • 全局中断使能控制;
  • 控制每一个中断的使能或者关闭;
  • 设置每个中断的优先级;
  • 设置每个中断的目标处理器列表;
  • 设置每个外部中断的触发模式:电平触发或边沿触发;
  • 设置每个中 断属于组 0 还是组 1;
(2)CPU接口

功能:

  • 使能或者关闭发送到 CPU Core 的中断请求信号;
  • 应答中断;
  • 通知中断处理完成;
  • 设置优先级掩码,通过掩码来设 置哪些中断不需要上报给 CPU Core;
  • 定义抢占策略;
  • 当多个中断到来的时候,选择优先级最高的 中断通知给 CPU Core;

4.协处理器

总共由16个,cp0~cp15;其中最常使用的cp15

(1)作用

  • 获取GIC的基地址(CBAR)
  • MMU的配置(使能/禁用;SCTLR)
  • cache的配置
  • 监控系统性能
  • 配置中断控制器(优先级、分组、使能/禁用,VBAR:设置中断向量表基地址)
  • 访问寄存器(mrc读、mcr写)
  • 获取或结束中断(IAR、EOIR)

(2)读写访问指令

MRC: 将 CP15 协处理器中的寄存器 数据读到 ARM 寄存器中;
MCR: 将 ARM 寄存器的数据写入到 CP15 协处理器寄存器中。
以MRC指令
为例,从CP15的某个寄存器读取数据到ARM寄存器的指令格式为:
MRC{cond} p15, <opc1>, <Rt>, <CRn>, <CRm>, <opc2>
cond:指令执行的条件码,就是之前我们使用过的指令条件,eq,lt什么的。如果忽略的话就表示无条件执行;
p15:表示要读取的是CP15当中的某个寄存器;
opc1:协处理器要执行的操作码1,其实就是一个数,要做什么将来查表;
Rt:ARM 目标寄存器,读出来的数据放到哪个ARM寄存器里。CP15
CRn:CP15 协处理器的目标寄存器,就是你要读取CP15的哪个寄存器(C0~C15);
CRm:协处理器中附加的目标寄存器或者源操作数寄存器,如果不需要附加信息就将CRm 设置 为 C0,否则结果不可预测。
opc2:可选的协处理器特定操作码2,使用时查表。
MCR与MRC类似的,只是Rt的作用变成了要写入CP15某个寄存器的值。

 mrc p15 0, r0, c0, c0, 0

         简单总结一下,通过 MIDR 寄存器可以获取到处理器内核信息;通过 SCTLR 寄存器可以使能或禁止 MMU、I/D Cache 等;通过 VBAR 寄存器可以设置中断向量偏移;通过CBAR 寄存器可以获取 GIC 基地址。

二、外部中断

1.设置GIC

(1)读取SCTLR,将V位置0(软件可以通过 VBAR来重新映射这个基地址)I位置1(I cache使能)

(2)通过GIC查询当前中断ID;先获取GIC基地址(CBAR);对其进行偏移(IAR),获得中断ID,然后进入中断处理函数

2.中断服务函数       

(1)中断初始化;重新定位异常向量表的位置到0x87800000;并且调用GIC_Init函数

(2)对于GPIO1->ICR2(触发方式)、GPIO1->IMR(该中断使能)在中断源初始化进行配置


(3)中断服务函数
  
注意:先要在相对应的中断源的初始化函数里面注册在中断向量数组中;

例子:注册完中断之后,中断发生就会调用中断服务函数

内敛函数:INLINE,定义被放在头文件中

三、OCP原则(开闭原则)  

对代码扩展是开放的,对代码的修改是关闭的。

四、启动代码

.global _start
//异常向量表
//位于内存起始位置,当特定异常发生时,处理器会自动跳转到对应的地址上
_start:ldr pc, = _reset_handlerldr pc, = _undefined_handlerldr pc, = _svc_handlerldr pc, = _prefetch_handlerldr pc, = _data_abort_handlerldr pc, = _not_user_handlerldr pc, = _irq_handlerldr pc, = _fiq_handler
//异常处理程序 大多是简单的无限循环
_undefined_handler:ldr pc, = _undefined_handler
_svc_handler:ldr pc, = _svc_handler
_prefetch_handler:ldr pc, = _prefetch_handler
_data_abort_handler:ldr pc, = _data_abort_handler
_not_user_handler:ldr pc, = _not_user_handler
_fiq_handler:ldr pc, = _fiq_handler//IRQ中断处理程序_irq_handler:subs lr,lr,#4           //调整返回地址stmfd sp!,{r0-r12,lr}   //保存寄存器//读取中断控制器状态mrc p15,4,r1,c15,c0,0   //获取外设基地址add r1,r1,#0x2000       //偏移到中断控制器ldr r0,[r1,#0x0C]       //读取中断状态stmfd sp!,{r0,r1}       //保存临时寄存器//切换到系统模式处理中断cps #0x1F               //切换到系统模式stmfd sp!,{lr}          //保存系统模式LRbl system_interrupt_handler //调用C中断处理函数ldmfd sp!,{lr}          //恢复LR模式cps #0x12               //切换回IRQ模式//清除中断ldmfd sp!,{r0,r1}       //恢复临时寄存器str r0,[r1,#0x10]       //写EQIR寄存器ldmfd sp!,{r0-r12,pc}^  //恢复寄存器并返回//启动代码执行程序
_reset_handler:cpsid i                 //禁用中断//配置CP15系统控制寄存器mrc p15,0,r0,c1,c0,0    //读取控制寄存器bic r0,r0,#(1<<13)      //清除V位(异常向量表位置)orr r0,r0,#(1<<12)      //设置I位(启用指令缓存)mcr p15,0,r0,c1,c0,0    //写回控制寄存器// 设置IRQ模式栈指针cps #0x12               // 切换到IRQ模式ldr sp, =0x82000000     // 设置IRQ栈cps #0x1F               // 切换到系统模式ldr sp, =0x84000000     // 设置系统栈cpsie i                 // 启用中断bl _init_bss            // 初始化BSS段b main                  // 跳转到主程序b finished              // 永远不会执行(冗余)
//初始化BSS段(清零)
_init_bss:ldr r0,= __bss_start    // BSS段起始地址ldr r1,= __bss_end      // BSS段结束地址
loop:mov r2,#0               // 清零值str r2,[r0]             // 存储0到当前地址add r0,r0,#4            // 移动到下一个字cmp r0,r1               // 比较是否到达结束blt  loop               // 如果未结束则循环bx lrfinished:b finished    

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

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

相关文章

一周学会Matplotlib3 Python 数据可视化-绘制条形图(Bar)

锋哥原创的Matplotlib3 Python数据可视化视频教程&#xff1a; 2026版 Matplotlib3 Python 数据可视化 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 课程介绍 本课程讲解利用python进行数据可视化 科研绘图-Matplotlib&#xff0c;学习Matplotlib图形参数基本设置&…

阿里研发效能提升【60篇】

阿里研发效能提升【60篇】 1、建立研发效能提升的系统框架 01、《从DevOps到BizDevOps&#xff0c;研发效能提升的系统方法》 视频版&#xff1a;2021云栖大会云效BizDevOps论坛 文字版&#xff1a;深度 | 从DevOps到BizDevOps, 研发效能提升的系统方法-阿里云开发者社区 …

面试实战 问题二十六 JDK 1.8 核心新特性详解

JDK 1.8 核心新特性详解 1. Lambda表达式 最核心的特性&#xff0c;简化函数式编程&#xff0c;语法&#xff1a;(参数) -> 表达式 // 传统方式 Runnable r1 new Runnable() {Overridepublic void run() {System.out.println("传统方式");} };// Lambda方式 Runn…

STM32H743开发周记问题汇总(串口通讯集中)

溢出错误出现的串口接收过程中&#xff0c;中断接收在溢出后无法进入&#xff0c;需要重点考虑溢出问题&#xff0c;以下是溢出恢复代码波特率115200 优先级0-1 高于定时器 初步诊断是数据流导致的接收溢出问题/*** brief 检查并清除UART溢出错误&#xff08;带状态…

Linux中FTP配置与vsftpd服务部署指南

Linux中FTP配置与vsftpd服务部署指南 一、FTP 核心概念 1、基本定义 文件传输协议&#xff08;FTP&#xff09;&#xff0c;基于 C/S模式 工作。控制端口&#xff1a;21&#xff08;身份验证与指令传输&#xff09; 数据端口&#xff1a;20&#xff08;主动模式数据传输&#x…

Web UI自动化测试的早期介入?

在传统研发流程中&#xff0c;Web UI自动化测试常被视为“后期活动”——必须等待前端界面完全稳定才能启动。这种滞后导致自动化测试难以覆盖早期迭代&#xff0c;形成“开发等测试、测试等稳定”的恶性循环。本文将系统破解这一困局&#xff0c;提供一套从需求阶段介入、持续…

基于学科竞赛的高职计算机网络教学解决方案

一、引言《关于深化产教融合的若干意见》明确提出 “推行面向企业真实生产环境的任务培养模式”&#xff0c;为我国职业教育发展指明了产教深度融合的方向。在数字经济时代&#xff0c;计算机网络技术正以前所未有的速度迭代更新&#xff0c;产业界对具备前沿技术应用能力和实践…

猿大师中间件:Chrome网页内嵌PhotoShop微信桌面应用程序

随着桌面应用程序集成到网页的需求不断增长&#xff0c;尤其在Chrome浏览器缺乏原生调用EXE功能的情况下&#xff0c;传统网页内嵌解决方案面临失效挑战&#xff0c;猿大师中间件因此发展成为当前主流方案。 2025年猿大师发布了EXE、OCX、COM三个通用组件&#xff0c;自此猿大…

EF (Entity Framework) vs LINQ to SQL vs SqlSugar 全方位对比分析

文章目录1. 概述与背景介绍1.1 Entity Framework (EF)1.2 LINQ to SQL1.3 SqlSugar2. 架构设计对比2.1 EF架构设计2.2 LINQ to SQL架构2.3 SqlSugar架构3. 性能对比3.1 基准测试数据3.2 性能分析3.3 内存使用4. 功能特性对比4.1 数据库支持4.2 主要功能对比4.3 高级特性5. 开发…

MySQL 多表联查与内外连接详解

多表联查是关系型数据库的核心操作&#xff0c;用于从多个表中关联数据。MySQL 支持多种连接方式&#xff0c;最常用的是内连接和外连接&#xff08;左/右/全外连接&#xff09;。一、多表联查基础语法 SELECT 列列表 FROM 表1 [连接类型] JOIN 表2 ON 连接条件 [连接类型] JOI…

《网络爬虫》

网络爬虫&#xff0c;是一种自动化程序&#xff0c;用于抓取互联网上的数据。它们通过模拟浏览器行为&#xff0c;抓取网页内容并提取有用信息。爬虫广泛应用于数据采集、搜索引擎索引、竞争对手分析等领域。爬虫的工作流程&#xff1a;请求目标网页&#xff1a;爬虫首先发送 H…

openpnp - 顶部相机环形灯光DIY

文章目录openpnp - 顶部相机环形灯光DIY概述笔记ENDopenpnp - 顶部相机环形灯光DIY 概述 底部相机灯光用环形灯(用钣金折弯成一个10mm高的矩形盒子)是可以的。因为吸嘴落到Z方向和PCB平齐时&#xff0c;用COB灯带装在一个矩形盒子中正好能照射到吸嘴尖端高度附近。 顶部相机…

[AI React Web] E2B沙箱 | WebGPU | 组件树 | 智能重构 | 架构异味检测

第三章&#xff1a;E2B沙箱交互 在前两章中&#xff0c;我们掌握了对话状态管理和AI代码生成管道的运作原理。 但生成代码如何真正运行&#xff1f;这正是E2B沙箱交互的核心价值。 架构定位 E2B沙箱是专为open-lovable打造的虚拟计算环境&#xff0c;具备以下核心能力&…

Redis宝典

Redis是什么 Redis是开源的&#xff0c;使用C语言编写的&#xff0c;支持网络交互&#xff0c;可基于内存也可持久化到本地磁盘的Key-Value数据库。 优点&#xff1a; 因为Redis是基于内存的&#xff0c;所以数据的读取速度很快Redis支持多种数据结构&#xff0c;包括字符串Str…

MyBatis-Plus 分页失效问题解析:@Param 注解的影响与解决方案

引言在 Spring Boot MyBatis-Plus 的开发中&#xff0c;分页查询是常见的需求。然而&#xff0c;有时我们会遇到分页失效的问题&#xff0c;尤其是在方法参数上添加 Param 注解后。本文将通过一个实际案例&#xff0c;分析 Param 注解如何影响 MyBatis-Plus 的分页机制&#x…

机器学习——模型的简单优化

在训练模型时我们可能会遇到模型不满足于预期需要进行改善的环节&#xff0c;这些情况通常包括以下几种常见问题和对应的解决方案&#xff1a;数据质量不足数据量过少&#xff1a;当训练样本不足时&#xff0c;模型难以学习到有效的特征表示。建议通过数据增强&#xff08;如图…

17.MariaDB 数据库管理

17.MariaDB 数据库管理 数据库介绍 数据库&#xff08;Database&#xff09;简单来说&#xff0c;就是按照一定规则存数据的 “仓库”。它能高效存大量数据&#xff0c;还能方便地查、增、改、删数据&#xff0c;是各种信息系统的核心。 核心特点: 结构化存储&#xff1a;数…

AI抢饭碗,软件测试该何去何从?

AI 浪潮下&#xff0c;软件测试路在何方 当某大厂宣布 “AI 测试机器人上岗首日就覆盖 80% 的功能测试” 时&#xff0c;测试圈炸开了锅 —— 有人连夜更新简历&#xff0c;有人在技术论坛发问&#xff1a;“十年测试经验&#xff0c;难道真的不如一行 AI 代码&#xff1f;”AI…

09 ABP Framework 中的 MVC 和 Razor Pages

ABP Framework 中的 MVC 和 Razor Pages 该页面详细介绍了 ABP Framework 与 ASP.NET Core MVC 和 Razor Pages 的集成&#xff0c;涵盖框架组件、项目模板、主题系统和模块集成模式等内容&#xff0c;提供了 ABP 应用程序中传统的服务器端 Web UI 选项。 框架集成组件 ABP 提供…

docker 容器内编译onnxruntime

docker run -itd -p 49142:49142 --gpus "device0" --name cpp_env_20250812 --shm-size"5g" -v /本地路径/onnxruntime:/onnxruntime nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04进入容器内安装必要的依赖git clone --branch v1.13.1 --recursive https…