arm GIC介绍之四

发布者:Lihua1314520最新更新时间:2024-11-08 来源: cnblogs关键字:arm  GIC  ARM体系 手机看文章 扫描二维码
随时随地手机看文章

GIC是ARM体系中重要的组件,在认识到GIC的组成和功能之后,了解到IRQ的大致流程,从硬件IRQ到来,到IRQ结束。我们实际在KERNEL里面,或者在设备驱动里面处理的IRQ其实是软件意义上的,那么硬件的中断和软件的中断如何联系起来的呢,大概的处理流程是如何呢?
这章我们介绍这部分内容。


GIC 中断处理流程

我们希望理解概念和流程,总结认识和思路,所以代码细节上的解释需要忽略掉。可以看代码细节,但是总结时候要去掉。毕竟,即使是自己看过了,过了一段时间再重新读代码,也是有些陌生的。我们还是以图开始。

HW ARCH
我们在之前介绍“arm GIC介绍之一/二/三”:
http://blog.csdn.net/sunsissy/article/details/73791470
http://blog.csdn.net/sunsissy/article/details/73842533
http://blog.csdn.net/sunsissy/article/details/73842533
一直在强调,GIC上对物理的IRQ的处理,比如上图,一个DEVICE_1上触发一个IRQ,到GIC,HWIRQ为111,如果软件侧管理中断不冲突的话,可以直接映射desc_irq 111,以此为结构并处理。但是实际中并不这么完美。
比如图中另外一个DEVICE,同时来了3个信号,或者说,而这个设备和GIC只有一个IRQ的物理连接通路,只能传递一个IRQ信号,那么这又如何表示和区分3个信号呢,如何和CPU的软件意义上的IRQ联系起来呢?
这就新增加了IRQ_DOMAIN的概念。

struct irq_domain {  

   struct list_head link;  

   const char *name;  

   const struct irq_domain_ops *ops; //callback函数 

   void *host_data;//this will point to irq_data, and contains gicd_base, info and so on.

    /* Optional data */   

   struct device_node *of_node;//该interrupt domain对应的interrupt controller的device node  

   struct irq_domain_chip_generic *gc; //generic irq chip concept , we ignore this.

    /* reverse map data. The linear map gets appended to the irq_domain */

    irq_hw_number_t hwirq_max; //该domain中最大的那个HW interrupt ID     

    unsigned int revmap_direct_max_irq; //

    unsigned int revmap_size; //线性映射的size,for Radix Tree map和no map,该值等于0     

    struct radix_tree_root revmap_tree; //Radix Tree map will use radix tree root node     

    unsigned int linear_revmap[]; //linear mapping lookup table, we will pay attention to it.

    };


简化后如图:

IRQ_DOMAIN

