前期运用的arm芯片规划较小,在芯片上直接有uart的中止服务函数地址寄存器,直接将中止服务函数的地址写入寄存器就搞定了。然后zynq好像比较复杂,中止也比较复杂。在zynq中有个Scu(snoop control unit窥视操控单元,也是arm一切的)专门操控中止处理。Vivado SDK中供给了scugic驱动来处理相关的操作。下面详细说一下,中止hook的进程。
XScuGic_LookupConfig // 找到scugic的界说实体;
XScuGic_CfgInitialize // 初始化scugic实体;
Xil_ExcepTIonInit() //反常处理初始化
Xil_ExcepTIonRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,
(Xil_ExcepTIonHandler)XScuGic_InterruptHandler,
pScuGic);
这一步基本是固定的,中止触发之后一致由XScuGic_InterruptHandler先处理,然后在HandlerTable中查找相应的处理函数。这个HandlerTable数组的长度为95个,包括了一切的中止ID。
Xil_ExceptionEnable(); //反常处理使能
XScuGic_Connect( pScuGic,
XPAR_PS7_UART_1_INTR, (Xil_InterruptHandler)ZUartPs_InterruptHandler , (void*)pUart1Inst);
这才是将咱们界说的中止服务函数地址映射到HandlerTable中。也能够运用UartPs驱动中包括的中止处理函数。
XScuGic_Enable( pScuGic, XPAR_PS7_UART_1_INTR);
//使能uart对应的中止ID。
XUartPs_SetInterruptMask( pUart1Inst, XUARTPS_IXR_RXOVR | XUARTPS_IXR_TXEMPTY /*| XUARTPS_IXR_TNFUL*/ );
这应用程序中敞开接纳缓冲fifo中止与发送为空中止。
这时uart接纳到数据,则会主动跳入中止处理函数ZUartPs_InterruptHandler中。向发送硬fifo中写入数据,在数据发空后,也会跳入中止处理函数ZUartPs_Interrupt Handler中。两者依据不同中止状况寄存器中的标识进行相应的处理。