本文档包括以下内容:
程序和动态链接库开发概述
《Developing RTSS Applications》主要包括以下内容:
- 如何使用MS VS建立RTSS程序(.exe和.rtss)和动态链接库(.dll和.rtdll)。
- 如何使用makefile建立RTSS程序(.exe和.rtss)和动态链接库(.dll和.rtdll)。
- 如何运行RTSS程序和实时DLL。
- 系统异常处理是如何工作的。
- 代码例程。
程序开发指南
- RTX-enabled and RTSS applications
- Win32 DLLs
- RTSS DLLs and RTDLLs
测试实时程序
支持使用MS VS环境和MS WindDbg对RTSS程序进行调试。不需要改动代码,而只需要对编译选项进行更改就可以了。
启动一个RTSS进程
有几种方式。在开发和测试阶段,你可以从命令行使用带各种参数的命令,或者在Windows资源管理器中双击RTSS可执行文件来启动一个RTSS程序。对于最终的程序,可以设置RTSS程序为开机自启动,或者从一个Win32程序中启动RTSS进程(调用RtCreateProcess)。
中止一个RTSS进程
当以下情况时一个RTSS进程会中止:
- 进程中调用ExitProcess函数
- 用户或者Win32进程运行RTSSkill工具
- 用户通过RTSS Task Manager
- 进程产生了异常
- RTS子系统关闭
- Windows系统关机(不管是正常关机还是Windows停止异常)。当Windows关机或者停止运行时,RTSS进程可以注册关闭句柄,以使设备的最后时序,并对整个系统停止或可能的重启进行清理优先级。
RTX-Enabled and RTSS Applications
RTX Enabled Windows Applications
RTX通过进程间通信(IPC)技术允许开发者在Windows程序(.exe)和RTSS程序(.rtss)之间进行通讯。开发者可以使用微软提供的所有Win32函数,这通常用于用户界面和非实时要求的部分。RtxDemo 和 RTX latency display 等例程演示了这些方法。
RTSS Applications
RTSS 程序是运行在所有Windows程序之前的实时程序,为Windows操作系统提供了实时的功能。RTSS 程序应该被用来处理时间严格要求的部分。
RTX Enabled Windows Device Drivers
RTX设备驱动(.sys)通过IPC同RTSS程序进行通讯。一些设计中一些程序组件对其他部分来说扮演着设备驱动的角色,或者板卡销售商想为他们的板子提供一个实时的驱动支持,以用于大量的实时和非实时应用。设备驱动设计者可以使用DLL或者实时IPC机制来连接驱动和应用程序。实时IPC提供了最弹性的选项,因为Win32和RTSS进程可以使用相同的接口获取共同的实时驱动,甚至是在同时。
在同一目录下,有一个为设备驱动设计的基于实时IPC的RTX库,为Win32程序和RTSS程序提供了一个传统的设备驱动接口(如:打开、关闭、读、写和控制)。
Win32 DLLs
An introduction to Win32 DLLs can be found on Windows MSDN (www.msdn.com). It is strongly recommended developers familiarize themselves with the concepts of Win32 DLLs.
RTX提供一个与Win32 DLL类似的实时DLL解决方案。除了Win32 DLL的诸多特性之外,还提供了确定性的实时性能功能。在下一节里将详细讨论RTX中已经实现的两种方式,并指明了RTX DLLs 与 Win32 DLLs的关键不同之处。
RTSS DLLs and RTDLLs
有两种类型的实时DLL(RTSS DLL and RTDLL)可以用来在进程中共享代码或者对于一个给定的硬件配置,做出运行时决定需要使用哪些库。
RTSS DLLs
一个RTSS DLL是一种Win32 DLL隐式加载的模拟。它是一个RTSS进程,导出函数以供其他RTSS进程使用。它与其他RTSS进程分享一个共同的地址空间。RTSS DLL精确地镜像引用的自动解析,以用来为隐式加载的Win32 DLL导出函数。RTSS DLL的进入点为Main,并且他们与包含可以链接到RTSS程序的导出函数相关信息的.lib文件相联系。
RTLL DLL只被加载到内存一次。RTLL DLL可以在启动时加载,或者通过调用RTSSRun来加载。RTSSrun可以在任何优先情况下执行,包括在一个C/C++程序(例如,System("RTSSrun LibName.rtss"))。一个RTSS DLL可以通过调用RTSSkill从内存中卸载,或者使用RTSS Process Manager。
RTSS DLL与隐式加载的Win32 DLL的三个最主要的区别:
- RTSS DLL必须由开发者显式的加载或卸载
- 在一个RTSS DLL内缺少每一进程的全局变量。因为RTSS DLL是纯RTSS进程,在一个RTSS DLL内的所有全局变量为此RTSS DLL进程所独占。
- Main被用作进入点,而不是DllMain。同时,RTSS DLL Main只在RTSS DLL初始加载时得到调用。任何一个进程或线程的初始化必须通过一个额外的从RTSS DLL显式导出的函数来完成,并在调用它的RTSS进程中显式的执行(invoke)。
RTDLLs
RTDLL是显式加载Win32 DLL的一种模拟。RTDLL是可以动态地使用LoadLibrary和FreeLibrary加载和卸载的RTSS对象。当引用他们的最后一个RTSS进程结束时,他们会自动卸载。RTDLL永远不应被隐式链接或设为延迟加载(delayed loading)。RTDLL的进入点为DllMain。因为RTDLL不需要链接到一个显式的导出库,它提供一个方便的、弹性的、运行时对RTDLL或程序自动适应变化。但是,每一个被调用RTDLL的进程使用的导出函数的地址,必须通过调用GetProcAddress进行显式的获取才可以。另外,因为RTDLL不是RTX进程,在一个同时被多个RTX进程加载的RTDLL里使用C运行时函数是不可靠的。有关C运行时库和RTDLL的关系的更多细节请看:Programming Considerations for DLLs。
RTDLL有两点明显不同于Win32显式加载DLL:
- RTDLL不是拥有每个进程的全局数据。
- 在Win32中,每个加载DLL的进程在卸载时都会调用DLL中的DllMain,而RTDLL中,只在最后一个加载它的进程卸载它时才调用DllMain函数。
对于一个程序中是使用 RTSS DLLs 还是 RTDLLs 取决于程序的具体功能要求。不同硬件的运行时配置也影响其选择。相关编程例程见RTX SDK 文档中的 Code and File Examples 这一节。
提示: RTDLLs只能用在 RTX 环境中,不能在 Win32 程序中调用。
Note: RTSS DLL也能导出函数以被其他模块加载和动态链接。但是,在这种情况下,不支持提示二者的联系信息,而且导出的模块必须首先被手动加载,然后在程序结束时手动卸载。