本文档包括以下内容:
2. 使用C运行时库函数
MS每个版本的VS都提供了自己的C运行库,为了和MS尽量保持一致,RTX提供了对众多的MS VS C运行库函数的支持。通过这样来实现通过尽可能少的改动或者不做改动代码就能编译成Windows或RTSS程序。
因此,当升级一个包含C运行时的RTSS程序生成环境VS的版本时,也必须升级对应的VS支持的C运行时库。另外,你应该确保在程序中对任何C运行库函数的调用仍为期望中的结果。
RTX支持的C运行库如下列表,在RTX SDK文档中有详细的C库API以字母顺序排列的详细列表。
注意:取决于你所使用的VS版本,点设置会对API性能有较大的影响。因此,在VS2005中,RTX使用一个新编译选项/fp:fast来限制这些设置对性能的影响。这保留了以前版本的VS程序使用全优化时的设置。如果对浮点精确性有需求,可以使用/fp:precise这个编译选项,但是请注意这样做可能会影响一些API决定论。例如, log 或 sin 这样的函数将会受到影响。MSDN上的文章《Microsoft Visual C++ Floating-point Optimization》解释了这些编译选项。
Microsoft Visual Studio 2005
库的路径为: RtxSdkDir/lib/Visualstudio8
文件: rtxlibcmt.lib
3. 加载 rtapi_w32.dll
Win32只在需要时才加载DLL,所以rtapi_w32.dll直到一个RTAPI调用做出时才会加载。如果你的程序在第一次RTAPI函数调用前创建了线程,它们将不会有用来支持RTX进程间通信辅助的委托线程。为解决这一问题,你必须在任何线程创建前强制Win32程序做一次Rt调用以加载rtapi_w32.dll。例如,在程序开始的时候添加类似于如下的代码:
priority = RtGetThreadPriority(RtGetCurrentThread());
4. 使用浮点数
运行在RTSS环境中的线程通常运行在内核模式。因为Windows内核模式中在一次线程切换时并不保存浮点寄存器,编写传统内核模式代码的开发者一般在FPU使用间歇中保存和读取浮点寄存器(Since Windows does not save floating-point registers on a thread switch in kernel mode, developers who code traditional kernel mode applications typically save and restore the state of floating point registers between FPU usage. )。RTX消除了这个问题。开发者可以像在用户模式一样编写程序,因为RTX接管了所有浮点寄存器的保存状态。
提示:
依赖于所使用的VS版本,浮点设置会对API性能有较大的影响。因此,在VS2005中,RTX使用一个新编译选项/fp:fast来限制这些设置对性能的影响。这保留了以前版本的VS程序使用全优化时的设置。如果对浮点精确性有需求,可以使用/fp:precise这个编译选项,但是请注意这样做可能会影响一些API决定论。例如, log 或 sin 这样的函数将会受到影响。MSDN上的文章《Microsoft Visual C++ Floating-point Optimization》解释了这些编译选项。
在RTSS程序中添加浮点支持
如果你使用NMAKE生成RTSS程序,你必须在makefile中包含rtx.mak这一行之前添加如下的一行:
RTSS_CRT = 1 or RTSS_MTCRT = 1
这一行添加了浮点数单元Floating-Point Unit (FPU) 支持,包括浮点数学函数和支持浮点的printf。
如果你使用VS,参见 Building Applications and DLLs in Visual Studio 这一节文档。
运行使用浮点的RTSS程序
运行使用浮点数的RTSS程序并不需要任何特别的步骤。程序会像一个标准的Win32程序一样使用FPU,处理相关指令和调用浮点数学函数。
5. 使用 MMX and SSE
RTX支持MMX 、 SSE/SSE2/SSE3 寄存器,并保存其状态信息。这种支持能带来以下好处:
-
RTX能在使用MMX 、 SSE/SSE2/SSE3 寄存器的进程中进行内部操作(inter-operate)。
-
RTX程序可以使用MS VS内部的函数或者内联程序集来利用MMX 、 SSE/SSE2/SSE3 技术。
更多关于MMX和SSE相关的技术,请看:http://msdn2.microsoft.com/en-us/library/y0dh78ez(VS.80).aspx.
6. 编写RTSS设备驱动
RTX设备驱动比Windows设备驱动更简单,并在设计时给你更大的灵活性。因为Windows设备驱动通常是用户模式驱动,它依赖于用户态Windows服务,它们不能原封不动的被RTSS程序使用。另外,由于甚至内核态的驱动经常需要通过硬件厂商提供的用户态的库才能使用,在一个RTSS程序中几乎不可能使用标准的Windows设备驱动。
设备可以通过三种类型的函数进行使用和控制:IO端口、IO总线和映射内存。另外,驱动程序可以通过 RtAttachInterruptVector 提供的中断句柄来响应设备。不像Windows通过调用 DeviceIoControl 来使用驱动,RTSS驱动可以以静态库、RTSS DLL或RTDLL的形式构建。在每一种情况下,驱动编写都可以直接向RTSS应用程序编写者提供库函数,而不需要利用 DeviceIoControl 接口。
对许多应用而言,并不需要为普通的桌面设备编写一个硬实时(RTSS)设备驱动。当使用设备时不强调硬实时性能时(经常是有视频、音频和网络设备的情况下),建议解决方法是开发一个通过IPC技术与RTSS程序进行通讯的Win32程序,通过标准的Windows设备驱动来与需要的设备进行通讯。
7. C++和结构化异常捕获
RTX支持MS C++异常(catch/throw),Win32结构化异常处理(SEH)API和C基于帧的异常处理(C frame-based exception handling )(try/except/finally),所有的都由Win32 Platform SDK定义。
RTX 支持Visual C++语言,但是有一些限制。
8. 饥饿管理
本节内容在 Using RTX Tools_1 这个文档里。
9. Testing an RTX Program with Shutdown Handlers
在关机处理情况下测试一个RTX程序
本节讨论一个关闭程序的例子,测试一个强制Windows停止事件的RTX程序处理方式。也讨论了可以证明RTSS关闭管理的产生崩溃 (Gencrash)的驱动。
关机程序
使用关机程序来证明RTSS关机处理。你必须首先使用RTX makefile来生成这个程序。此程序向一个进程连接了一个关闭句柄,并产生一个连续的声音。如果在这段时间内Windows停止运行或者系统关闭(shutdown),那么关机句柄就会打印出一个消息并休眠10秒钟,然后蜂鸣器停止。
提示:此消息只在不可预料的Windows停止事件(RT_SHUTDOWN_NT_STOP)时可见。对于一个有序的Windows关闭(RT_SHUTDOWN_NT_SYSTEM_SHUTDOWN)事件,此消息并不可见。
使用方法
RTSSrun "C:/Program Files/Ardence/RTX/bin/samples/shutdown/shutdown.rtss"
可以看到关闭进程或者使用RTSSkill来停止关闭程序和它的声音来避免关闭Windows:
RTSSkill (查看关闭进程ID)
RTSSkill n (关闭ID为n的进程)
你也可以通过调用下个小节讨论的 Gencrash 驱动。
Gencrash 驱动
Gencrash 驱动会弹出一个警告窗口,然后进行Windows系统bug 检查(如:STOP 0),以此来证明RTSS的关机管理。
使用方法:
在命令行中输入:net start gencrash
注意:在使用gencrash之前关闭所有程序。若是FAT文件系统,一般会在一个Windows停止事件之后要求进行磁盘检查。