在嵌入式系统中,中断是处理器响应外部事件的重要机制。I.MX6U 是基于 ARM Cortex-A7 内核的处理器,其中断系统包括 IRQ(外部中断)和 FIQ(快速中断)。本文将详细介绍 I.MX6U 的中断使能和优先级设置。
1. 中断使能
中断使能包括两部分:
- IRQ 或 FIQ 总中断使能:控制全局中断的开关。
- ID0~ID1019 中断源使能:控制具体中断源的开关。
1.1 IRQ 和 FIQ 总中断使能
IRQ 和 FIQ 分别是外部中断和快速中断的总开关。类似于家中的总电闸,必须先打开总开关,才能使用具体的电器(中断源)。
-
CPSR 寄存器:
- I 位:控制 IRQ 中断。
I=1
禁止 IRQ,I=0
使能 IRQ。 - F 位:控制 FIQ 中断。
F=1
禁止 FIQ,F=0
使能 FIQ。
- I 位:控制 IRQ 中断。
-
指令控制:
cpsid i
:禁止 IRQ 中断。cpsie i
:使能 IRQ 中断。cpsid f
:禁止 FIQ 中断。cpsie f
:使能 FIQ 中断。
指令 | 描述 |
---|---|
cpsid i | 禁止 IRQ 中断 |
cpsie i | 使能 IRQ 中断 |
cpsid f | 禁止 FIQ 中断 |
cpsie f | 使能 FIQ 中断 |
1.2 ID0~ID1019 中断使能和禁止
GIC(Generic Interrupt Controller)寄存器用于控制具体中断源的使能和禁止。
- GICD_ISENABLERn:用于使能中断。
- GICD_ICENABLERn:用于禁止中断。
对于 Cortex-A7 内核,中断 ID 只使用了 512 个。每个寄存器控制 32 个中断 ID,因此需要 16 个寄存器来控制所有中断。
寄存器 | 描述 |
---|---|
GICD_ISENABLER0 | 控制 ID0~ID31 的中断使能 |
GICD_ISENABLER1~15 | 控制 ID32~ID511 的中断使能 |
GICD_ICENABLER0 | 控制 ID0~ID31 的中断禁止 |
GICD_ICENABLER1~15 | 控制 ID32~ID511 的中断禁止 |
2. 中断优先级设置
I.MX6U 的中断优先级分为抢占优先级和子优先级,可以通过 GIC 寄存器进行配置。
2.1 优先级数配置
GIC 控制器最多支持 256 个优先级,数字越小,优先级越高。Cortex-A7 选择了 32 个优先级。
- GICC_PMR 寄存器:用于配置优先级数。
- 低 8 位有效,最多支持 256 个优先级。
- I.MX6U 使用 32 个优先级,因此
GICC_PMR
设置为0b11111000
。
GICC_PMR 值 | 优先级数 |
---|---|
11111111 | 256 |
11111110 | 128 |
11111100 | 64 |
11111000 | 32 |
11110000 | 16 |
2.2 抢占优先级和子优先级位数设置
抢占优先级和子优先级的位数由 GICC_BPR
寄存器决定。
- GICC_BPR 寄存器:低 3 位有效,用于配置抢占优先级和子优先级的位数。
GICC_BPR 值 | 抢占优先级域 | 子优先级域 | 描述 |
---|---|---|---|
0 | [7:1] | [0] | 7 级抢占优先级,1 级子优先级 |
1 | [7:2] | [1:0] | 6 级抢占优先级,2 级子优先级 |
2 | [7:3] | [2:0] | 5 级抢占优先级,3 级子优先级 |
3 | [7:4] | [3:0] | 4 级抢占优先级,4 级子优先级 |
4 | [7:5] | [4:0] | 3 级抢占优先级,5 级子优先级 |
5 | [7:6] | [5:0] | 2 级抢占优先级,6 级子优先级 |
6 | [7:7] | [6:0] | 1 级抢占优先级,7 级子优先级 |
7 | 无 | [7:0] | 0 级抢占优先级,8 级子优先级 |
2.3 优先级设置
每个中断 ID 的优先级由 GICD_IPRIORITYR
寄存器设置。
- GICD_IPRIORITYR 寄存器:
- 每个中断 ID 对应一个优先级寄存器。
- 优先级范围为 0~31,数字越小优先级越高。
- 优先级值需要左移 3 位写入寄存器。
示例:
GICD_IPRIORITYR[40] = 5 << 3; // 设置 ID40 中断的优先级为 5
3. 总结
I.MX6U 的中断系统通过 GIC 控制器实现了灵活的中断使能和优先级配置。以下是关键点:
- 中断使能:
- 使用
cpsie i
使能 IRQ 中断。 - 使用
GICD_ISENABLERn
使能具体中断源。
- 使用
- 优先级设置:
- 配置
GICC_PMR
设置优先级数。 - 配置
GICC_BPR
设置抢占优先级和子优先级的位数。 - 使用
GICD_IPRIORITYR
设置具体中断的优先级。
- 配置
通过合理配置中断使能和优先级,可以确保系统对外部事件的快速响应和高效处理。
参考资料:
- I.MX6U 嵌入式 Linux 驱动开发指南
- ARM Cortex-A7 技术参考手册
相关链接:
希望这篇博客能帮助你更好地理解 I.MX6U 的中断使能和优先级设置!如果有任何问题,欢迎在评论区讨论。