在嵌入式系统中,中断是处理器响应外部事件的重要机制。I.MX6U 是基于 ARM Cortex-A7 内核的处理器,其中断系统包括 IRQ(外部中断)和 FIQ(快速中断)。本文将详细介绍 I.MX6U 的中断使能和优先级设置。


1. 中断使能

中断使能包括两部分:

  1. IRQ 或 FIQ 总中断使能:控制全局中断的开关。
  2. 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。
  • 指令控制

    • 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优先级数
11111111256
11111110128
1111110064
1111100032
1111000016

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 控制器实现了灵活的中断使能和优先级配置。以下是关键点:

  1. 中断使能
    • 使用 cpsie i 使能 IRQ 中断。
    • 使用 GICD_ISENABLERn 使能具体中断源。
  2. 优先级设置
    • 配置 GICC_PMR 设置优先级数。
    • 配置 GICC_BPR 设置抢占优先级和子优先级的位数。
    • 使用 GICD_IPRIORITYR 设置具体中断的优先级。

通过合理配置中断使能和优先级,可以确保系统对外部事件的快速响应和高效处理。


参考资料

  • I.MX6U 嵌入式 Linux 驱动开发指南
  • ARM Cortex-A7 技术参考手册

相关链接


希望这篇博客能帮助你更好地理解 I.MX6U 的中断使能和优先级设置!如果有任何问题,欢迎在评论区讨论。