本次实验的流程是在PL断产生按键中断,然后在PS端进行处理将按键的纸传给LED实现按下按键点亮LED灯的目的。实验大致分为四个环节:1.首先了解中断;2.本实验的中断分析;3.实际操作;4.源码分析。
- 1.首先了解中断
ARM端的中断体系是在存储地址的低端固化了一个32字节的硬件中断向量表,用来指定各异常中断及其处理程序的入口地址。ARM处理器在响应中断的时候,总是从固定的地址开始(一般是指中断向量表),而在高级语言环境下开发中断服务程序的时候,无法控制固定地址开始的跳转流程,为了使上层应用程序与硬件中断跳转联系起来,需要编写一段中间的服务程序来进行连接–这就是中断解析程序。
这是ARM的中断流程。下面讲述zynq上的中断。
zynq有两个处理器和GCI控制器,中断结构体系结构如下所示:
包括PPI私有外设中断、SGI软件中断和SPI共享外设中断。zynq使用通用中断控制器(GIC)来处理中断。GIC可处理源自以下方面的中断:
*1软件中断(Software Generated Interrupt, SGI,中断号0-15)(16–26 reserved)
*2私有外设中断(Private Peripheral Interrupt, PPI,中断号27-31),
*3共享外设中断(Shared Peripheral Interrupt, SPI,中断号32-95).
4私有外设中断(PPI):每个CPU都有一组PPI,包括全局定时器、私有看门狗定5时器、私有定时器和来自PL的FIQ/IRQ.
*6软件中断(SGI)被路由到一个或者两个CPU上,通过写ICDSGIR寄存器产生SGI.
*7共享外设中断(SPI)由PS和PL上的各种I/O控制器和存储器控制器产生,这些中断信号被路由的CPU.
*8通用中断控制器(GIC)是核心资源,用于集中管理从PS和PL产生的中断信号的资源集合。控制器可以使能、关使能、屏蔽中断源和改变中断源的优先级,并且会将中断送到对应的CPU中,CPU通过私有总线访问这些寄存器。
*9中断控制器(ICC,Interrupt Controller CPU)和中断控制器分配器(ICD, Interrupt Controller Distributor)是GIC寄存器子集。
中断原理
当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理处执行。当异常中断处理程序执行完成后,程序返回到发生中断指令的下一条指令处继续执行。在进入异常中断处理程序时,要保存被中断程序的执行线程。从中断处理程序退出时要恢复被中断程序的执行现场。 - 2.本实验的中断分析
中断的流程(不包括寄存器的初始化和设置)
- 定义中断向量表
//定义中断向量表结构体,Handler为函数,Data为函数Handler的参数
typedef struct {
Xil_ExceptionHandler Handler;
void *Data;
} XExc_VectorTableEntry; - //声明中断向量表
extern XExc_VectorTableEntry XExc_VectorTable[]; - //安装中断处理函数 (中断解析程序)
XExc_VectorTable[5].Handler =(Xil_ExceptionHandler)InterruptHandler_IRQ;
XExc_VectorTable[5].Data = NULL; - //IRQ中断处理函数
void InterruptHandler_IRQ(void);
中断初始化及配置
5. ICD寄存器组(中断分配器)的初始化,共计7个。void Int_Init(void);
6. ICC寄存器组(中断控制器)的初始化并设置,共计2个,void CPU_Init(void);
7.