正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.4讲 GPIO中断实验-IRQ中断服务函数详解

前言:

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

引用:

正点原子IMX6U仓库 (GuangzhouXingyi) - Gitee.com

《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf》

正点原子资料下载中心 — 正点原子资料下载中心 1.0.0 文档

正文:

本文是 “正点原子[第二期]Linux之ARM(MX6U)裸机篇--第15.4 讲” 的读书笔记。第15讲主要是介绍I.MX6U处理器GPIO中断控制实验。本节将参考正点原子的视频教程第15讲和配套的正点原子开发指南文档进行学习。在第15.4讲视频教程中,正点原子会讲解如何实现自己的 IRQ中断服务函数。

0. 概述

1. GIC中断控制器的基地址

1.1 GIC 中断寄存器内存映射基地址

在文档《Cortex-A7 Technical ReferenceManua.pdf》章节“Chapter 8Generic Interrupt Controller”中介绍了Cortex-A7 GIC 中断控制器的内存映射起始基地址,GIC分发器端寄存器描述和偏移,GIC CPU接口端寄存器描述和偏移。

在GIC中断控制器寄存器的内存映射如下表所示,从表中可以看到GIC中断控制器的寄存器内存映射中 GIC 的 CPU Interface(内核接口端)寄存地址范围从 0x2000(4KB)地址偏移开始,到 0x3ffff结束,地址范围为 0x2000~0x3fff。

1.2 GIC的CPU接口端寄存器 GICC_IAR 

在GIC中断控制器CPU Interface(内核接口端)寄存器中本节教程我们需要关注的是 GICC_IAR(Interrupt Acknowledge Register) 寄存器:

1.3 GIC的CPU接口端寄存器 ICC_EOIR 寄存器

当在 IRQ 中断服务函数里中断ID处理完成之后,需要向 GICC_EIOR (End Of Interrupt Register)寄存器写回之前从 GICC_IAR 中读取到的中断ID号,通知 GIC 控制器该中断ID已经处理完成。

2. 正点原子第15.4讲视频教程“IRQ中断服务函数”B站视频弹幕问题的分析

2.1. 问题1:r0,r1不是已经入栈了么?为什么不能直接使用软?

为什么不能直接使用源码第121行里保存入栈r0,r1寄存器,在调用函数system_irqhandler()的时候,r0,r1不是已经入栈了么?为什么不能直接使用栈里面的r0和r1?

我的理解:
1. 因为在IRQ中断服务函数的起始为止入栈的时候处理器是IRQ模式,此时是将 r0, r1 入栈到了IRQ(sp_irq)模式下的栈中保存。此时在通过 'bl system_irqhandler()' 调用C函数的时处理器是SVC模式,在SVC模式下不能访问到 sp_irq 栈里保存的r0, iq,这个只是原因之一。
2. 另一个原因是ARM的 ATPCS(ARM-Thumb Procedure Call Standard) C语言函数调用约定标准,ARM C语言函数如果形参小于等于4个,使用寄存器 r0,r1,r2,r3 来传递C函数形参。我们这里调用 system_irqhandler() 的时候就使用 r0 来传递参数。

2.2 问题2:调用C函数之前为什么要对lr机型入栈?

第一次进来保存的是IRQ模式下的lr

lr入栈是因为切换模式了,不同的模式都要保存一次不同的现场

lr是中断返回地址一定要保持一致,这里跳转了lr的值会被修改,因此使用栈保存

lr是函数返回地址,调用函数前需要保存当前lr,不然会在执行blx时被覆盖

 我的理解:
1. 此时处理器是SVC模式,使用'bl system_irqhandler()' 调用C函数时,在 'bl' 跳转时会自动修改 lr_svc 寄存器的值,如果不在'bl'跳转之前将 'sp_svc' 寄存器的值入栈保存,那从C函数 system_irqhandler() 调用返回之后之前的 'sp_svc' 寄存器的值就丢失了。所以需要再调用C函数 ‘bl’ 跳转之前,先将 'lr_svc' 入栈,C函数调用结束之后再将 'lr_svc' 出栈。
2. ARM 函数调用通过 'bl' 跳转的一个通用流程就是,先 lr 入栈,bl 跳转到函数(处理器会自动修改lr),函数返回后 lr 出栈。

