RTX理解10

文献来源:http://wzhyblog.yo2.cn/articles/%E5%AE%9E%E6%97%B6%E7%B3%BB%E7%BB%9Frtx%E5%AE%98%E6%96%B9%E6%96%87%E6%A1%A3%E4%B8%AD%E6%96%87%E7%BF%BB%E8%AF%91_12.html

实时系统RTX官方文档中文翻译_12

本文档包括以下内容:


程序和动态链接库开发概述

《Developing RTSS Applications》主要包括以下内容:

  • 如何使用MS VS建立RTSS程序(.exe和.rtss)和动态链接库(.dll和.rtdll)。
  • 如何使用makefile建立RTSS程序(.exe和.rtss)和动态链接库(.dll和.rtdll)。
  • 如何运行RTSS程序和实时DLL。
  • 系统异常处理是如何工作的。
  • 代码例程。

程序开发指南

为保证成功的开发实时应用程序,设计者和开发人员必须仔细分析如何划分程序,也必须在非实时进程(Win32)和实时进程(RTSS)建立正确的平衡并决定二者之间的接口。
例如,在Win32进程中有大量的严格时间处理,而在RTSS进程中有太多的非严格时间处理,或者在进程接口间有太多同步或数据流,那么,程序的性能,可用性和其他开发与维护工作都会变得很危险。对开发者和他们的用户来说,在初期就花费大量时间对任务的主要结构进行深入的分析和设计是值得的。
  • 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也能导出函数以被其他模块加载和动态链接。但是,在这种情况下,不支持提示二者的联系信息,而且导出的模块必须首先被手动加载,然后在程序结束时手动卸载。

你可能感兴趣的:(RTX,dll,windows,manager,makefile,文档,程序开发)