1 中断系统架构
Zynq中断系统由三部分组成,即中断源、中断控制器和处理器核心,如下图所示。
1.1 中断源
中断源有三种:
- SGI
(1)Software Generated Interrupts,即软件生成中断;
(2)由软件写入通用中断控制器(GIC)的寄存器而触发;
(3)在多核处理器系统中用于实现各种通信和同步机制,如任务调度、锁机制、屏障同步等;
(4)数量16个; - PPI
(1)Private Perpheral Interrupts,即私有外设中断;
(2)是CPU的私有外设中断,每个CPU都有一组独立的PPI中断,用于处理来自特定外设的中断请求;
(3)包括全局计时器、专用看门狗计时器、专用计时器以及从PL端输入的FIQ/IRQ等中断源;
(4)数量每个CPU核心各5个; - SPI
(1)Shared Peripheral Interrupts,即共享外设中断;
(2)是由PS和PL端的共享外设产生的中断;
(3)用于处理来自多个外设的中断请求,如DMA、UART、Timer、IIC、SDIO等,确保这些外设能够及时向CPU报告状态变化或请求服务;
(4)数量60个(PS端44个+PL端16个)。
1.2 中断控制器
中断控制器GIC(Generic Interrupt Controller)位于中断源和处理器核心之间,是用于管理中断的核心组件。中断控制器GIC通过集中管理中断请求,确保CPU能够高效地处理来自各个外设和内部组件的中断信号,其功能主要包括:
- 中断接收:GIC接收来自PS(Processing System)和PL(Programmable Logic)端的多个外设和内部组件的中断请求,这些中断请求包括软件生成的中断(SGI)、CPU私有外设中断(PPI)和共享外设中断(SPI);
- 中断仲裁:当多个中断请求同时发生时,GIC会根据中断的优先级进行仲裁,确保高优先级的中断能够优先得到处理,优先级可以通过软件编程进行配置;
- 中断分发:仲裁完成后,GIC会将中断请求分发到指定的CPU进行处理;对于SPI中断,GIC可以将其分发到一个或两个CPU中的任何一个,而对于SGI和PPI中断,它们通常被分发到特定的CPU进行处理;
- 中断管理:GIC提供了丰富的中断管理功能,包括中断的使能、禁用、屏蔽、优先级配置等,这些功能允许开发者根据系统的实际需求对中断进行灵活的配置和管理。
中断控制器GIC结构如下图所示,ICC(Interrupt Controller CPU)连接SGI和PPI,ICD(Interrupt Controller CPU))连接SPI。
2 中断ID
每个中断源在中断控制器GIC中都被分配了一个唯一的ID号,即中断ID。这个ID号用于在中断处理过程中唯一地标识和区分不同的中断源。
2.1 软件生成中断SGI的ID
2.2 私有外设中断PPI的ID
2.3 共享外设中断的ID
3 中断初始化
中断的程序流程如下图所示,其中前四步为固定流程,因为这四步主要是用来初始化通用中断控制器。因为无论是SGI、PPI还是SPI,这三个中断类型都连接着GIC,因此前四步初始化的便可以固定下来。
初始化代码如下所示:
//
int Status;
XScuGic_Config *IntcConfig; /* Instance of the interrupt controller */
/*
* step1. 初始化中断控制器
*/
IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
if (NULL == IntcConfig) {
return XST_FAILURE;
}
Status = XScuGic_CfgInitialize(GicInstancePtr, IntcConfig, IntcConfig->CpuBaseAddress);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
/*
* step2. 初始化异常处理
*/
Xil_ExceptionInit();
/*
* step3. 注册异常处理回调函数
*/
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, GicInstancePtr);
/*
* step4. 使能异常处理
*/
Xil_ExceptionEnable();