早期運(yùn)用的arm芯片規(guī)模較小,在芯片上直接有uart的中斷服務(wù)函數(shù)地址寄存器,直接將中斷服務(wù)函數(shù)的地址寫入寄存器就搞定了。然后zynq似乎比較復(fù)雜,中斷也比較復(fù)雜。在zynq中有個(gè)Scu(snoop control unit窺探控制單元,也是arm所有的)專門控制中斷處理。Vivado SDK中提供了scugic驅(qū)動(dòng)來處理相關(guān)的操作。下面具體說一下,中斷hook的過程。
XScuGic_LookupConfig // 找到scugic的定義實(shí)體;
XScuGic_CfgInitialize // 初始化scugic實(shí)體;
Xil_ExceptionInit() //異常處理初始化
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,
(Xil_ExceptionHandler)XScuGic_InterruptHandler,
pScuGic);
這一步基本是固定的,中斷觸發(fā)之后統(tǒng)一由XScuGic_InterruptHandler先處理,然后在HandlerTable中查找相應(yīng)的處理函數(shù)。這個(gè)HandlerTable數(shù)組的長度為95個(gè),包含了所有的中斷ID。
Xil_ExceptionEnable(); //異常處理使能
XScuGic_Connect( pScuGic,
XPAR_PS7_UART_1_INTR, (Xil_InterruptHandler)ZUartPs_InterruptHandler , (void*)pUart1Inst);
這才是將我們定義的中斷服務(wù)函數(shù)地址映射到HandlerTable中。也可以使用UartPs驅(qū)動(dòng)中包含的中斷處理函數(shù)。
XScuGic_Enable( pScuGic, XPAR_PS7_UART_1_INTR);
//使能uart對(duì)應(yīng)的中斷ID。
XUartPs_SetInterruptMask( pUart1Inst, XUARTPS_IXR_RXOVR | XUARTPS_IXR_TXEMPTY /*| XUARTPS_IXR_TNFUL*/ );
這應(yīng)用程序中開啟接收緩沖fifo中斷與發(fā)送為空中斷。
這時(shí)uart接收到數(shù)據(jù),則會(huì)自動(dòng)跳入中斷處理函數(shù)ZUartPs_InterruptHandler中。向發(fā)送硬fifo中寫入數(shù)據(jù),在數(shù)據(jù)發(fā)空后,也會(huì)跳入中斷處理函數(shù)ZUartPs_Interrupt Handler中。兩者根據(jù)不同中斷狀態(tài)寄存器中的標(biāo)識(shí)進(jìn)行相應(yīng)的處理。
評(píng)論
查看更多