技术开发 频道

Windows Embedded CE 6.0实时性分析

  中断延迟的测量方法

  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;
}

  实现以上代码后,重新编译,并将操作系统下载到目标平台上。使用双通道的示波器测量中断触发引脚和GPIO的输出引脚,其中CH1测量GPIO的输出引脚,CH2测量外部中断引脚。

0
相关文章