背景
最近笔者学习到ZYNQ的中断机制时,发现中断的配置过程与以往接触到的传统FPGA处理的思维方式有所不同,特此记录个人的理解和拙见。
函数
void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio,u16 GpioIntrId)
{
//查找GIC中断配置信息并初始化
IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
XScuGic_CfgInitialize(GicInstancePtr, IntcConfig,IntcConfig->CpuBaseAddress);
//初始化ARM处理器异常句柄
Xil_ExceptionInit();
//给IRQ异常注册处理程序
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,GicInstancePtr);
//使能处理器中断
Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
//关联中断处理函数
XScuGic_Connect(GicInstancePtr, GpioIntrId,(Xil_ExceptionHandler)IntrHandler,(void *)Gpio);
//为GPIO器件使能中断
XScuGic_Enable(GicInstancePtr, GpioIntrId);
//设置中断触发类型为下降沿
XGpioPs_SetIntrTypePin(Gpio, MIO_KEY, XGPIOPS_IRQ_TYPE_EDGE_FALLING);
//打开MIO引脚中断使能信号
XGpioPs_IntrEnablePin(Gpio, MIO_KEY);
}
理解
//查找GIC中断配置信息并初始化
IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
XScuGic_CfgInitialize(GicInstancePtr, IntcConfig,IntcConfig->CpuBaseAddress);
我们可以把这里理解为进入一家VIP的会所(PS),那么会所的厨房就是(APU),第一行的目的是,对主厨(GIC总中断控制器)的资历和身份信息(设备ID及地址)进行扫描并在花名册中找到对应的注册认证信息,给大厨一张员工ID卡。第二行代码的目的类似于,人员根据员工卡作为凭证领取入职基础套装礼包(初始同步化)。在会所内工作的设备都需要这样操作。
//初始化ARM处理器异常句柄
Xil_ExceptionInit();
//给IRQ异常注册处理程序
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,GicInstancePtr);
//使能处理器中断
Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
这里指的是,会所(APU)给予您(INT某个中断)私人定制菜谱(中断处理函数)的权利,并开启接受点餐(IRQ)的模式,您可以在菜谱上添加想吃的菜。
//关联中断处理函数
XScuGic_Connect(GicInstancePtr, GpioIntrId,(Xil_ExceptionHandler)IntrHandler,(void *)Gpio);
这行代码的意思是添加喜欢的菜在菜谱上。
//为GPIO器件使能中断
XScuGic_Enable(GicInstancePtr, GpioIntrId);
//设置中断触发类型为下降沿
XGpioPs_SetIntrTypePin(Gpio, MIO_KEY, XGPIOPS_IRQ_TYPE_EDGE_FALLING);
//打开MIO引脚中断使能信号
XGpioPs_IntrEnablePin(Gpio, MIO_KEY);
配合下图红色箭头可以理解,这里三行代码是使能GPIO和MIO的中断开关。相当于会员的饭菜的点完餐后的提交订单,会所打开点餐通道(IRQ)至会所中(APU)按照菜谱(hander)要求执行操作。值得注意的是主厨(GIC)可能同时接收到多个订单(IRQ),那么它会根据他的一套标准安排优先级来完成制作。
总结
ZYNQ软件设计部分的中断系统设置函数的配置过程,可以理解为会员到会所吃饭的过程:
- 会所:核验主厨身份;
- 会所:发放入职套装;
- 会所:注册私人菜谱;
- 会所:开启点菜模式;
- 会员:定制私人菜谱;
- 会员:点完提交订单;