技术开发 频道

Windows Embedded CE 6.0实时性分析

  提高系统实时性的几种方法

  实际开发过程中,如何提高系统的实时性呢?在硬件平台、操作系统确定的前提下,我们还可以做哪些工作?通过前面的分析和实际测量,可以知道ISR的中断延迟时间很短,也很难再控制。IST的延迟受系统线程调度的影响,有进一步控制的可能。

  Windows Embedded CE 6.0使用基于优先级的时间片轮转算法对线程进行调度。对处于就绪态队列的线程,先分给优先级最高的线程以时间片,当时间片用完后,无论线程是否执行完毕,都退回就绪态队列中,等待下一次的时间片分配。

  所以,一方面,我们可以通过提高中断线程的优先级以获得更多的执行机会。Windows Embedded CE 6.0的线程有256个优先级(0~255),0的优先级最高,255的优先级最低。线程默认的优先级为251。WinCE中用来设置线程优先级的函数有两个。

  ·CeSetThreadPriority(HANDLE hThread,int nPriority):可以设置0~255的所有优先级
  ·SetThreadPriority(HANDLE hThread,int nPriority):只能设置8个最低的优先级(248~255)

  为了减小中断处理延迟,应使用CeSetThreadPriority()设置更高的线程优先级。函数SetThreadPriority()通常在应用程序中用来设置工作线程的优先级。

  另一方面,我们可以修改线程的时间片大小(线程额度),线程额度只会影响同一优先级的线程调度。系统默认的线程额度是100ms。线程额度被设为0意味着线程将一直执行,直到被阻塞或者被更高优先级的打断。修改线程额度有两种方法,可以在OAL的OEMInit()函数中设置dwDefaultThreadQuantum,这将修改系统默认的线程额度。

  也可以使用设置线程额度的函数CeSetThreadQuantum(HANDLE hThread,DWORD dwTime)来修改某一特定线程的线程额度。为了保证系统的实时性,dwDefaultThreadQuantum应该设定为一个合适的值。对实时性要求较高的中断处理线程,可以单独将它的线程额度设为0。

  以上两种方法是比较方便的处理方法,如果采用了这两种方法后,系统的实时性仍然不能满足需求,那么需要考虑其他的解决办法,主要有以下几个:

  ·将中断处理的主要部分放到ISR中,这是一种困难而又危险的做法,困难是因为ISR中能调用的系统函数有限,危险意味着处理不当会导致系统性能急剧下降。
  ·改善外部中断的触发机制,从硬件着手,如增加硬件缓冲区,减少单位时间内的中断响应次数,在IST中处理硬件缓冲区的数据,这种方法能较高提升系统的实时性。
  ·采用更高主频的MCU,提高总线访问速度。

  总之,实现一个实时系统,需要从硬件、操作系统、驱动和应用程序等各方面考虑,根据应用的需求选择合适的硬件、操作系统,在软件设计时也需要时刻考虑到实时性的要求。

  结语

  本文主要介绍了在实际应用当中通过硬件的方法,实测Windows Embedded CE 6.0的中断延迟时间,验证其实时性,并简要介绍了改善系统实时性的几个常见方法。文中所述有失当之处,请您指正。

0
相关文章