GIC驱动程序对中断的处理流程

承接上一篇,我们来讲讲GIC的处理流程:

我们先来看看老版本的CPU是怎么去处理中断的:

这种的话,基本上就是一开始就确定你有多少个中断,就为你分配好了多少个irq_desc,这样子每一个硬件中断,也就是hwirq跟虚拟中断virq就是确定的了,这个时候只需要去使用宏定义去标定这俩个的关系就可以了,但是这样子是有问题的,一旦硬件中断多起来,那么我们得一个个去定义嘛,工作量有点过于庞大了,所以在新的处理中断的方法中:

我们使用了动态分配的方法

一级中断控制器处理流程:

对于irq_desc,内核有两种分配方法:

  • 一次分配完所有的irq_desc

  • 按需分配(用到某个中断才分配它的irq_desc

现在的内核基本使用第1种方法。

  • 假设GIC可以向CPU发出16~1019号中断,这些数字被称为hwirq。0~15用于Process之间通信,比较特殊。

  • 假设要使用UART模块,它发出的中断连接到GIC的32号中断,分配的irq_desc序号为16

  • 在GIC domain中会记录(32, 16)

  • 那么注册中断时就是:request_irq(16, ...)

  • 发生UART中断时

    • 程序从GIC中读取寄存器知道发生了32号中断,通过GIC irq_domain可以知道virq为16

    • 调用irq_desc[16]中的handleA函数,它的作用是调用action链表中用户注册的函数

之前我们也大概讲过这个irq_desc结构体数组,他的irq_data中是含有iqr_chip结构体,里面有着各种的操作中断的函数,并且还有一个irq_domain结构体,里面包含着解析设备树的函数以及存储着hwirq和virq的关系

多级中断控制器处理流程:

  • 假设GPIO模块下有4个引脚,都可以产生中断,都连接到GIC的33号中断

  • GPIO也可以看作一个中断控制器,对于它的4个中断

  • 对于GPIO模块中0~3这四个hwirq,一般都会一下子分配四个irq_desc

  • 假设这4个irq_desc的序号为100~103,在GPIO domain中记录(0,100) (1,101)(2,102) (3,103)

  • 对于KEY,注册中断时就是:request_irq(102, ...)

  • 按下KEY时:

    • 程序从GIC中读取寄存器知道发生了33号中断,通过GIC irq_domain可以知道virq为16

    • 调用irq_desc[16]中的handleB函数

      • handleB读取GPIO寄存器,确定是GPIO里2号引脚发生中断

      • 通过GPIO irq_domain可以知道virq为102

      • 调用irq_desc[102]中的handleA函数,它的作用是调用action链表中用户注册的函数

这里可以看出对于串口触发的中断,GIC去调用handle函数的时候是直接去处理action里面的fun函数的,而对于gpio,handle只是用来分发的

可以看到,这里的话,在GIC遍历寄存器后,发现是33号发生的中断的话,然后通过他自己的irq_domain结构体找到对应的viqr,也就是17,然后会调用里面的handle去处理,他会去屏蔽33号中断,然后处理,最后清楚33号中断,在处理里面,会去读取GPIO的寄存器,然后得到hwirq,然后通过他的irq_domain去得到virq,也就是102,然后去调用他的handle,最后就是屏蔽gpio2,然后调用fun,最后清楚gpio2

那么到这里,GIC的处理中断的流程就差不多讲清楚了,接下来就是去讲讲具体是怎么通过函数去调用的啦,我们下一篇来讲,完结,撒花(doge.)

 

 

<think>嗯,用户想了解STM32MP157A的中断处理流程和实现机制。首先,我需要回忆一下STM32MP157A的架构。这款芯片是双核的,Cortex-A7和Cortex-M4,分别运行Linux和RTOS或裸机程序。中断处理在这两个核心上应该有不同的机制。 首先,Cortex-A7这边运行Linux中断处理应该遵循Linux内核的中断子系统流程Linux中的中断处理分为上半部和下半部,上半部负责快速响应,下半部处理耗时任务。用户可能需要了解设备树中的中断配置,比如使用GIC中断控制器,以及在驱动中注册中断处理函数的过程。 然后是Cortex-M4这边,如果运行的是RTOS比如FreeRTOS,其中断处理机制可能更直接,比如通过NVIC配置优先级和中断服务例程。不过用户的问题可能更关注Linux侧的处理,但需要确认。 接下来,用户提到的引用中提到了RemoteProc和OpenAMP框架,用于核间通信。中断处理可能涉及核间中断(IPI),这部分需要解释如何通过Mailbox或硬件信号进行通信。 需要分步骤说明中断处理流程,从硬件触发到驱动处理,再到核间通信的可能过程。同时要确保使用正确的LaTeX格式,比如提到中断向量表时用$vector\_table$,或者寄存器地址用$0x40000000$这样的格式。 用户可能还关心具体实现,比如设备树中的中断节点配置,驱动代码中的request_irq函数使用,以及处理函数如何编写。需要结合引用中的内容,比如使用wait()系统调用等待子进程,但可能关联不大,不过核间通信可能涉及进程间同步。 需要检查是否有遗漏的关键点,比如中断优先级、中断屏蔽、上下半部机制(tasklet、workqueue)的使用。此外,双核之间的中断协调,比如如何触发M4核的中断,或者A7核如何响应来自M4的中断。 最后,生成相关问题时要围绕中断处理机制、核间通信、性能优化、应用场景等方面提问,确保问题具有连贯性和相关性,帮助用户深入理解。</think>### STM32MP157A中断处理机制及实现流程 STM32MP157A是双核异构处理器(Cortex-A7和Cortex-M4),其中断处理需结合Linux内核与实时操作系统(如RT-Thread或裸机程序)的机制。以下分两部分说明: --- #### **1. Cortex-A7(Linux侧)中断处理流程** 1. **硬件中断触发** 外设通过GPIO、定时器等硬件模块产生中断信号,由GIC(Generic Interrupt Controller)统一管理。例如,GPIO中断配置为边沿触发时,GIC将信号传递给CPU核。 2. **Linux内核中断子系统处理** - **中断向量表**:CPU根据中断号跳转到对应的处理函数,例如$vector\_irq$[^1]。 - **中断上半部(Top Half)**:快速响应中断,通过`request_irq()`注册处理函数,例如: ```c ret = request_irq(irq_num, handler, IRQF_TRIGGER_RISING, "example", NULL); ``` - **中断下半部(Bottom Half)**:延迟处理耗时操作,使用`tasklet`或`workqueue`,例如: ```c DECLARE_TASKLET(my_tasklet, tasklet_handler, 0); ``` 3. **设备树配置** 在设备树中定义中断属性,例如: ```dts gpio_keys { button { label = "User Button"; linux,code = <KEY_ENTER>; gpios = <&gpiog 3 GPIO_ACTIVE_LOW>; interrupts-extended = <&exti 3 IRQ_TYPE_EDGE_FALLING>; }; }; ``` --- #### **2. Cortex-M4(实时侧)中断处理流程** 1. **NVIC配置** Cortex-M4通过NVIC(Nested Vectored Interrupt Controller)管理中断优先级和使能。例如,配置UART中断: ```c HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART2_IRQn); ``` 2. **中断服务例程(ISR)** 直接在代码中实现中断处理函数,例如: ```c void USART2_IRQHandler(void) { if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE)) { // 处理接收数据 } } ``` --- #### **3. 核间中断(IPI)与OpenAMP框架** - **核间通信机制**:通过Mailbox或共享内存实现双核中断通知。例如,A7核通过`rpmsg_send()`发送消息触发M4核中断[^2]。 - **OpenAMP配置**:在Linux侧启用`remoteproc`框架加载M4固件,并注册通信通道: ```c struct rpmsg_endpoint *ept; ept = rpmsg_create_ept(rpdev, rpmsg_channel_cb, NULL, RPMSG_ADDR_ANY); ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值