按键检测|中断检测
一.按键检测
1.硬件原理
当未按下按键时,GPIO_5为低电平,按下按键GPIO_5变为高电平。
根据引脚编号找到引脚名称
根据引脚名称找到引脚编号
裸机程序控制外设
特点:读数据手册、设寄存器值
- 找出外设有哪些相关寄存器
- 找出外设相关寄存器如何设置
二.中断检测
1.通用中断控制器(GIC)
GIC用于管理单核或多核芯片中的中断资源
- ARM公司开发了4 个版本GIC规范 ,V1~V4
- ARMv7-A内核搭配GIC-400使用(v2)
2.GIC结构
-
三类信号源:
- 软件中断:用于多核通信,ID0~ID15
- 私有中断:内核独有的中断,ID16~ID31
- 共享中断:所有内核共享的中断,ID32~ID1019
-
分发器:选择把中断信号发送到哪一个cpu接口单元
有哪些相关寄存器?
-
中断数量:GICD_TYPER
-
中断清除: GICD_ ICENABLERn
-
中断使能:GICD_ISACTIVERn
-
中断优先级设置:GICD_IPRIORITYR
-
-
cpu接口单元:处理信号后,发送信号给CPU
有哪些相关寄存器?
- 中断优先级数量:GICC_PMR
- 抢占优先级和子优先级设置: GICC_BPR
- 保存中断ID:GICC_IAR
- 通知cpu中断完成:GICC_EOIR
2.获取GIC基地址
方法一:查询芯片数据手册
方法二:查询cp15协处理器
共有16个:c0~c15。每个协处理器本身有多种含义,需逐步配置
//设置并读协处理器
MRC {cond} p15, <opc1>, <Rn>, <CRn>, <CRm>, <opc2>
//设置并写协处理器
MCR {cond} p15, <opc1>, <Rn>, <CRn>, <CRm>, <opc2>
- cond:执行条件,一般省略
- opc1:第一层设置
- Rn:通用寄存器
- CRn:要设置的协处理器
- CRm:第二层设置
- opc2:第三层设置
CBAR寄存器
CRn=c15,opc1=4,CRm=c0,opc2=0
- 查询GIC的地址
MRC p15, 4, r1, c15, c0, 0 ;获取 GIC 基地址
把c15配置成CBAR寄存器,此时成c15的值就是GIC的基地址。
SCTLR 寄存器
CRn=c1,opc1=0,CRm=c0,opc2=0
-
bit13:中断向量表基地址
-
cache\mmu\分支预测…
MRC p15, 0, <Rt>, c1, c0, 0 ;读取 SCTLR 寄存器,数据保存到 Rt 中。 MCR p15, 0, <Rt>, c1, c0, 0 ;将 Rt 中的数据写到 SCTLR(c1)寄存器中。
VBAR寄存器
CRn=c12,opc1=0,CRm=c0,opc2=0
- bit5~31:中断向量表偏移地址
MRC p15, 0, <Rt>, c12, c0, 0 ;读取 VBAR 寄存器,数据保存到 Rt 中。
MCR p15, 0, <Rt>, c12, c0, 0 ;将 Rt 中的数据写到 VBAR寄存器中。
2.中断向量表
一级查表
自动跳转指定位置(基址+偏移)
| addr | TYPE | FUNCTION | MODE |
|---|---|---|---|
| 0x00 | Reset | 复位中断 | SVC |
| 0x04 | Undefined instructions | 未定义指令中断 | Undef |
| 0x08 | Supervisor Call | 软中断 | SYC |
| 0x0C | Prefetch abort | 指令预取中止中断 | ABT |
| 0x10 | Data abort | 数据访问中止中断 | ABT |
| 0x14 | RESERVED | 未使用 | 未使用 |
| 0x18 | IRQ interrupt | IRQ 中断 | IRQ |
| 0x1C | FIQ interrupt | FIQ 中断 | FIQ |
通过触发不同类型的中断,系统进入到相应的运行模式
二级查表
预先注册、回调执行
3.中断处理流程
中断上下文
cpu通过内核寄存器来运行指令并进行数据的读写处理的,它在进入中断前一个时刻的具体值,称为中断上下文
具体流程
-
初始化irq模式栈指针
-
进入irq模式
- cpsr寄存器
-
保存现场
- 通用寄存器
- lr
- spsr
-
获取中断编号
- 读取GIC基地址
- GICC基地址(GIC cpu interface)
- GICC_IAR寄存器
-
执行中断处理函数
- 根据中断编号,回调IRQ中断服务表
-
还原现场
-
通用寄存器
-
lr
-
spsr
-
-
返回原程序
- 三级流水线
cpsr寄存器
![2023-09-24T13:31:38.png][12]
- bit31:负数标记位
- bit30:零标志位
- …
- M[4:0]:运行模式控制位
- 10000:User 模式
- 10001:FIQ 模式
- 10010:IRQ 模式
- 10011:SVC模式
- 10111:Abort模式
- 11011:Undef模式
- 11111:System模式
- 10110:Monitor模式
- 11010:Hyp模式
mrs <Rt>,cpsr //读cpsr
msr cpsr,<Rt> //写cpsr
cps #xx //写立即数到cpsr中的M[4:0]
GICC基地址
4.1.3 CPU interface register ma (GIC官方手册)
三级流水线
- 取指令(pc)
- 译指令
- 执行指令
lr = pc = 当前执行指令+8
当前执行指令的下一条:lr-4
3.按键中断实验
GIC相关寄存器
-
分发器
- 中断数量:GICD_TYPER
- 中断清除: GICD_ ICENABLERn
- 中断使能:GICD_ISACTIVERn
- 中断优先级设置:GICD_IPRIORITYR
详见GIC官方手册
4.3 Distributor register descriptions
-
cpu接口单元
- 中断优先级数量:GICC_PMR
- 抢占优先级和子优先级设置: GICC_BPR
- 保存中断ID:GICC_IAR
- 通知cpu中断完成:GICC_EOIR
详见GIC官方手册
4.4 CPU interface register descriptions
GPIO中断相关寄存器
-
gpio中断触发类型:高/低电平、上升/下降沿
-
GPIO5_ICR1(0~15)
-
GPIO5_ICR2(16~31)
-
-
gpio中断屏蔽
- GPIO5_IMR
-
gpio中断状态寄存器
- GPIO5_ISR
-
gpio双边缘触发
- GPIO5_EDGE_SEL
详见芯片数据手册
28.5 GPIO Memory Map/Register Definition
中断服务函数表
记录每个IRQ中断的回调函数
-
函数指针
-
函数参数
中断向量表偏移位置
C语言读写cp15协处理器
__ASM ( code : 输出操作数列表 : 输入操作数列表 );
-
code
-
具体操作指令(字符串表示)
-
#是把宏参数变为一个字符串 -
##是把两个参数连接在一起
__STRINGIFY(p##coproc) ", ->“p15”
-
-
操作数
通过%加数字引用,比如%0 引用第一个操作数,%1 引用第二个操作数
r:将变量放入通用寄存器
4.位置无关码和重定位
程序执行和变量访问的两种方式:
- pc指针+偏移地址
- 绝对地址
位置无关码
没有出现绝对地址访问的代码称为位置无关码
- 普通.text段指令
- 局部变量
位置无关码可以在任意合法内存运行
位置相关码
出现了绝对地址访问的代码称为位置相关码
-
访问.data段:初始值非零的全局变量、静态变量
-
访问.rodata段:字符串、具有初始值的数组
-
访问.bss段:初始值为0的全局变量、静态变量
-
特殊.text段指令
汇编: ldr pc,=100000c语言:(*(void(*)(void))0x100000)();
位置相关码必须在指定运行地址运行
重定位
在执行位置相关码之前,可以通过位置无关代码把位置相关码加载到位置相关代码的指定位置,如重定位.data段
相关文章:
按键检测|中断检测
一.按键检测 1.硬件原理 当未按下按键时,GPIO_5为低电平,按下按键GPIO_5变为高电平。 根据引脚编号找到引脚名称 根据引脚名称找到引脚编号 裸机程序控制外设 特点:读数据手册、设寄存器值 找出外设有哪些相关寄存器找出外设相关寄存器如何…...
MySQL的执行流程
在聊mysql的执行流程之前,咱们要先聊聊mysql的逻辑架构。 逻辑架构 可以将上图简化为下图 连接层 客服端访问mysql服务器前,要先和mysq建立tcp连接。经过3次握手建立连接成功后,mysql服务器对tcp传输过来的账号密码进行身份认证&#x…...
如何办一份有价值的企业内刊/报纸?向《华为人》学习就够了
前两天有一个朋友联系华研荟,说他是今年大学毕业加入了一个中型公司,他学的是企业管理,在公司人力资源部门工作。上周老板说公司要办一份自己的内刊,这个工作由人力资源部负责,而人力资源经理就把这个活交给她了。 她…...
C++:从初识到初识的旅程
为什么文章是初识到初识呢,因为我真的仅仅是初识,大学只上了半个学期的C,其他的都是网络课程为主 在我踏入大学校门的那刻,我对于未来充满了无限的好奇和期待。其中,C这门神秘的编程语言进入了我的视线。虽然我的专业…...
JavaWeb 学习
1. 基本概念 1.1 Web web:网络,网页 静态 web html,css提供给所有人看的数据始终不会变化 动态 web 淘宝提供给每个人看的数据会有所不同技术栈:Servlet/JSP,ASP,PHP Java 中,动态 web 资…...
百度SEO优化不稳定的原因分析(提升网站排名的稳定性)
百度SEO优化不稳定介绍蘑菇号-www.mooogu.cn SEO不稳定是指网站在搜索引擎中的排名不稳定,随着时间的推移会发生变化。这种情况可能会出现在网站页面结构、内容质量、外链质量等方面存在缺陷或不合理之处。因此,优化SEO非常重要,可以提高网站…...
给你两个集合,要求{A} + {B}
先看题: 看完题后你会觉得:哇,好简单,STL一下就出来啦。 #include <iostream> #include <set>using namespace std;int main() {int n, m;while (cin >> n >> m) {set<int> set_a;for (int i 0;…...
Java获取实时摄像头进行拍照(附源码)
一、导言 1、引言 Java是一种通用编程语言,可以用来开发各种类型的应用程序,包括涉及图像处理和相机操作的应用程序。 要在Java中获取实时摄像头进行拍照,通常会借助一些第三方库或API,例如OpenCV(Open Source Compute…...
Kafka入门
1. Kafka简介 Apache Kafka 是LinkedIn公司开发的一款开源的高吞吐、分布式的消息队列系统,它具有高伸缩性、高可靠性和低延迟等特点,因此在大型数据处理场景中备受青睐。Kafka 可以处理多种类型的数据,如事件、日志、指标等,广泛…...
异地恋的甜蜜解药:李哥的群晖Videostation电影分享教程
异地恋的甜蜜解药:李哥的群晖Videostation电影分享教程 文章目录 异地恋的甜蜜解药:李哥的群晖Videostation电影分享教程1.使用环境要求2.制作视频分享链接3.制作永久固定视频分享链接 李哥和他的女朋友是一对甜蜜的情侣,但不幸的是ÿ…...
JSON数据获取指南!
在互联网时代,数据是金钱的来源。然而,要从海量的网页中提取需要的数据并不容易。本文将带你了解如何使用Node.js编写简易爬虫程序,帮助你轻松获取并处理JSON数据,让你不再为数据发愁。 一、准备工作 安装Node.js:确保…...
ASCII码-对照表
ASCII 1> ASCII 控制字符2> ASCII 显示字符3> 常用ASCII码3.1> 【CR】\r 回车符3.2> 【LF】\n 换行符3.3> 不同操作系统,文件中换行 1> ASCII 控制字符 2> ASCII 显示字符 ASCII(American Standard Code for Information Interc…...
点餐小程序的制作流程详解
随着移动互联网的发展,越来越多的消费者开始使用手机进行点餐,这也促使了点餐小程序的兴起。如果您是一位商家,想要开发一个属于自己的点餐小程序,那么不妨尝试一下以下的DIY教程吧! 首先,我们需要找一个专…...
Python应用程序:从Android日志到Excel文件的智能过滤和输出
import json import subprocess import re import openpyxldef logcat(excel_path, check_re):"""查看 安卓手机日志信息:param excel_path: excel的路径信息,标题行字段:param check_re: 过滤当前日志的正则表达式(之后记得优化…...
C++常见面试题汇总
C++常见面试题汇总: C++中的指针和引用有什么区别?什么是C++中的多态?如何实现?C++中的析构函数有什么作用?什么是构造函数链?C++中如何进行内存管理?什么是作用域?C++中的作用域限定符有哪些?什么是预处理指令?C++中常见的预处理指令有哪些?什么是头文件?头文件中…...
redis缓存穿透问题
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库 常见的解决办法: 缓存空对象:第一次请求发现redis和数据库中都不存在时,,可以设置请求数据为key,null为值,放置在缓存中. 但是会有一个问题,就是如果此类请求过多,会导…...
学生宿舍管理系统(前端java+后端Vue)实现-含前端与后端程序
界面介绍 登录 ###宿舍管理 ###菜单管理 ###角色管理 ###班级管理...
codesys【网桥】
作用:在串联的路由器上,实现PC2访问PC1 实现无线编程 和PLC【web】 1硬件连接: 2软件设置: 1网卡设置自动ip 2厂家软件连接到模块...
JS生成随机字符串的多种方法
<script language"javascript"> function randomString(len) {len len || 32;var $chars ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678; /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/var maxPos $chars.length;var pwd ;for (i 0; i &l…...
多维时序 | MATLAB实现GWO-BP多变量时间序列预测(灰狼算法优化BP神经网络)
多维时序 | MATLAB实现GWO-BP多变量时间序列预测(灰狼算法优化BP神经网络) 目录 多维时序 | MATLAB实现GWO-BP多变量时间序列预测(灰狼算法优化BP神经网络)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.MATLAB实现GWO-BP多变量时间序列预测(灰狼算法优化BP神经网络)&…...
WarcraftHelper:开源工具赋能魔兽争霸3现代硬件适配与性能优化全指南
WarcraftHelper:开源工具赋能魔兽争霸3现代硬件适配与性能优化全指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款…...
5分钟搞定!用PySide2+Python快速搭建串口助手(附完整源码)
5分钟搞定!用PySide2Python快速搭建串口助手(附完整源码) 1. 为什么选择PySide2开发串口工具? 在嵌入式开发和物联网项目中,串口调试工具就像工程师的"瑞士军刀"。传统方案如C/QT开发周期长,而Py…...
OS17.【Linux】进程基础知识(1)
目录 1.浅层定义 程序和进程的区别 2.查看进程的方法 ps ajx top 查看/proc目录 编辑 PID 3.手动用ps查看自己运行的程序 在/proc手动查看自己运行的程序目录 杀死进程的常用方法 进程目录中的文件 cwd 理解"当前路径"的含义 4.如何管理一个进程 程…...
51:L构建容器与Kubernetes安全:蓝队的容器防御
作者: HOS(安全风信子) 日期: 2026-03-19 主要来源平台: GitHub 摘要: 当基拉开始攻击容器与Kubernetes环境时,传统的安全防御方法已无法满足需求。L开发容器与Kubernetes安全防御系统,保护容器环境的安全。…...
GemPy:让三维地质建模从复杂算法变成简单Python代码
GemPy:让三维地质建模从复杂算法变成简单Python代码 【免费下载链接】gempy GemPy is an open-source, Python-based 3-D structural geological modeling software, which allows the implicit (i.e. automatic) creation of complex geological models from inter…...
追赶30名
1.单词2.翻译生成式人工智能是指能够生成与训练数据相似的新数据的模型。常见的生成模型包括生成对抗网络(GAN)和扩散模型。这些模型已成功应用于图像生成、文本创作和音频合成等领域。在GAN框架中,生成器与判别器相互对抗,从而不…...
Wan2.1-umt5开发环境搭建:IDEA集成与调试技巧详解
Wan2.1-umt5开发环境搭建:IDEA集成与调试技巧详解 如果你是一名Java开发者,最近开始接触Wan2.1-umt5这类模型,可能会觉得有点无从下手。模型本身是用Python写的,各种脚本和命令行操作,跟咱们熟悉的Java开发环境完全是…...
表格拖拽排序实战:从业务需求到代码落地的全链路指南
表格拖拽排序实战:从业务需求到代码落地的全链路指南 【免费下载链接】ngx-datatable ✨ A feature-rich yet lightweight data-table crafted for Angular 项目地址: https://gitcode.com/gh_mirrors/ng/ngx-datatable 在现代Web应用中,数据表格…...
Java八股文实战:从cv_resnet101模型服务理解RPC与序列化
Java八股文实战:从cv_resnet101模型服务理解RPC与序列化 你是不是也遇到过这种情况?面试时被问到“RPC和HTTP有什么区别?”、“序列化协议怎么选?”,脑子里全是书本上的概念,什么“远程过程调用”、“轻量…...
STM32F103重映射实战:GPIO_Remap1_CAN1与GPIO_Remap2_CAN1到底选哪个?
STM32F103重映射实战:GPIO_Remap1_CAN1与GPIO_Remap2_CAN1到底选哪个? 第一次在STM32F103上配置CAN总线时,看到GPIO_Remap1_CAN1和GPIO_Remap2_CAN1这两个选项,我完全懵了——它们有什么区别?为什么需要两个重映射选项…...
