本文主要是介绍imx6ull中断体系之GICV2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文不研究中断虚拟化相关内容,部分内容来自于百问网手册
一、中断类型
Peripheral interrupt :其包含以下两种类型的外围中断,它们可以边缘触发或者高低电平触发
Private Peripheral Interrupt (PPI) :这是一个特定于单个处理器的外围中断。
Shared Peripheral Interrupt (SPI) :共享中断,这部分中断所有的核都可以处理。
Software-generated interrupt (SGI) :通过写入GICD_SGIR寄存器来产生中断,系统常用SGIs来进行内部处理器间通信。GICC_IAR或者GICC_AIAR来表明哪个处理器请求中断。
Virtual interrupt :虚拟中断
Maintenance interrupt :在GIC虚拟扩展中,用于发出关键事件的 level-sensitive 中断
二、中断状态
① 非活动状态(Inactive)–这意味着该中断未触发。
② 挂起(Pending)–这意味着中断源已被触发,但正在等待CPU核处理。待处理的中断要通过转发到CPU接口单元,然后再由CPU接口单元转发到内核。
③ 活动(Active)–描述了一个已被内核接收并正在处理的中断。
④ 活动和挂起(Active and pending)–描述了一种情况,其中CPU核正在为中断服务,而GIC又收到来自同一源的中断。
外设发给分发器的中断将标记为pending状态(或Active and Pending状态,如触发时果状态是active)。distributor确定可以传递给CPU核的优先级最高的pending中断,并将其转发给内核的CPU interface。通过CPU interface,该中断又向CPU核发出信号,此时CPU核将触发FIQ或IRQ异常。作为响应,CPU核执行异常处理程序。异常处理程序必须从CPU interface寄存器查询中断ID,并开始为中断源提供服务。完成后,处理程序必须写入CPU interface寄存器以报告处理结束。然后CPU interface准备转发distributor发给它的下一个中断。
在处理中断时,中断的状态开始为pending,active,结束时变成inactive。中断状态保存在distributor寄存器中。
三、GIC partitioning
GIC体系结构从逻辑上划分为一个分发器块(Distributor)和一个或多个CPU接口块(CPU interfaces)。
GIC体系结构从逻辑上划分为一个分发器块和一个或多个CPU接口块。GIC虚拟化扩展程序向GIC添加了一个或多个虚拟CPU接口.
Distributor:分发器块寄存器由GICD_prefix标识。负责处理各个中断事件的分发问题,也就是中断事件应该发送到哪个 CPU Interface 上去。分发器收集所有的中断源,可以控制每个中断的优先级,它总是将优先级最高的中断事件发送到 CPU 接口端。分发器端要做的主要工作如下:
①、全局中断使能控制。
②、控制每一个中断的使能或者关闭。
③、设置每个中断的优先级。
④、设置每个中断的目标处理器列表。
⑤、设置每个外部中断的触发模式:电平触发或边沿触发。
⑥、设置每个中断属于组 0 还是组 1。
⑦、转发一个SGI到一个或多个目标处理器。
⑧、每个中断的状态可见性
⑨、为软件提供设置或清除外围设备中断的pending状态的一种机制。
CPU interfaces :每个CPU接口块对系统中连接的处理器执行优先级掩蔽和抢占处理。CPU接口块寄存器由GICC_prefix标识。
每个CPU接口块都为连接到GIC的处理器提供了接口,每个CPU接口都为以下内容提供了一个编程接口:
①、使能或者关闭发送到 CPU Core 的中断请求信号。
②、应答中断。
③、通知中断处理完成。
④、设置优先级掩码,通过掩码来设置哪些中断不需要上报给 CPU Core。
⑤、定义抢占策略。
⑥、当多个中断到来的时候,选择优先级最高的中断通知给 CPU Core。
Interrupt IDs:每一个CPU最多支持1020个中断ID,中断ID为ID0-ID1019
ID32-ID1019 are used for SPIs
ID0-ID15 are used for SGIs
ID16-ID31 are used for PPIs
注意:GIC作为内存映射的外围设备,被软件访问。所有内核都可以访问公共的distributor单元,但是CPU interface是备份的,也就是说,每个CPU核都使用相同的地址来访问其专用CPU接口。一个CPU核不可能访问另一个CPU核的CPU接口
四、中断处理流程
4.1 初始GIC
Distributor和CPU interface在复位时均被禁用。复位后,必须初始化GIC,才能将中断传递给CPU核。在Distributor中,软件必须配置优先级、目标核、安全性并启用单个中断;随后必须通过其控制寄存器使能。对于每个CPU interface,软件必须对优先级和抢占设置进行编程。每个CPU接口模块本身必须通过其控制寄存器使能。在CPU核可以处理中断之前,软件会通过在向量表中设置有效的中断向量并清除CPSR中的中断屏蔽位来让CPU核可以接收中断。可以通过禁用Distributor单元来禁用系统中的整个中断机制;可以通过禁用单个CPU的CPU接口模块或者在CPSR中设置屏蔽位来禁止向单个CPU核的中断传递。也可以在Distributor中禁用(或启用)单个中断。下图可以看出整个中断流向。
4.2 GIC中断处理过程
当CPU核接收到中断时,它会跳转到中断向量表执行。顶层中断处理程序读取CPU接口模块的Interrupt Acknowledge Register,以获取中断ID。除了返回中断ID之外,读取操作还会使该中断在Distributor中标记为active状态。一旦知道了中断ID(标识中断源),顶层处理程序现在就可以分派特定于设备的处理程序来处理中断。当特定于设备的处理程序完成执行时,顶级处理程序将相同的中断ID写入CPU interface模块中的End of Interrupt register中断结束寄存器,指示中断处理结束。除了把当前中断移除active状态之外,这将使最终中断状态变为inactive或pending(如果状态为inactive and pending),这将使CPU interface能够将更多待处理pending的中断转发给CPU核。这样就结束了单个中断的处理。同一CPU核上可能有多个中断等待服务,但是CPU
这篇关于imx6ull中断体系之GICV2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!