总结来说,IRQ_DOMAIN是以GIC 为单位,一个GIC设备对应一个IRQ_DOMAIN, 从图中可以看出,如果系统中有多个IRQ_DOMAIN,那么会形成一个list,统一管理。
IRQ_DOMAIN里面包含了GIC的基本信息,比如host_data,可以保存对应的Distributor的基地址;最大的硬件中断数目hwirq_max;如果是线性映射,那么linear_revmap保存了线性映射的关系;
当然,重要的irq_domain_ops里面有对应的操作,eg:gic_irq_domain_map这就是如何把硬件IRQ和软件处理侧的desc_irq对应起来的。
只有这样映射后,软件侧才方便以desc_irq单位对IRQ进行管理和处理,desc_irq如图:
desc_irq
对每个desc_irq,不仅包含了一个IRQ的基本信息,也包含了对应的控制等信息。
Irq_data中,有一个IRQ对应的硬件中断号hwirq,对应的GIC DOMAIN。当然Irq_chip以及对应的API,提供了如何向GIC写入信息比如表示IRQ处理结束写入Irq_eoi等等。
Irq_action 里面有中断的处理入口,以及对应的具体函数HANDLER。
这是在软件处理层面的,有了这样的接口和信息,一个驱动才可以获得一个desc_irq,把对应的IRQ注册到里面,并对触发方式,是否MASK进行控制,并找到对应的HANDLER进行注册和后续处理。所以从整个的流程来说我们给出这样的逻辑结构,见下图:
IRQ flow
整个结构分为3部分,上面试DRIVER,可以认为是使用者,中间是软件的层面,最下面是Hardware ,这里重要的是中间的结构,为上层DRIVER提供了IRQ的注册接口request_threaded_irq,使能接口enable_irq,亲和性或者说送到具体CPU处理的配置接口irq_set_affinity等,这里不全部列举。
那么这些接口要具体配置到GIC硬件的Hardware上,在IRQ general logic中就有对应的 irq_set_chip,这里面对应的操作会去执行和具体平台硬件相关的设置。不仅如此,当设置完成,允许中断,如果来了一个硬件中断到Hardware ,那么也在IRQ general logic进行先处理,所以这提供双向的SERVICE。会先irq_to_desc,找到对应的desc_irq,然后分类处理如果IPI走对应处理,如果是其它的走generic_handle_irq,这就转到了左侧的IRQ flow
control-layer 。
IRQ flow control-layer顾名思义,就是把众多的接受到的中断分流,如果是LEVEL触发类型的,走handle_level_irq,上下沿触发的走handle_edge_irq,不同的入口可能对EOI的写入时机和方式有区别等等。再如handle_percpu_irq在处理时候,因为不涉及到其它CPU,所以对于多个CPU之间共享的操作就不需要LOCK做保护。然后再去找特定的每个驱动定义的HANDLER处理。

GIC 中断处理流程实例

看下:

shell@amt6797_64_open:/ shell@amt679764open:/

cat /proc/interrupts
CPU0
29: 0 GICv3 29 arch_timer_sec_zhonghua
30: 50721 GICv3 30 arch_timer
96: 0 GICv3 96 mtk_cpuxgpt0
97: 0 GICv3 97 mtk_cpuxgpt1
……
184: 45 GICv3 184 mtk_cmdq
188: 0 GICv3 188 m4u
201: 0 GICv3 201 mt-gpt
210: 0 GICv3 210 pmic_wrap
211: 0 GICv3 211 mtk-kpd
212: 0 GICv3 212 SPM
231: 0 GICv3 231 SCP IPC_MD2HOST
234: 720 GICv3 234 mutex

……
255: 0 GICv3 255 aal
361: 0 GICv3 361 ocp_cluster2
362: 0 GICv3 362 ocp_cluster2
389: 1 mt-eint 5 TOUCH_PANEL-eint
390: 0 mt-eint 6 11240000.msdc1 cd
392: 0 mt-eint 8 iddig_eint
400: 0 mt-eint 16 accdet-eint
560: 1 mt-eint 176 pmic-eint
IPI0: 7106 Rescheduling interrupts
IPI1: 7 Function call interrupts
IPI2: 196 Single function call interrupts
IPI3: 0 CPU stop interrupts
IPI4: 0 Timer broadcast interrupts
IPI5: 112 IRQ work interrupts
Err: 0
shell@amt6797_64_open:/
上面是从X20上看到interrupts。左侧部分加粗体是硬件中断号,右侧对应的斜体数字是软件看到的desc_irq对应的编号。
这里面可以看到,以左侧硬件中断号为索引来说。上面是29和30号中断,这个是PPI中断类型,在这里是CPU对应的TIMER,从这往后到362是SPI,在X20上支持384个硬件中断号,所以多出来的389~560就奇怪了。我们后面介绍。
另外就是IPI消息,这个比较少。
我们先分析下,硬件中断号如何和软件对应的。
首先:
开辟IRQ空间
在进入KERNEL之后,进行GIC初始化后,我们之前提到IRQ_DOMAIN的配置,提到以GIC为单位。那么在这里通过读取参数获取到支持的HARDWARE IRQ数目是384个,去掉其中16个SGI(不需要映射),新申请384-16个desc_irq,并且把IRQ_DOMAIN其它数据如基地址等都填好,挂到LIST上统一管理。在这里,采用的是简单的线性MAPPING,所以17到384这中间的硬件中断号和软件中断号是一一对应的,打印出来:
hwirq<->desc_irq
第一个编号为16,最后一个编号为383的IRQ。
之后进行基本的irq_domain_associate_many。我们看下这里做了什么:
mapping

