我用的是C6455,属于C64x+,首先初始化中断配置,进入中断后,TSR寄存器里的值能复制到ITSR寄存器里,但是中断结束出来后,ITSR的值没有自动复制给TSR,导致TSR的GIE还是为0,也就使CSR的GIE仍为0,跳出中断后没有自动使能,请问这是为什么,是什么原因导致这样?应该是出来后自动使能的,谢谢
Tony Tang:
把你的中断ISR贴上来看一下。
tianyu zhang:
回复 Tony Tang:
void Hwi_Fpga_Sig()
{
doorbellinf = *(Uint32 *)DOORBELL0_ICSR;
CSL_intcEventClear(gsIntcHdlFpgaSig->eventId);
Unit16 *sss = (Unit16 *)DOORBELL0_ICCR;
*sss |= 0xFFFF;
*(Uint16 *)INTDST4_RATE_CNTL = 0;
fpgaSigIsrCnt++;
SEM_post(&sem0);
}
tianyu zhang:
回复 Tony Tang:
中断ISR就是上面这个
Tony Tang:
回复 tianyu zhang:
用了dispatch吗?如果没有则在Hwi_Fpga_Sig()前加interrupt关键字,不然就当做普通函数编译了。
tianyu zhang:
回复 Tony Tang:
我把初始化的函数也贴出来吧
void f_IntcInit()
{
CSL_Status liStatus;
CSL_IntcParam leVectId;
gsIntcContext.eventhandlerRecord = gsRecord;
gsIntcContext.numEvtEntries = 128;
CSL_intcInit(&gsIntcContext);
CSL_intcGlobalNmiEnable();
CSL_intcGlobalEnable();
leVectId = CSL_INTC_VECTID_7;
gsIntcHdlFpgaSig = CSL_intcOpen(&gsIntcObjFpgaSig,CSL_INTC_EVENTID__RIOINT4,&leVectId, NULL);
lsEventRecord.handler = &Hwi_Fpga_Sig;
lsEventRecord.arg = gsIntcHdlFpgaSig;
CSL_intcPlugEventHandler(gsIntcHdlFpgaSig,&lsEventRecord);
CSL_intcHwControl(gsIntcHdlFpgaSig,CSL_INTC_CMD_EVTENABLE,NULL);
}
Tony Tang:
回复 tianyu zhang:
void Hwi_Fpga_Sig()改成void interrupt Hwi_Fpga_Sig()做了吗?
tianyu zhang:
回复 Tony Tang:
加这个关键字是为了能够进入中断函数吗?
Tony Tang:
回复 tianyu zhang:
是为了能够正常从IRP返回。因为进入中断服务程序时是将返回地址放到IRP的。不加关键字就不是这样的。
参考文档spru732j第5章。
tianyu zhang:
回复 Tony Tang:
改了,还是跟之前一样,能进入中断函数,但是出中断后,CSR的GIE没有自动使能,寄存器ITSR的值也没有自动复制给TSR
Tony Tang:
回复 tianyu zhang:
搞反了,是interrupt void Hwi_Fpga_Sig (),也不知道这样反了编译能不能通过。
除非是又进了别的中断,不然不可能不使能GIE。
spru187中关于 interrupt关键字的说明:
使能GIE是执行B IRP提令的后自动生效的,看一下你的ISR的生成的汇编代码最后是不是B IRP。