2.3 问题3:忘记了恢复了CPSR?

2.4 问题4:IRQ中断返回时为什么 pc=lr-4?

 参考链接:ARM异常中断返回地址计算:

ARM中断异常处理的返回_为什么预取中止是减4-CSDN博客

ARM异常中断返回的几种情况_fiq中断的返回地址-CSDN博客

ARM处理器异常返回地址_arm下触发软中断返回地址出错-CSDN博客

嵌入式系统Linux内核开发实战指南(ARM平台)_7.4 ARM处理器的中断(IRQ或FIQ)在线阅读-QQ阅读

我的理解:
阅读了如上参考链接里的博文,我的理解是这样子的,ARM 指令集的内核在执行完指令之后,开始执行新指令之前,此时PC已经更新 PC=新指令+8(原因是ARM三级流水线),ARM内核在这个点上检查当前是否有IRQ中断需要处理,如果有就跳转到中断(异常)服务函数,在跳转到异常处理函数时处理器会自动更新 LR=PC-4 也就是 LR=(新指令+8)-4,LR指向新指令的下一条。当IRQ中断服务函数中断ID处理完成,需要返回到被中断的还未执行的新指令处继续执行,此时需要更新 PC 为 LR 的值再减去4,PC = ((新指令+8)-4)-4 ,更新PC寄存器会引起ARM多级流水线重新刷新,这样就返回了被中断的新指令处继续执行了。
这也就是为什么在IRQ中断服务函数返回的时候,PC=LR-4 的原因。

3. IRQ中断服务函数源码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

debug技巧之本地调试

大家好啊,我是summo,今天给大家分享一下我平时是怎么调试代码的,不是权威也不是教学,就是简单分享一下,如果大家还有更好的调试方式也可以多多交流哦。 如果看过我文章的同学应该知道我是一个Java开发,平时…

FANUC机器人工具坐标偏移的用法

一、工具坐标偏移的使用场景 在机器人位置不改变的情况下,工业机器人使用默认工具坐标系示教的一系列运动点位,要保持原本点位位置不变的情况下,改变机器人工具坐标的参数,就要用到机器人坐标转化的功能。在FANUC机器人上体现为机…

/swagger/index.html#/ 的页面可能存在问题,或者已永久移动到新的网址。

问题背景 在golang的项目中,使用了swagger。在另外一个项目中也使用了swagger,没有发生过这个问题。新的项目中,用了和之前项目同样的web框架,仔细比对了和之前项目的差异,只不过,目录结构做了调整,所以&a…

网络编程套接字 (二)---udosocket

本专栏内容为:Linux学习专栏,分为系统和网络两部分。 通过本专栏的深入学习,你可以了解并掌握Linux。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:网络 🚚代码仓库:小小unicorn的代…

Springboot集成Eureka实现注册中心-11

Spring Cloud Netflix Eureka是Spring Cloud Netflix子项目的核心组件之一,主要用于微服务架构中的服务治理。 什么是注册中心 在微服务架构中往往会有一个注册中心,每个微服务都会向注册中心去注册自己的地址及端口信息,注册中心维护着服务…

泰迪智能科技大数据开发实训平台功能介绍

大数据开发实训平台是面向实训课和课后训练的编程实训平台,平台底层基于Docker技术,采用容器云部署方案,预装大数据相关课程教学所需的实训环境,拥有1主2从的Hadoop集群,还能够自主定制环境,并能够与实训管…

10.轮转数组

文章目录 题目简介题目解答解法一:使用额外的数组代码:复杂度分析: 解法二:数组反转代码:复杂度分析: 题目链接 大家好,我是晓星航。今天为大家带来的是 轮转数组 相关的讲解!&#…

基于VOLOPV2的自动驾驶环境感知系统

基于VOLOPV2的自动驾驶环境感知系统是一个复杂的系统,它主要负责实时检测并识别周围环境中的各种物体和信息,为自动驾驶车辆提供必要的感知数据。以下是对该系统的一个简要介绍: 环境感知是自动驾驶系统中的一个关键部分,它依赖于…

