cpu1 が 2 つ以上のソフト割り込みをそれ自身に送信した場合、ドライバーでは最初の割り込みしか認識されません。
2 つ目の割り込みは保留となります。
この動作の根本原因は、XScuGic_InterruptHandler() での ICCEOIR レジスタの書き込み動作にあります。
書き込みには ICCIAR の値全体が使用される必要があります。
元のドライバーは次のとおりです。
void XScuGic_InterruptHandler(XScuGic *InstancePtr)
{
u32 IntID;
XScuGic_VectorTableEntry *TablePtr;
Xil_AssertVoid(InstancePtr != NULL);
IntID = XScuGic_CPUReadReg(InstancePtr, XSCUGIC_INT_ACK_OFFSET) &
XSCUGIC_ACK_INTID_MASK;
if(XSCUGIC_MAX_NUM_INTR_INPUTS < IntID){
goto IntrExit;
}
TablePtr = &(InstancePtr->Config->HandlerTable[IntID]);
TablePtr->Handler(TablePtr->CallBackRef);
IntrExit:
XScuGic_CPUWriteReg(InstancePtr, XSCUGIC_EOI_OFFSET, IntID);
}
void XScuGic_InterruptHandler1(XScuGic *InstancePtr)
{
u32 IntID;
u32 IntIDFull;
XScuGic_VectorTableEntry *TablePtr;
Xil_AssertVoid(InstancePtr != NULL);
IntIDFull = XScuGic_CPUReadReg(InstancePtr, XSCUGIC_INT_ACK_OFFSET);
IntID = IntIDFull & XSCUGIC_ACK_INTID_MASK;
if(XSCUGIC_MAX_NUM_INTR_INPUTS < IntID){
goto IntrExit;
}
TablePtr = &(InstancePtr->Config->HandlerTable[IntID]);
TablePtr->Handler(TablePtr->CallBackRef);
IntrExit:
XScuGic_CPUWriteReg(InstancePtr, XSCUGIC_EOI_OFFSET, IntIDFull);
}
AR# 53563 | |
---|---|
日付 | 05/19/2014 |
ステータス | アクティブ |
種類 | 一般 |
デバイス | |
ツール |