这里名字上说是associate,其实是对这些IRQ做些分类的基本信息填充,主要的是区分16~31号中断的描述信息,由于是PPI中断,所以将其分流入口设定为handle_percpu_devid_irq。那么其它一般的SPI 分流入口这里都设定为handle_fasteoi_irq,而不是handle_level_irq或者handle_edge_irq。


关键字:arm  GIC  ARM体系 引用地址:arm GIC介绍之四

上一篇:arm GIC介绍之一
下一篇:arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf等的区别

推荐阅读最新更新时间:2026-03-20 19:54

arm GIC介绍之一
GIC是ARM架构中及其重要的部分,本文只在公开ARM对应资料基础上,以MTK开发板为基础整理。个人理解之后记录,巩固和加深认识,仅此而已,如果有错误,欢迎指出。 1. GIC的概述 看过SOC架构的同学知道,CPU接受外部的中断处理请求,并进行处理,其实是一个被动接受的过程,这样好处是既能 保证主任务的执行效率,又能及时获知外部的请求,从而处理重要的设备请求操作。 如图: GIC的全称为general interrupt controller,主要作用可以归结为: 接受硬件中断信号,并进行简单处理,通过一定的设置策略,分给对应的CPU进行处理。 这样的图比较简单,可以看下在ARM完整的SOC结构中,其位置是什么样
[单片机]
<font color='red'>arm</font> <font color='red'>GIC</font>介绍之一
ARM体系结构--第一章
注:本文资料全部来源于网络或书籍,同时加上个人理解。若有侵权,告知即删。若有错误,留言商讨。 1、ARM处理器有两种工作状态,7种工作模式 2种状态: ARM指令状态:32位指令 Thumb指令状态:16位指令 【补充】调试状态 7种工作模式: 管理模式和系统模式的区别: 系统模式和用户模式相比,使用相同的寄存器,增加了一些在usr模式下不能访问的资源。 管理模式相比系统模式可以访问资源的能力相同,都属于特权模式,并且管理模式有自己模式下的影子寄存器R13_svc和R14_svc。 uboot的目的是初始化硬件,设置为svc模式更有利于其工作。 2、ARM体系的异常中断 ARM体系中程序执行流程主要3中
[单片机]
<font color='red'>ARM体系</font>结构--第一章
学习ARM体系结构的意义
时常有些同学会问,在嵌入式开发中用得最多的是什么?我答,是C语言。那么最复杂的是什么?是嵌入式操作系统。只有Bootloader主要用到体系结构的知识吗?嗯,那当然。写Bootloader似乎也太麻烦了点,这要怎么开始啊?没有人要求你从车轮开始造的,提供开发板的厂商必然会附送一个具备基本功能的Bootloader的,你就分析它,按自己的意愿修改它,然后就可得到自己的Bootloader了。那岂不是学习体系结构没有多大用了? 换个视角来看。数学贵为科学的皇后,自打背上书包起,各类数学课本就没有离开过我们,也是各类国家级大考的“常委”,可毕业后的工作实践中,究竟有多少次用到过那些高深的数学知识了?大多数人都会迟疑片刻,接着把脑袋摇
[单片机]
浅谈ARM体系CPU的7种工作模式
  ARM有37个寄存器,其中31个通用寄存器,6个状态寄存器。本文主要讨论的是ARM体系的CPU的7种工作模式。   一、存储器格式(字对齐)   Arm体系结构将存储器看做是从零地址开始的字节的线性组合。从零字节到三字节放置第一个存储的字(32位)数据,从第四个字节到第七个字节放置第二个存储的字数据,一次排列。作为32位的微处理器,arm体系结构所支持的最大寻址空间为4GB。   存储器格式   1、大端格式:高字节在低地址,低字节在高地址;   2、小端格式:高字节在高地址,低字节在低地址。   指令长度   Arm微处理器的指令长度是32位的,也可以为16位(thumb状态下)。Arm微处理器中支持字节(8位),半
