使用RTX增加Windows XP/2000/XP Embedded系统的硬实时特性

RTX中断延迟缩减技术
  RTSS 完全消除了由Windows XP平台及其驱动的IRQL屏蔽所造成的延迟。当系统在Windows XP与RTX之间进行切换时,RT-HAL执行中断隔离,重新对可编程中断控制器(programmable interrupt controller,PIC)进行编程。所以在RTX运行时,RTX可以屏蔽所有Windows XP 中断,从而RTX中断总能够屏蔽Windows XP。
  另一方面,处理器级的中断屏蔽不会失效,因此不必冒风险使用x86 NMIs(不可屏蔽中断,non-maskable interrupts)。RTX采用一种静态方案解决IRQ锁定,它将多个中断优先级挂钩,这种动态挂钩功能使用旋转锁定(或者在单处理器上的基于IRQ的同步)扫描HAL,寻找这些操作的信号。
  在典型的800MHZ的PC平台上,这些技术提供了小于1微秒的时钟中断最坏延迟响应时间。
  
  RTX对象
  RTSS环境拥有快捷高效的对象管理器(见图2)。它支持的对象满足下列标准:
  1)可用于实时编程
  2)兼容Win32
  IPC对象同样适用于Win32应用程序和设备驱动,允许程序员最大限度的发挥Windows XP的性能。IPC设置包括互斥体,事件,信号量和共享内存对象。
  RTSS对象管理器使用Windows XP的不分页内存池以满足它的存储需要。使用Windows XP提供的机制可以减少RTX的资源消耗,但是对象的分配是不确定的。
  
  RTSS调度器
  RTSS调度器采用抢占式策略实现优先级,它可以提升优先级以防止优先级倒置。RTSS环境提供了128种优先级,序号从0到127,0代表最低优先权。RTSS调度器总是在准备运行的线程中运行优先级最高的(当多个准备运行的线程处于同一优先级时,等待时间最长的线程最先运行)。RTSS线程会一直运行直到一个高优先级的就绪线程抢占它,或者它自动释放处理器进入等待状态,还有一种情况是分配给它的时间片用光(缺省值是无限)而另一个同优先级线程已经就绪。
  调度器在编码设计阶段就被设计为满足实时处理的需要。最重要的是它的操作是低延迟的,并且不受它所管理的线程数影响。每个优先级都有自己的等待队列,是一个双向链表。这就使得对于链表的插入(表尾)和删除(表的任何位置)操作的执行时间独立于链表中的线程数。一个数组会纪录哪些链表当前是空的,这个数组是由高速的由汇编代码写成的子程序进行维护的。
  当一个RTSS线程运行时,所有Windows XP管理的中断以及任何拥有低优先级的线程所管理的中断都一律被屏蔽掉。相反地,所有拥有高优先级的线程所管理的中断都不会被屏蔽,并且允许其打断当前线程。除了这些设备中断,其他可以导致当前线程被中断的机制包括一个使得拥有高优先级的线程就绪的定时器的到期,一个标明高优先级线程正在等待的同步对象信号(正在运行线程的同步对象)。
  为了解决线程抢占的问题,RTSS采用了经典的优先级提升的解决方案[Nakajima 93] [Sha 90]。当一个低优先级线程拥有一个高优先级线程等待的对象时,在它拥有对象的时间内会被自动提升到较高的优先级别。
  
  服务请求中断(Service Request Interrupt,SRI)
  RTX的一个重要的架构特征就是Windows XP和RTX之间的一个无锁中断驱动接口,这个接口实现了本地程序调用(Local Procedure Call,LPC)机制。这个完全分离的架构使得RTSS能够移植到不同的环境中(例如多处理器RTX产品),并能够保证快速而有效的实现。Windows XP方面的RTX驱动和RTSS环境之间的通讯是通过向两个缓存队列(每个方向一个队列)中的一个插入命令行,并初始化服务请求中断(Service Request Interrupt,SRI)来向另一方请求服务的。一个服务线程执行请求,其应答信息的传递通过另一个队列。典型的Windows XP到RTX的请求是一个与WaitForSingleObject 相似的IPC操作或者在RTSS对象上的释放操作。而典型的RTX到Windows XP的操作是页内存的分配或者I/O请求。SRI的设计倾向于减少响应时间,尽快地响应RTSS请求。
  
  Win32到RTSS的IPC
  交互环境下的IPC是RTX的一个重要特征,它允许在运行实时程序的资源更加密集的RTSS环境下紧密的集成应用程序。应用程序的其余部分运行在Win32子系统中,这一节描述了IPC的设计。
  
  RTSS代理模型
  IPC与其它Windows XP和RTSS之间的通信相同,使用SRI通道。由于SRI通道阻止Windows XP线程进入队列直接获得RTX对象,RTX使用代理进程和线程支持IPC与Win32的隔离。当Win32线程要访问到RTX对象时,RTSS就会使用代理线程,这个模型简捷有效,它的优点如下:
  • 在阻塞IPC请求时,在Windows XP端没有状态保留。
  • 对于外部的Win32等待请求,RTSS没有特例
  • 当Win32进程或线程终止后句柄和对象的清理工作自动由RTX的代理进程和线程完成。
  虽然代理会涉及到内存和CPU的一些额外开销,但其简洁的设计和快速的实现使得这样做还是值得的。
  
  控制Windows XP I/O管理器
  为交互环境IPC保留无缝的Win32语义并且达到好的性能面临几大挑战。
  当使用某个驱动的Win32线程终止时,Windows NT 4.0 DDK并不为驱动线程提供暴露的接口(Windows 2000 和Windows XP引入了全局声明机制,但还存在一定的局限)。但Win32的互斥体需要这样的机制。当某个线程终止时,被其获得而不是释放了的RTX互斥体必须被标注为“废弃的”,以表明它所保护的共享数据可能并不一致。RTX利用I/O管理器的I/O请求包(IRP ,I/O Request Packet)实现线程终止时的清除工作:每个关联到RTX Win32 DLL的线程向RTX驱动发送一个“死IRP”信号。当这个线程终止时,Windows XP调用IRP的取消子程序通知RTX驱动和RTSS对象层。I/O管理器提了一个强大的,富有挑战的环境,因为它的事件传送是异步的。例如,调用MJ_CLEANUP驱动调度子程序和取消子程序可以按照任何顺序,只要RTX的每个线程结构和每个进程保持严格的同步。
  Win32-RTSS IPC的性能提出了另一个问题。在早期的执行过程中,一个无须争议的事实是对Win32中的RtWaitForSingleObject() 函数的调用的总延迟平均为130毫秒,分析表明,大约40毫秒(大于30%)被消耗在Windows XP 的I/O管理器上。所以RTX4.2对IPC内核进行了重新编码,在Win32 IPC客户和RTX驱动之间使用了直接信号和共享内存[Tomlinson 97]。RTX用户和内核线程共享同步对象,直接与对方进行通信,这样就减少了Windows XP I/O管理器的总开销和总延迟。
  需要注意的是,被Win32应用程序锁住的在RTX同步对象上的操作具有不确定性[Carpenter 97]:任何RTSS线程都可以抢占Windows XP中具有这种具有锁性质的线程,从而出现非常严重的优先级倒置的现象。但这是程序设计上的问题:锁定一个被Win32共享的对象应该留给一个非临界的RTSS线程去做。不过在多处理器RTX系统上,并且如果RTX和Windows XP分别运行于不同的处理器的话,这个问题可以得到改善。
  
  快速计时器支持
  在所有的PC平台上,实时的HAL提供了精度为1微秒甚至更快的时钟。如果没有任何RTSS应用程序在执行,那么在安装了RTX的系统上和没有安装RTX的系统上就没有任何时间上的区别了。
  
  动态链接库
  提到Win32就不得不提到DLL库。RTSS支持Win32 DLL API (LoadLibrary函数,GetProcAddress函数)。现在,所有在RTSS的DLL中的静态和全局变量都被链接到其上任何RTSS进程所共享。
  
  RTSS中的结构异常处理
  结构异常处理(Structured Exception Handling,SEH)是一个相对不为人知但是更为重要的Win32 和 Windows XP内核环境的特征。它的实现可以追溯到OS/2 和OSF UNIX中。SEH通过Microsoft C中的try/except 和 try/finally结构提供异常处理。C++异常处理在SEH之上被分层,就像libc signal/raise的调用一样使得SEH在任意一个Win32的环境下都变成必须的。这个模型的显著特征是:
  • 具体编译程序的异常处理
  • 具体操作系统堆栈的释放和异常调度子程序
  • 用户提供的异常筛选程序
  • 两极异常处理算法。首先调用具体操作系统的调度子程序扫描线程堆栈,以搜索合适的处理者,然后在必要时,调用具体操作系统的解除装置返回堆栈。
  • 最后机会的缺省和用户提供的异常处理子程序
  • 一套专门解决嵌套异常和释放冲突的特殊机制
  RTSS SEH与Microsoft结构,处理调用规律,SEH API运行等兼容。并且,它专为实时系统设计,能够最小化RTSS线程中处理器层的中断屏蔽和分裂:
  • 当通过Win32 RaiseException API产生软件异常时,Win32将产生一个软件中断;RTSS调用用户模式下的异常调度器。
  • 当释放堆栈,并且在此之后设置了一个新的用户环境后,Win32 SEH将会产生一个特殊的中断,RTSS在用户模式下恢复环境。
  • 当中断失效时,Windows XP可能会编辑(移动)一个异常自陷帧,而RTSS在用户模式下完成此操作。
  对于硬件异常,RTSS算法会诊断出自陷帧并调用RTSS异常调度器,然后从ISR返回到调度器,并处理异常。所以,软件异常并不对其他线程造成ISR延迟负担;而硬件异常也只是增加了单个中断的最坏响应的负担。
  
  性能
  
  下表显示了在一个在拥有ACPI芯片组的800 MHz Pentium III处理器上运行的Windows XP重要性能指标,这个Windows XP安装了RTX 6.0.1。
  
  表1 RTX与Windows XP和Windows CE .NET的实时性能比较
  Operation Windows XP Windows CE .NET RTX 6.0.1
  ReleaseMutex>WFSO: min/max in usec 1.49 / 5000+ 4.9 / 13.3 0.10 / 3.26
  ReleaseSemaphore>WFSO: min/max in usec 1.39 / 5000+ 3.9 / 8.4 0.10 / 3.43
  Yield: min/max in usec 1.11 / 5000+ 2.6 / 63.9 0.10 / 3.37
  Win32-to-RTSS SetEvent call: min in usec NA NA 14
  
  注:在Windows XP频繁装载下的关键RTX线程切换调节(最大值包括定时器中断处理的消耗)。不包含RTX和Microsoft Windows CE 的Windows XP作为比较,时间单位为微秒。
  
  
  图3 RTSS计时器中断延迟柱状图(典型的Windows工作负载:磁盘搜索,视频升级,网络活动,屏幕保护等。X轴以微秒为单位,Y轴是按对数显示的采样数值。较低的有阴影的部分代表最后一秒的活动,较高的部分显示的是总体运行的积累量)
  
  
  图4 和图3相同工作量的Win32计时器中断延迟直方图
  
  通过对RTX6.0.1的独立测试以及在其他实时Microsoft Windows NT上进行扩展,可以发现RTX的丰富性能[OMAC 98] [Real-Time 98] [Timmerman 98]。当然不要忘记RTX6.0.1提供了更快地线程切换计时器。
  
  使用Visual Studio创建RTX应用程序
  通过RTX提供的头文件和库函数,RTX应用程序可以像其他任何Windows应用程序一样被Microsoft Visual Studio编译和链接。application wizard可以用来更改工程设置和创建源代码框架。从RTX5.1开始,Visual Studio debugger可以像调试其他Win32进程一样调试运行RTX进程。进程与线程的变量和断点可以被设置和管理。RTX包括大量的应用工具,其中有图5中显示的RTSS Object Viewer。

  
  图5 对RTSS Object Viewer的截屏(显示出了一个拥有两个线
  程的单进程,一个线程是计时器,另一个是共享内存对象)
  
  性能工具
  
  RTX性能工具使得开发者可以在他们自己的平台上对性能进行评价和调整。Ksrtm是一个驱动程序,也是用于HAL层和计时器中断延迟衡量的Win32工具。由于在内核中运行,使其对缓存的响应相应迟钝。Ksrtm也可以发现究竟哪一个Windows XP的平台组件或设备驱动造成了最大的延迟。在此之后,Ksrtm ISR从堆栈中得到了中断序列的地址,然后将其分派到一个装载完毕的Windows XP内核模块中。Srtm应用程序是一个可以在RTX或者Win32环境下运行的测量RTX API计时器时间延迟的工具,它通过直方图忠实的显示出应用程序观察到的计时器延迟。Lpt工具对由总线控制事件引起的长延迟事件起决定作用。最后,Platform Evaluator是一个图形用户接口程序(基于GUI的),它可以衡量一个在不同工作量下的平台的响应时间特性。
  
  目标设计者SLD
  除了支持Windows XP的零售版,RTX run-time环境也被打包为一个SLD,供Windows XP Embedded的目标设计者使用。因为RTX可以被配置为在启动时自动运行RTSS进程,即使只有最小的脚本配置,Windows XP Embedded也会包括RTSS应用程序并在启动序列中优先将其装载(甚至在Win32环境启动前)。
  
  未来方向
  
  现在,RTX满足了很多用户的需求。但是还有更多的用户资源等待我们的开发。
  
  多处理器
  RTX的最初版本只能运行在单处理器系统上。最近的版本支持了多处理器系统,但是这种多处理器系统必须遵循Intel 多处理器规范1.4版才行。这个规范提供了被先进可编程中断控制器(Advanced Programmable Interrupt Controller,APIC)所控制的中断,这种中断适合于多处理器系统。通过APIC,不同的中断可以被引导至不同的处理器。RTSS使用系统中的一个处理器专门运行RTSS线程,而剩下的处理器运行Windows XP线程。这有效的减少了实时线程的延迟,同时也防止了在单处理器系统中出现的Windows XP 线程饿死的情况。RTX5.1也允许RTSS处理器被Windows 共享,这种情况同于单处理器。
  
  即插即用设备和电源管理
  从RTX5.0以后,适用于Windows 的即插即用设备和电源管理就被集成到RTX中来。RTX和Windows 协同工作,管理在他们之上的设备资源,所以在ACPI平台上中断被动态分配到PCI设备上以最小化中断冲突。当RTX应用程序运行时,RTX阻止Windows将电源调节到低工状态干扰RTX的实时性能。
  
  适用环境
  RTSS可以当作其他实时环境的基础,譬如Java[Nilsen 98] [Nilsen & Lee 98].。
  
  结论
  
  Ardence的RTX表明,通过选择合适的实时系统扩展,有可能使Windows XP平台在保证其作为通用平台特征的基础上提供实时操作系统的特征。所合成的系统在提供了实时系统所需要的确定性的同时,保证了平台为更广泛的人群提供更为熟悉的操作环境。
  
  获取渠道
  
  获取RTX可以从美斯比的网站上获取—www.msptc.com,或直接联系美斯比科技有限公司。

文章出处:http://www.diybl.com/course/4_webprogram/asp.net/netjs/2008331/107995_2.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值