imx6ull中断体系之GICV2

2024-06-16 07:18
文章标签 imx6ull gicv2 中断 体系

本文主要是介绍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中禁用(或启用)单个中断。下图可以看出整个中断流向。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7s7d3G3t-1632440409209)(E:\u-boot\pic\中断流程.png)]

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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065794

相关文章

基于imx6ull开发板 移植opencv4.7.0

一、概述 本章节是针对opencv-4.7.0移植到Linux系统,运行在正点原子-I.MX6U ALPHA开发板 上,详细的移植流程如下。 二、环境要求 2.1 硬件环境 正点原子-I.MX6U ALPHA开发板虚拟机:VMware 2.2 软件环境 Ubuntu系统要求:20.04opencv版本: 4.7.0opencv贡献软件版本:4.x交叉工具链版本:gcc-linaro-6

告别繁琐邀请码,Xinstall助你轻松搭建高效App推广体系!

随着互联网流量的不断变迁,App推广和运营面临着前所未有的挑战。如何快速搭建起满足用户需求的运营体系,成为众多企业亟待解决的问题。在这个背景下,Xinstall凭借其强大的功能和灵活的解决方案,成为了App推广的得力助手。 一、传统营销与获客痛点 传统企业营销依赖现有的流量池与少量获客渠道,但当互联网流量红利衰退,仅依靠少量渠道和简单的数据分析显然不现实。企业需要提高获客转化的效率和用户留存

51单片机STC89C52RC——6.1 中断系统

一,文字层面理解          反正我看下面的几段文字时脑壳没有正常运转。一个头几个大         中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。         当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件

STM32 EXTI(外部中断)和NVIC(嵌套向量中断控制器)学习

STM32 EXTI(外部中断)和NVIC(嵌套向量中断控制器)学习 在STM32中EXTI有0~18个事件/中断,0~4各自都是单独的一个通道,5~9是共一个通道,10~15共享一个通道,16/17/18各自独立用到一个通道 在STM32中NVIC是嵌套向量中断控制器,分为0~4五个组,称之为(Group) NVIC_PriorityGroup_0 ~ NVIC_Priorit

17-云原生监控体系-metrics-server

1. 关于监控 Kubernetes 如果想让 Prometheus 监控 Kubernetes 集群,首先需要明确集群中需要监控哪些对象,也就是需要收集哪些监控指标,如下是总结 Kubernetes 集群中大概有三类指标需要收集: 集群中每个节点服务器的指标,就是每台服务器的CPU,内存等这些级别信息,可以使用之前学习到的 node_exporter 实现。Kubernetes 集群组件的指

request_irq() 注册中断服务函数

函数原型: int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id) 参数:irq:申请的硬件中断号            handler:向系统注册的中断处理函数,当中断发生时会触发该函数.  dev_id参数将被传递

【1213工作日志】ZYNQ的中断应用

【1213工作日志】ZYNQ的中断应用 /** main.c** Created on: 2018年12月3日* Author: xizi.cheng*//** main.c** Created on: 2018年10月7日* Author: xizi.cheng*//** main.c** Created on: 2018年9月27日* Author: xi

Spring自定义标签体系和应用

我们知道,在使用Dubbo框架时,需要指定配置文件中的application、protocol、registry、provider、service等服务器端和客户端的配置项,典型的配置方法如下所示。通过这些配置项,我们可以基于Spring容器来启动Dubbo服务。 <!-- 提供方应用信息,用于计算依赖关系 -->   <dubbo:application name="demo-provi

WDF驱动-中断处理(二)

被动级别的中断是WDF比较有特色的地方之一,在windows下,则可以分为DIRQL、DISPATCH、PASSIVE三级处理,这三级处理是为了避免系统长时间处于高优先级下,其中PASSIVE也被成为被动级别的中断。 从框架版本 1.11 开始,Kernel-Mode Driver Framework (KMDF) 和 User-Mode Driver Framework (在操作系统的 Win

算法体系-23 第二十三节:暴力递归到动态规划(五)

一 求K次打击之后,英雄把怪兽砍死的概率 1.1 描述 给定3个参数,N,M,K 怪兽有N滴血,等着英雄来砍自己 英雄每一次打击,都会让怪兽流失[0~M]的血量 到底流失多少?每一次在[0~M]上等概率的获得一个值 求K次打击之后,英雄把怪兽砍死的概率 1.2 分析 尝试 第一砍可能让他掉0滴血到m滴血,就是0到m的展开,k次的话就是有(1+m)有k个相乘 math.pow(m+1,