sk2400

EDK opb_intc

0
阅读(2062)
EDK9.1中的opb_intc支持32个中断,这32个中断分别连接到opb_intc 32bit的int_inputs上,中断0对应第0位,中断1对应第1位依次。当中断到来时,ISR中相应的位置1并通过irp告知ppc有external exception(异常5)。在ppc上的软件端,需要先做如下操作

 
//initial the ppc exception table
XExc_Init();
//将XIntc_DeviceInterruptHandler绑定为XEXC_ID_NON_CRITICAL_INT(异常5)的异常处理
XExc_RegisterHandler(XEXC_ID_NON_CRITICAL_INT,
                         (XExceptionHandler)XIntc_DeviceInterruptHandler,
                         (void*) 0);
XExc_mEnableExceptions(XEXC_NON_CRITICAL);
XIntc_Start(IntcInstancePtr, XIN_REAL_MODE);
 
每当有external exception时,程序跳到被XExc_RegisterHandler指定为external exception的异常处理的XIntc_DeviceInterruptHandler(Xintc_l.c)的函数中。将ISR和IER相与的值读入IntrStatus,从IntrStatus的低位到高位(所以是低位中断的优先级高于高位中断)依次判断是否为1,为1表示该ISR对应的中断上有中断请求,然后到XIntc_Config的XIntc_VectorTableEntry HandlerTable[interruptnum]中找中断处理函数。