SQL的命令

目录 创建用户 ​编辑 DDL数据库操作 查询 创建 使用 删除 创建数据库表 在表中修改字段 查询表 DML 添加数据 修改 删除 DQL 查询 创建用户 DDL数据库操作 查询 show databases; 创建 权限问题导致无法创建,连接root修改用户权限 CREATE DATABAS…

AJAX概述和基本使用

01 【AJAX概述和基本使用】 1.AJAX简介 AJAX 全称为Asynchronous JavaScript And XML,就是异步的JS 和XML 通过AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据 AJAX 不是新的编程语言,而是一种将现有的标准…

Java入门基础学习笔记8——注释

1、注释: 注释是写在程序中对代码进行解释说明的文件,方便自己和其他人查看,以便理解程序的。 package cn.ensource.note;/**文档注释文档注释 */ public class NoteDemo {public static void main(String[] args) {// 单行注释System.out.…

数字人金融应用技术指南

根据《北京金融科技产业联盟团体标准管理办法》的规定,2024年3月27日经北京金融科技产业联盟第三届理事会第二次会议审议,批准发布《数字人金融应用技术指南》(T/BFIA 027—2024)、《图数据库金融应用技术要求》(T/BFI…

如何在两个日期之间获取日志属性

如果你们想在两个日期之间获取日志属性,需要首先明确你所指的“日志属性”。如果你是指在两个日期之间获取日志(例如文本日志文件)中的记录,你可以使用 Python 的文件操作来读取日志文件,并根据每行记录中的日期属性进…

【35分钟掌握金融风控策略18】贷前风控策略详解-3

目录 ​编辑 贷前风控数据源 第三方数据 贷前风控数据源 第三方数据 在金融风控过程中,金融机构通常会引入一些第三方的风控数据(或第三方金融技术)来辅助识别贷款个人或贷款企业的风险状况,帮助金融机构进行风控决策&#x…

政务网离线安装python3及其依赖手册

文章目录 python安装及环境配置gcc安装make安装python3安装pip安装 测试测试python3报错:ModuleNotFoundError: No module named _ctypes’测试pip3报错“pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.” 依赖库…

Android 如何启用user版本的adb源码分析

通过adb shell中执行getprop persist.sys.usb.config,可以看到系统usb的相关选项,persist.sys.usb.config显示的就是当前系统关于usb选项的系统配置【RK3188Android4.4刚移植的例子】: 全编脚本中make命令会调用build/core/main.mk,在里面可以看到一段…

AWTK 开源串口屏开发(18) - 用 C 语言自定义命令

AWTK-HMI 内置了不少模型,利用这些模型开发应用程序,不需要编写代码即可实现常见的应用。但是,有时候我们需要自定义一些命令,以实现一些特殊的功能。 本文档介绍如何使用 C 语言自定义命令。 1. 实现 hmi_model_cmd_t 接口 1.1…

服务丢在tomcat中启动war包,需要在tomcat中配置Java环境吗?

一般来说,部署在 Tomcat 上的 WAR 包启动时不需要在 Tomcat 中单独配置 Java 环境,因为 Tomcat 启动本身就需要依赖 Java 环境。以下是确保 Tomcat 正常运行与部署 WAR 包的基本步骤: 安装 Java 环境: 首先,确保你的系…

实现WPF中的数据更新 属性通知界面:INotifyPropertyChanged接口

在WPF (Windows Presentation Foundation) 应用程序中,当数据发生变化时,通常希望UI能够自动更新以反映这些变化。为了实现这一功能,WPF 提供了数据绑定机制,并且配合 INotifyPropertyChanged 接口使用,可以在数据模型…

打开IE浏览器自动跳转微软的edge浏览器,取消自动跳转

打开IE浏览器会自动跳转微软的edge浏览器 不想跳转的解决办法 1.Win Q 输入 Internet,点击Internet 选项 2.去掉勾选 启用第三方浏览器扩展,然后就不自动跳转了 3. 完成