[单片机]
浅谈<font color='red'>ARM体系</font>CPU的7种工作模式
关于ARM体系中栈的对齐问题
基于ARM架构的处理器的C语言程序设计遵循ATPCS(ARM-THUMB procedure call standard)和AAPCS(ARM Application Procedure Call Standard)。ATPCS规定数据栈为FD(满递减Full Decrease)类型,并且对数据栈的操作是8字节对齐的。在我自己的轻量级的嵌入式操作系统tqOS中没有考虑到线程工作栈的8字节对齐的问题,这样从内存池中分配到的栈的起始地址可能是4字节对齐的也可能是8字节对齐的,如果运气好每一个线程的栈式8字节对齐的则不会有什么问题出现,如果运气差线程的栈式4字节对齐的,那么就会导致种种错误......例如,最要命的是在线程函数中进行浮点
[单片机]
ATPCS ARM体系中汇编语言和c语言之间参数传递规则
ATPCS   ATPCS即ARM-THUMB procedure call standard的简称。   PCS规定了应用程序的函数可以如何分开地写,分开地编译,最后将它们连接在一起,所以它实际上定义了一套有关过程(函数)调用者与被调用者之间的协议。   PCS强制实现如下约定:调用函数如何传递参数(即压栈方法,以何种方式存放参数),被调用函数如何获取参数,以何种方式传递函数返回值。   PCS的制订是一系列指标的 tradeoff(折衷) (因为很大程度上涉及系统的一些性能),如会涉及生成代码的大小,调试功能的支持,函数调用上下文处理速度以及内存消耗。当然,通过编译器的支持可以让生成的代码有不同的特性,如gcc编
[单片机]
嵌入式Linux+ARMARM体系结构与编程(ARM汇编指令)
自己的一些简单的总结,也是最常用的ARM汇编指令,之后也会不断的补充完善。 1. 汇编系统预定义的段名 .text @代码段 .data @初始化数据段 .bss @未初始化数据段 需要注意的是,源程序中.bss段应该在.text之前。 2.定义入口点 汇编程序的缺省入口是 start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点。 .text .global _start _start: 3 .word用法 word expression就是在当前位置放一个word型的值,这个值就是expression 举例来说, _rWTCON: .word 0x15300000 就是在当前
[单片机]
深入理解ARM体系架构(S3C6410)---arm7,arm9,arm11区别
1. 时钟频率的提高 虽然内核架构相同,但ARM7处理器采用3级流水线的冯 诺伊曼结构;而ARM9采用5级流水线的哈佛结构,ARM11为8级流水线哈弗结构(从arm9开始都采用了哈弗结构)。增加的流水线设计提高了时钟频率和并行处理能力。5级流水线能够将每一个指令处理分配到5个时钟周期内,在每一个时钟周期内同时有5个指令在执行。在常用的芯片生产工艺下,ARM7一般运行在100MHz左右,而ARM9则至少在200MHz以上.ARM11首先推出350M~500MHz时钟频率的内核,目前上升到1GHz时钟频率。 2 指令周期的改进 指令周期的改进对于处理器性能的提高有很大的帮助。性能提高的幅度依赖于代码执行时指令的重叠,这实际上是程序
[单片机]
深入理解<font color='red'>ARM体系</font>架构(S3C6410)---<font color='red'>arm</font>7,<font color='red'>arm</font>9,<font color='red'>arm</font>11区别
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved