【ARM】Exynos 4412 中断理论分析

来源:互联网 发布:http 服务器默认端口 编辑:程序博客网 时间:2024/05/22 14:30

中断在计算机体系结构中具有重要的地位。要进行中断编程,首先要清楚发生中断时程序的跳转流程,然后再根据实际的硬件体系结构编程。

中断跳转流程


首先,中断是异常的一种,因此,中断发生时,Soc实际上是按照异常的标准处理流程来执行的。

由于CPU上电之后执行的第一条代码是汇编代码,所以我们需要在汇编程序中完成异常向量表的装载,堆栈的初始化等操作,才能执行C语言的程序。

下面是已经启动的系统在中断发生时所执行的操作,前半部分是异常处理流程,后半部分为中断专属的处理流程。

Created with Raphaël 2.1.0产生中断(异常)(以下操作由处理器自动完成)1. 复制CPSR到SPSR2. 修改CPSR 2.1 使处理器进入ARM状态 2.2 使处理器进入相应的异常模式 2.3 根据情况屏蔽IRQ和FIQ中断3. 将PC-4的值存入LR4. 修改PC的值为相应的异常向量(IRQ或FIQ)1. 执行异常向量表中的指令,跳转到中断处理汇编程序2. 执行中断处理汇编程序 2.1 修正LR的值(LR = LR - 4) 2.2 保护现场,将{r0 – r12, lr}压入堆栈 2.3 跳转到中断处理函数,一般使用C语言编写 2.4 恢复现场,不仅需要恢复{r0 – r12, lr},还要恢复CPSRCPU回到被中断的指令继续执行

Exynos 4412中断处理


接触过ARM9或者ARM11的人或许更熟悉VIC(向量终端控制器),由于Exynos 4412是一款四核处理器,因此不同于以往的终端控制器,它使用了GIC(通用终端控制器)。管理了160个中断源,包括Software Generated Interrupts (SGIs), Private Peripheral Interrupts (PPIs) 和 Shared Peripheral Interrupts (SPIs)。

我们只讨论SPI,即共享外围设备中断。整个过程大致如下图:

Created with Raphaël 2.1.0SPI中断源产生中断信号外设层次:1. GPIO 引脚配置为中断模式。2. 设置中断触发方式,有上升沿、下降沿、高电平、低电平、双沿触发。3. 在 IO 控制器中关闭 GPX1_1 的中断屏蔽,使能中断。至此, GPIO 相关基础器都已经配置好,中断信号已经可以进入到中断控制器。---注意:由于芯片手册描述不清,实际上存在以下对应关系:WAKEUP_INTm[n] 的中断配置寄存器为 EXT_INTm[n] 。GIC层次:1. 在GIC Interrupt Table 中查找中断的SPI号和中断号。2. 配置 GIC 中断控制器 ICDISER 使能相应的中断。3. 配置 GIC 中断控制器 ICCICR_CPUn 使能 CPU0 中断。4. 配置 CPU0 优先级过滤寄存器 为0xff,允许所有中断通过。5. 配置 GIC 全局中断使能寄存器 ICDDCR ,启动终端控制器6. 配置寄存器 ICDIPTR,将中断送到 CPU0 通道先清除 GPIO 中断挂起寄存器 EXT_INT41_PEND;再清除 GIC 中断控制器中挂起位,通过寄存器 ICDICPR 完成。