wince5 ISR中如何传递数据(高分求助)
我用isr-ist模式的中断做过实验,最快差不多响应0.8khz的中断,IST中不用InterruptDone直接操作寄存器后差不多能响应2khz的中断.3khz的时候3k个波差不多要丢失15个左右. 测试方法是用单片机在io输出3k个波,然后在驱动中统计,读完后打印出来.
现在的问题是我需要更高级别的中断响应,于是采用isr模式,看了网上一些文章,大致了解了些,现在最主要的问题是数据传输的问题.
在config.bib文件中增加
RES a0020000 00000800 RESERVED
在common\intr.c中增加
volatile int * m_iUserCnt = (int *)0xa0020000;
volatile int * m_iMaxUserCnt = (int *)0xa0020004;
OEMInterruptHandler函数中增加2个判断
else if (irq == IRQ_EINT2)
{
// Mask and Clear the interrupt.
mask = 1 << irq;
SETREG32(&g_pIntrRegs->INTMSK, mask);
OUTREG32(&g_pIntrRegs->SRCPND, mask);
OUTREG32(&g_pIntrRegs->INTPND, mask);
(*m_iUserCnt)++;
// OUTREG32(&g_pIntrRegs->SRCPND, mask);
CLRREG32(&g_pIntrRegs->INTMSK, mask);
// RETAILMSG(1,(TEXT("int2 occurcnt = %d \r\n",*m_iUserCnt)));
sysIntr = OALIntrTranslateIrq(irq);
}
else if (irq == IRQ_EINT0)
{
// Mask and Clear the interrupt.
mask = 1 << irq;
SETREG32(&g_pIntrRegs->INTMSK, mask);
OUTREG32(&g_pIntrRegs->SRCPND, mask);
OUTREG32(&g_pIntrRegs->INTPND, mask);
(*m_iMaxUserCnt)++;
// OUTREG32(&g_pIntrRegs->SRCPND, mask);
CLRREG32(&g_pIntrRegs->INTMSK, mask);
RETAILMSG(1,(TEXT("int0 occurcnt = %d \r\n",*m_iMaxUserCnt)));
RETAILMSG(1,(TEXT("int2 occurcnt = %d \r\n",*m_iUserCnt)));
sysIntr = OALIntrTranslateIrq(irq);
}
ent2就是需要响应高优先级中断,int0主要是为了输出调试数据,可测试发现始终输出
int0 occurcnt = 1
int2 occurcnt = -2143263584
不知道是什么原因,求大虾帮忙.
另外common的代码是不是每次都要重新sysgen一下,直接build current不行,这样调试起来好浪费时间啊,各位用什么方法呢?