正点原子[第二期]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中断服务函数源码

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

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

相关文章

java对象互换工具类

1:将Object类型转成json字符串 /*** 将对象转为字符串* param obj* return*/public static String toString(Object obj) {if(obj null) {return null;}if ("".equals(obj.toString())) {return null;}if (obj instanceof String) {return obj.toString();}try {Ob…

Spring Cloud Gateway 11种断言工厂

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Spring Cloud Gateway路由匹配是Spring WebFlux基础功能的一部分,在Spri…

你认识edge吗,edge是做什么的

简介 Microsoft Edge(研发代号为Project Spartan,又译作微软边缘浏览器,Edge浏览器)是一个由微软研发的基于Chromium开源项目及其他开源软件的网页浏览器,于2015年1月21日公布,2015年3月30日公开发布第一个…

pyqt曲线轨迹运动

pyqt曲线轨迹运动 pyqt QPropertyAnimation介绍曲线轨迹运动代码 pyqt QPropertyAnimation介绍 QPropertyAnimation 是 PyQt中的一个类,它用于对 Qt 对象的属性进行动画处理。通过使用 QPropertyAnimation,你可以平滑地改变一个对象的属性值&#xff0c…

闭散列哈希表

一、什么是 哈希 ? 1.1 哈希概念 与 哈希冲突 在正式介绍闭散列哈希之前,我们需要明确 哈希 的概念。 哈希 :构造一种数据存储结构,通过函数 HashFunc() ,使 元素的存储位置 与 其对应的键值 建立一一映射关系&…

国产开源物联网操作系统

软件介绍 RT-Thread是一个开源、中立、社区化发展的物联网操作系统,采用C语言编写,具有易移植的特性。该项目提供完整版和Nano版以满足不同设备的资源需求。 功能特点 1.内核层 RT-Thread内核包括多线程调度、信号量、邮箱、消息队列、内存管理、定时器…

JVM基础之垃圾回收

垃圾回收 1. Base 内存泄漏:不再使用的对象在系统中未被回收 内存溢出:内存泄漏的积累 手动触发垃圾回收:System.gc(),该方法不一定会立即回收垃圾,仅仅是向JVM发送一个垃圾回收请求,具体是否需要垃圾回收由JVM自行…

怎么找回回收站里删除的XLS文件?5个恢复方法

我们经常会使用到XLS文件来存储和整理数据。然而有时候由于误操作或不小心,我们可能会将重要的XLS文件删除,并且这些文件可能还被清空出了回收站。面对这种情况许多人会感到焦虑和无助。但是不必过于担心,因为有专门的软件可以帮助我们找回这…

(Java)心得:LeetCode——5.最长回文子串

一、原题 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba"…

【Linux】什么是进程?

一个正在执行的程序,我们称之为进程。 然后我们来顺着一条线来思考。 操作系统底层是用C语言编写的,而我们的进程,它会有各种属性,那么各种属性就可以用一个结构体来对进程的各个属性进行描述,然后这个结构体里面&…

手写一个SPI FLASH 读写擦除控制器(未完)

文章目录 flash读写数据的特点1. 扇擦除SE(Sector Erase)1.1 flash_se 模块设计1.1.1 信号连接示意图:1.1.2 SE状态机1.1.3 波形图设计:1.1.4 代码 2. 页写PP(Page Program)2.1 flash_pp模块设计2.1.1 信号连接示意图:…

Soviet Kitchen

苏联厨房-具有道具和带有碰撞器的模块化建筑部件的游戏环境资产 内部资产包: 网格-253 前言-98 材料-26 纹理-116 网格格式-(FBX) 纹理格式-(PNG) 资产列表: _BigShelf 多边形计数-1986 文本大小-2048x2048 可以 多边形计数-277 结构尺寸-512x512 _Celling 多边形计数-1 …

Codeforces Round 217 (Div. 2) A. Rook, Bishop and King(BFS)

Rook, Bishop and King 题面翻译 【题目描述】 佩蒂亚正在学习国际象棋。他已经学会如何移动王、车和象。让我们提示你如何移动国象棋子。棋盘有 64 64 64个棋格,呈 8 8 8\times8 88正方形。一个格子可以用 ( r , c ) (r,c) (r,c)来表示—— r r r指行&#xff…

Stable Diffusion的技术原理

一、Stable Diffusion的技术原理 Stable Diffusion是一种基于Latent Diffusion Models(LDMs)实现的文本到图像(text-to-image)生成模型。其工作原理主要基于扩散过程,通过模拟数据的随机演化行为,实现数据…

回表的原理竟然这么简单

“回表” 是指在使用辅助索引(非聚簇索引)作为条件进行查询时,由于辅助索引中只存储了索引字段的值和对应的主键(聚簇索引)键值,因此需要根据主键(聚簇索引)中的键值去查找实际的数据…

verilog中含有无关项的序列检测

编写一个序列检测模块,检测输入信号a是否满足011XXX110序列(长度为9位数据,前三位是011,后三位是110,中间三位不做要求),当信号满足该序列,给出指示信号match。 程序的接口信号图如…

Python 中的 Lambda 函数:简单、快速、高效

大家好,今天再给大家介绍一个python的一个强大工具Lambda 函数,它允许你快速定义简单的匿名函数。这种函数是“匿名的”,因为它们不需要像常规函数那样被明确命名。 在本文中,我们将通过清晰的解释和实用的示例,深入了…

基于GIS地理技术+智慧巡检解决方案(Word原件)

传统的巡检采取人工记录的方式,该工作模式在生产中存在很大弊端,可能造成巡检不到位、操作失误、观察不仔细、历史问题难以追溯等现象,使得巡检数据不准确,设备故障隐患得不到及时发现和处理。因此建立一套完善的巡检管理系统是企…

【2022 深圳 ArchSummit 】大数据架构稳定性保障实践

文章目录 一、前言二、现状三、大数据架构的历史变迁(一)洪荒期&MR(二)远古期&MPP(四)近现代&Flink/Spark(五)现如今&实时数据湖架构 四、架构稳定的关键因素&#…

编程式导航

目录 一、问题引入 二、基本跳转 1.path路径跳转(简易方便) 2.name命名路由跳转(适合path路径长的场景) 三、路由传参 1.path路径跳转传参 (1)query传参 (2)动态路由传参 2.…