一、51单片机中断 对比 ARM(IMX6ULL)中断
1.51单片机中断流程

外设产生中断信号 → 进入内核kernel
内核操作:
1)设置CPU中断允许/屏蔽
2)设置中断源允许/屏蔽
3)设置中断优先级
4)执行中断服务函数
2.IMX6ULL中断
GIC通用中断控制器
1)外设
外设产生多路中断信号送入GIC(Generic Interrupt Controller,通用中断控制器),GIC处理后通过IRQ、FIQ、VIRQ、VFIQ信号给到内核kernel。
2)GIC(协处理器)
① 设置中断源允许/屏蔽
②设置中断优先级
③加载中断优先级
④ 中断分发(多核)
3)内核kernel
① 设置CPU中断允许/屏蔽(CPSR)
②切换处理器工作模式(IRQ模式)
③跳转到异常向量表
④ 执行IRQ中断服务函数
⑤恢复工作模式
二、GIC版本
-
GIC V1:旧款嵌入式芯片,Cortex-A9
-
GIC V2:支持虚拟化、最多8核处理器,最多支持1020个中断;IMX6ULL使用此版本。
-
GIC V3~V4:支持超8核处理器,性能提升,多用于手机芯片
-
GIC V5:全新架构,支持数百核,用于服务器、车载算力芯片
三、GIC中断分类
总共最多1020个中断,IMX6ULL支持160个
-
SPI 共享中断:外设产生的中断,所有CPU都可以处理外设中断;中断源来自外设。
-
PPI 私有中断:核与核之间通信(多核处理器),和外设无关,是CPU核内部之间的中断。
-
SGI 软件中断:软件代码程序产生的中断。
四、关键寄存器
1. 外设寄存器
• GPIOx_ICR2:配置引脚中断触发方式(下降沿/上升沿触发中断)
• GPIOx_IMR:使能对应引脚中断
• GPIOx_ISR:中断状态寄存器。查询该寄存器,对应引脚位为1,代表产生中断,处理完后清0。
2. GIC寄存器
• C_IAR:中断通知寄存器(只读)。内核读取该寄存器,获取中断号,确认是哪个外设触发中断。
• C_EOIR:中断结束寄存器(只写)。内核处理完中断后,把中断号写入此寄存器,通知GIC:本次中断处理完毕。
五、其他
1.协处理器
协助CPU执行特定任务的专用处理单元(内核),编号CP0 ~ CP15。
CP15:一组系统控制寄存器组。
2.汇编指令
① mrc
读指令,读取CP15中寄存器的数据到通用寄存器
②mcr
写指令,将通用寄存器的数据写入到CP15中的寄存器
指令格式:
mrc <coproc>, <opc1>, <Rt>, <CRn>, <CRm>, {<opc2>}
代码:
mrc p15,0,r0,c1,c0,0 //将CP15中SCTLR寄存器读到R0寄存器
bic r0, r0, #(1<<13) //异常向量表重映射
orr r0, r0, #(1<<12) //打开icache
mcr p15,0,r0,c1,c0,0 //将R0的值写回CP15的SCTLR寄存器
GIC基地址读取:
mrc p15,4,r0,c15,c0,0 ;GIC_BASE → R0
六、inline 内联函数
inline:内联函数,本质依旧是函数。
调用内联函数前,必须存在该函数的定义。编译阶段,编译器会把内联函数在函数调用位置直接展开,省去函数调用压栈、跳转开销,提高执行效率。
