中断延迟的测量方法
Windows Embedded CE 6.0提供了一些工具软件,用来测量中断延迟,如ILTiming.exe。它需要OAL的代码支持,并且在定制系统时设置相应的编译属性,具体用法可参考Platform Builder 6.0的帮助。这里介绍一种借助硬件的测量方法,能在示波器上直观的看出中断延迟。
根据前文所述的中断处理过程以及图2所示的中断延迟模型,可通过控制MCU的一个GPIO输出引脚来帮助测量t1和t2。具体方法如下:
1.在OAL的OALIntrInit()函数中,设置某一GPIO为输出口,并使其输出高电平;
2.在ISR的OEMInterruptHandler()函数中,将该GPIO设置为低电平;
3.在IST的WaitForSingleObject()函数之后,将该GPIO设置为高电平;
4.当外部中断触发时,GPIO会先被ISR拉低,再被IST拉高;
5.t1是外部中断下降沿触发以后,GPIO保持高电平的时间;
6.t2是GPIO保持低电平的时间;
7.t1+t2≈中断延迟时间
实际应用的目标平台采用的MCU是S3C2410,其设置GPIO的主要代码如下。
//初始化GPIO,并设置为高
//设置GPE11为输出口
value = INREG32(&pOalPortRegs->GPECON);
OUTREG32(&pOalPortRegs->GPECON, (value & ~(3 << 22))|(1 << 22));
//设置GPE11的IO状态为高
value = INREG32(&pOalPortRegs->GPEDAT);
OUTREG32(&pOalPortRegs->GPEDAT, (value |(1 << 11)));
在ISR中设置GPIO为低的代码如下。
//将GPE11置低
mask = INREG32(&g_pPortRegs->GPEDAT);
OUTREG32(&g_pPortRegs->GPEDAT, (mask & ~(1<<11)));
驱动中的IST代码如下。
DWORD WINAPI IntrThreadProc(LPVOID ptr)
{
while(bRun)
{
WaitForSingleObject(gIntrEvent, INFINITE);
//将GPE11置高
g_pIOPregs->GPEDAT |= (0x1 << 11);
//RETAILMSG(1,(TEXT(“\r\nThread Run.”)));
//Sleep(1000);
InterruptDone(gSysIntr);
}
return 0;
}
//设置GPE11为输出口
value = INREG32(&pOalPortRegs->GPECON);
OUTREG32(&pOalPortRegs->GPECON, (value & ~(3 << 22))|(1 << 22));
//设置GPE11的IO状态为高
value = INREG32(&pOalPortRegs->GPEDAT);
OUTREG32(&pOalPortRegs->GPEDAT, (value |(1 << 11)));
在ISR中设置GPIO为低的代码如下。
//将GPE11置低
mask = INREG32(&g_pPortRegs->GPEDAT);
OUTREG32(&g_pPortRegs->GPEDAT, (mask & ~(1<<11)));
驱动中的IST代码如下。
DWORD WINAPI IntrThreadProc(LPVOID ptr)
{
while(bRun)
{
WaitForSingleObject(gIntrEvent, INFINITE);
//将GPE11置高
g_pIOPregs->GPEDAT |= (0x1 << 11);
//RETAILMSG(1,(TEXT(“\r\nThread Run.”)));
//Sleep(1000);
InterruptDone(gSysIntr);
}
return 0;
}
实现以上代码后,重新编译,并将操作系统下载到目标平台上。使用双通道的示波器测量中断触发引脚和GPIO的输出引脚,其中CH1测量GPIO的输出引脚,CH2测量外部中断引脚。