TI中文支持网
TI专业的中文技术问题搜集分享网站

跳出中断处理函数后ITSR没有复制给tsr

我用的是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。

赞(0)
未经允许不得转载:TI中文支持网 » 跳出中断处理函数后ITSR没有复制给tsr
分享到: 更多 (0)