day46

ARM中断处理与GIC


第一部分:中断处理基本流程

  1. 中断响应过程

· 中断源发出中断请求。

· CPU检查是否响应中断,以及该中断是否被屏蔽。

· 检查当前产生的中断的优先级。

· 保护现场(保存当前程序的上下文)。

· 执行中断服务函数。

· 恢复现场(恢复之前保存的上下文)。

第二部分:协处理器与相关指令

  1. 协处理器编号

· cp0 ~ cp15:ARM架构中的协处理器。

· A7内核中:cp10、cp11用于浮点运算,cp15用于存储管理。

· CP10:浮点型运算。

· CP15:存储管理(如Cache控制、MMU、异常向量表基地址等)。

  1. 协处理器访问指令

· MRC:将协处理器寄存器内容读到ARM寄存器。

· MCR:将ARM寄存器内容写入协处理器寄存器。

· 常用操作示例:

· 读取cp15的c1寄存器,修改后写回,用于打开iCache、设置异常向量表基地址选择VBAR。

· 读取cp15的c15寄存器,获取GIC基地址。

第三部分:GIC(通用中断控制器)

  1. GIC的作用

· 接收来自外设的中断请求,进行优先级仲裁,然后分发给CPU。

· 流程:中断源 → GIC → processor 0。

  1. GIC初始化步骤

· 调用GIC_Init()进行初始化。

· 设置中断优先级(GIC_SetPriority)。

· 设置中断使能(GIC_EnableIRQ)。

· 获取GIC基地址(通过读取cp15的c15寄存器)。

· 操作中断通知寄存器(C_IAR,位于GIC基地址+0x200C)读取中断号。

· 操作中断结束寄存器(C_EOIR,位于GIC基地址+0x2010)写入中断号,表示中断处理结束。

  1. 启动代码中的基地址重映射

· 将基地址重映射到0x87800000。

· 通过cp15设置异常向量表基地址选择VBAR。

· 打开iCache。

第四部分:GPIO中断相关寄存器

  1. 中断触发方式寄存器(GPIOX_ICR2)

· 配置GPIO引脚的中断触发方式(如上升沿、下降沿、双边沿等)。

  1. 中断屏蔽寄存器(GPIOX_IMR)

· 设置是否屏蔽某引脚的中断。

· 对应位为1表示使能,为0表示屏蔽。

  1. 中断状态寄存器(GPIOX_ISR)

· 指示当前产生中断的引脚。

· 通过读取该寄存器判断中断源,并在中断服务函数中清除标志位(写1清除)。

第五部分:中断处理代码流程

  1. 汇编异常向量处理函数(irq)

· 调整返回地址:sub lr, lr, #4。

· 保存现场:将r0-r12和lr压栈。

· 获取GIC基地址。

· 切换到sys模式(cps #0x1F),保存lr。

· 调用C语言中断处理函数(bl system_interrupt_handler)。

· 恢复lr,切换回irq模式(cps #0x12)。

· 恢复现场:出栈r0-r12。

· 写EOIR寄存器,通知GIC中断处理结束。

· 恢复pc,返回。

  1. C语言中断服务函数

· 函数原型:void system_interrupt_handler(IRQn_Type irq)。

· 判断中断号是否等于GPIO中断号。

· 检查GPIO中断状态寄存器,判断具体引脚。

· 执行相应处理(如点灯)。

· 清除中断标志位(写1到ISR寄存器)。

第六部分:关键概念与注意事项

  1. 中断优先级

· GIC支持中断优先级设置,高优先级中断可抢占低优先级中断。

  1. 中断屏蔽

· 通过IMR寄存器可屏蔽特定中断源。

  1. 中断标志清除

· 中断服务函数中必须清除中断标志,否则会反复触发中断。

· GPIO中断通过写1到ISR寄存器对应位清除。

  1. 模式切换

· ARM有多种处理器模式,中断处理时需在irq模式和sys模式之间切换。

· irq模式用于响应中断,sys模式用于运行特权级操作系统代码。

  1. 现场保护与恢复

· 中断发生时必须保存当前程序的寄存器状态,处理完毕后恢复,保证被中断的程序能正确继续执行。

  1. 异常向量表基地址

· 通过VBAR寄存器设置异常向量表的基地址。

· 启动代码中需重映射基地址并设置VBAR。

相关推荐
老当益壮梁奶奶1 小时前
ARM汇编学习笔记(四):i.MX6ULL裸机开发:从汇编点灯到C语言BSP工程管理
c语言·arm开发·单片机·嵌入式硬件·51单片机
sunoo-2291 小时前
【ARM嵌入式学习笔记Day5】一文打通GPIO中断全链路:从硬件引脚→GIC→汇编入口→C语言处理
arm开发·笔记·学习·中断·gic·裸机开发
虚无的纽扣1 小时前
【Linux】将进程知识与基础IO融会贯通——简单自定义Shell的实现
linux·ubuntu
loopne1 小时前
AI网文写作全景调研(十):合规篇——检测、平台政策、版权法律
经验分享·笔记·ai写作·智能写作
祖力551 小时前
ARM中断(IMX6ULL中断、GIC通用中断控制器)
嵌入式硬件·arm·imx6ull·中断·gic·通用中断控制器
傲世仙尊1 小时前
预处理详解-define宏井号条件编译一篇过
linux·c语言
忆挽篱笙歌1 小时前
linux基本指令
linux
孙严Pay2 小时前
代付 VS 纯代付
笔记·科技·计算机网络·其他·微信
小小de风呀2 小时前
de风——【从零开始学习Linux】(五):gcc编译器的基本使用
linux·运维·服务器