RTX官方文档中文翻译目录

下面是本博客中发表的RTX官方文档的中文翻译文档的目录,方便您查看。

当然,您也可以通过点击右侧标签云里的"RTX"这个关键字来查看所有关于RTX的文章。

再次声明:我的中文翻译中也许有不少不准确甚至错误的地方,由此可能给您带来的不便或损失请自行承担!也请您及时在评论栏中指出您发现的不准备或错误之处,或者直接给我发邮件说明。如果您要转载,请至少标明原文的出处和作者,请不要像百度文库一样无耻!!

实时系统RTX官方文档中文翻译_1:  RTX简介与文档翻译计划

实时系统RTX官方文档中文翻译_2:  Using the RTX SDK第一部分

实时系统RTX官方文档中文翻译_3:  Using the RTX SDK第二部分

实时系统RTX官方文档中文翻译_4:  Using the RTX SDK第三部分

实时系统RTX官方文档中文翻译_5:  Using the RTX SDK第四部分

实时系统RTX官方文档中文翻译_6:  Using the RTX SDK第五部分

实时系统RTX官方文档中文翻译_7:  Using the RTX SDK第六部分

实时系统RTX官方文档中文翻译_8:  Using RTX Runtime第一部分

实时系统RTX官方文档中文翻译_9:  Using RTX Runtime第二部分

实时系统RTX官方文档中文翻译_10:Using RTX Tools第一部分

实时系统RTX官方文档中文翻译_11:Using RTX Tools第二部分

实时系统RTX官方文档中文翻译_12:Developing RTSS Applications第一部分

实时系统RTX官方文档中文翻译_13:Developing RTSS Applications第二部分

实时系统RTX官方文档中文翻译_14:Developing RTSS Applications第三部分

实时系统RTX官方文档中文翻译_15:Developing RTSS Applications第四部分

实时系统RTX官方文档中文翻译_16:Developing RTSS Applications第五部分

实时系统RTX官方文档中文翻译_17:Debugging RTSS Applications

Posted in Embedded | Tagged , , | 3 Comments

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

Debugging RTSS Applications

概览

可以使用WinDbg或VS来调试RTSS程序。RTX SDK还为VS提供了add-in以方便开发者。

使用VS调试:提示

1. 同时调试多个程序

可以使用多个VS实例同时调试多个程序,唯一的限制是每个程序必须有与众不同的名字。你也可以调试RTSS DLL,并且添加断点。链接有RTSS DLL的RTSS映像不能通过VS 调试器来运行,因为DLL本身就被当做暂停的RTSS进程来使用。只能这样:打开一个VS,然后开始使一个RTSS DLL处在调试状态,然后再打开一个VS,在这里调试使用前一个RTSS DLL的程序。这个限制对链接有RTDLL的RTSS映像无作用。

2. 使用RTSS DLL调试程序

  1. 在VS中生成要调试的RTSS DLL。
  2. 开始调试会话。程序会自动暂停。
  3. 打开另外一个VS实例。
  4. 在debug模式下生成使用上面所述的那个RTSS DLL的程序,然后就可以调试了。

RTX调试器的限制(常规)

  • 不支持有条件的放置断点
  • 不能在RTSS DLL内部添加断点
  • 不允许连接到一个进程(只能debug由调试器创建的进程)
  • 不允许反汇编/单步RTX系统调用(基于安全考虑)
  • 使用RTX调试器时不存在确定性的动作。因此,RTX用户不能依赖于多个VS调试的多个RTSS程序的运行顺序。
  • 调试时RtxDbgAgent.rtss进程和stubapp.exe必须保证不被killed。
  • 不能被用来调试主/从配置的程序
Posted in Embedded | Tagged , , | Leave a comment

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

本文档包括以下内容:


系统异常处理

关于系统异常处理

异常是一个从正常程序运行到一个特殊的过程(称为处理程序handler,即处理此异常)的强制转换。在程序执行过程中,当CPU遇到一个错误时,一个异常就会产生。每个异常被分配一个错误号或是向量号。例如,如果CPU遇到了除以0的情况,那么就会产生0号异常。完整的异常处理讨论请参考:Volume 3: Architecture and Programming of the Pentium® Processor Family Developer's Manual.

重要:

本节所讨论的情况都假设RTSS程序不使用Structured Exception Handling (SEH)。


RTX 处理程序

当RTX处理程序遇到一个错误时,它就开始执行下列行为中的一个:

  • 冻结或中止进程
  • 修改程序环境,然后继续
  • 运行一个有序关机,即著名的“绿屏”。

如果一个异常在ISR(比如一个RTX硬件中断或者RTX定时器中断)中产生,RTX会立即执行一个RTX绿屏停止消息。


RTX 异常处理

对大多数异常,RTX异常处理程序会执行以下任务:

  • 冻结或中止出现异常的RTSS进程,这取决于ExceptionDisposition标志的状态
  • 通过一个弹出窗口通知用户
  • 若在RTX Properties设置了Write Debug Information on System Failure to Minimal Information ,则创建一个RTX minidump文件。
  • 创建一个或多个事件日志中相关的项目

1. 冻结或中止出现异常的RTSS进程

注册表项Fault Process ExceptionDisposition(可以在RTX Properties控制面板里设置),控制着出错的RTSS进程的行为,选项有:

  • 中止进程(默认)
  • 冻结线程和进程

2. 警告用户

通过一个弹出消息框来警告用户。例如,如果异常处理程序中止了进程,RTX可能会显示如下的窗口:

RTX Exception - Memory Access Fault at loc FEBEB229
(Proc=80452448, Thread=804526F 8)
Process image has been * unloaded *

在这个例子中,一个内存保护失败被检测到。此消息指明了程序指令地址和进程与线程的ID值。线程没有被加载。

如果是冻结进程,RTX可能会显示如下的窗口:

RTX Exception - Memory Access Fault at loc FEBDF229
(Proc=80452448, Thread=804526F 8)
Process image has been * frozen *
Debug and/or use "RTSSkill" command to unload all processes

3. 产生事件日志项目

事件日志消息包括一个信息项目(即弹出窗口的标题部分),一个提供错误详细信息的错误项目。错误项目包含两部分:一个描述和二进制细节。二进制细节由10 DWORD的消息数据和3 DWORD的RTSS失败数据组成。如下所示:

The description for Event ID (12) in Source (Rtx_rtss)
could not be found. It contains the following
insertion string(s):
\Device\Rtx_rtss, RTX Exception - Memory Access Fault
0000: 00100000 00620002 00000000 c004000c
0010: 00000000 c0000183 00000000 00000000
0020: 00000000 00000000 feac12e8 febdf229
0030: 80452448 804526f8

头10个dwords是唯一的。3dwords的RTSS失败数据为:

  • 指令指针值(上例中为febdf229)
  • RTSS进程标识(上例中为80452448)
  • RTSS线程标识(上例中为804526f8)

注意:为保护事件日志信息,不要过滤事件项目。


异常代码

包括RTX异常代码和Intel异常代码

1. RTX异常代码

Exception Error code RTX will...
EXCEPTION_NPX_NOT_AVAILABLE 0X07 Allow for floating-point capability, and continue executing the application.
EXCEPTION_INT3 0x03 Enter the debugger. If no debugger is present, RTX freezes the process.
EXCEPTION_NMI
EXCEPTION_DOUBLE_FAULT
EXCEPTION_RESERVED_TRAP
EXCEPTION_INVALID_TSS
0x02
0x08
0x0F
0x0A
Issue a Green Screen stop message.

2. Intel异常代码

x86 Exception Win32 Mapping
EXCEPTION_DIVIDED_BY_ZERO EXCEPTION_INT_DIVIDE_BY_ZERO
EXCEPTION_FLT_DIVIDE_BY_ZERO
EXCEPTION_NPX_OVERRUN EXCEPTION_FLT_INVALID_OPERATION
EXCEPTION_NPX_ERROR EXCEPTION_FLT_DENORMAL_OPERAND
EXCEPTION_FLT_DIVIDE_BY_ZERO
EXCEPTION_FLT_OVERFLOW
EXCEPTION_FLT_UNDERFLOW
EXCEPTION_FLT_INEXACT_RESULT
EXCEPTION_FLT_INVALID_OPERATION
EXCEPTION_INVALID_OPCODE EXCEPTION_ILLEGAL_INSTRUCTION
EXCEPTION_GP_FAULT
EXCEPTION_PAGE_FAULT
EXCEPTION_BOUND_CHECK
EXCEPTION_SEGMENT_NOT_PRESENT
EXCEPTION_ACCESS_VIOLATION
EXCEPTION_DEBUG EXCEPTION_BREAKPOINT
EXCEPTION_ALIGNMENT_CHECK EXCEPTION_DATATYPE_MISALIGNMENT

RTX与Windows停止消息

  • 蓝屏和停止消息处理
  • 关机处理
  • 使能停止消息
  • Windows停止屏幕说明
  • RTX绿屏停止消息说明

1.  蓝屏和停止消息处理

通过与Windows共享同一个系统,RTX允许开发者利用Windows的那些不是严格实时任务的组件和服务。甚至蓝屏(或者Windows停止运行消息)之后,RTX子系统仍能继续运行,此时构建在RTX或者RT-TCP/IP的任何程序或驱动也都能继续运行。

A. 什么是蓝屏?

Windows蓝屏或停止消息是系统失败后的一种智能检查和调用KeBugCheck使Windows返回一个可控停止的状态。此bug-check将数据毁坏保持到最小,并帮助找出系统出问题的原因。所有复杂的操作系统都提供了这种检查和停止功能。实时操作系统(RTOS)一般不做可控的紧急停止,因为它认为保持硬件在任何可能情况下继续运行更为重要。

Windows调用KeBugCheck有诸多原因,如磁盘失败或者调用了坏指针(bad pointers)。因为能捕获到的失败一般都不是完全硬件失败,如CPU失去控制(这种情况很少发生),RTX甚至会在调用KeBugCheck之后继续运行。所有RTSS进程继续执行实时任务,但是此时也只能执行实时任务。因为Windows提供的服务和组件都不再存在,继续运行的RTSS进程就不能在Windows上调用了。

B. Windows发生了什么?

KeBugCheck调用事件中:

  1. 调度器立刻停止
  2. 从GUI模式切换到字符模式
  3. 一个多处理器系统上的所有非启动处理器停止运行
  4. 注册过bug-check提示的驱动得到事件通知
  5. Windows转储内存(可选)
  6. Windows重启(可选)

C. 设置蓝屏后RTX继续运行

目标为将设备重新置于安全的状态,或者允许实时程序在Windows进行bug-check之后继续运行一段合理的时间

  1. 蓝屏前一个关闭句柄会连接到每个必须要继续运行的进程上。每个进程只被连接一个关闭句柄,并且它被创建为一个暂停的线程(suspended thread),这个线程在蓝屏发生时会被释放掉(be released)。关闭句柄的实体一般包含关闭动作发生时警告其进程和线程的代码,而主进程和其线程继续处理大量的运算。
  2. 一旦关闭动作发生,RTX会拦截bug check。RTX重新设计了字符模式的显示,然后RTSS环境进行接管。
  3. 一旦所有拥有关闭句柄的进程的句柄进行了卸载,正常的系统关闭会继续发生。你可以按需要自动重启Windows。

D. 蓝屏后确定性的API工作

在一个实时系统中,重要的任务由RTX来处理,监视及其他任务由Windows来处理。蓝屏发生后再调用Windows时会导致调用线程或进程挂起,因为Windows已经不再能响应请求。必须要小心调用RTX不能直接处理的API函数。一般地,确定性的API会在蓝屏之后工作。然后,有一些非确定性的函数被设计成可以在蓝屏后工作,如printf。当向你的应用程序和驱动中添加关闭程序(shutdown handler)时,请依照以下方法:

  • 在RTX帮助文档索引中,在“Matrixes”条目下有四个函数表格。里面标记为Deterministic可以工作。
  • 一些非确定性的函数也能工作,如printf,RtPrintf,RtWPrintf。
  • 分配内存的函数不能工作,如calloc和malloc。
  • 创建东西的函数不能工作,包括创建线程、定时器、对象和变量。所有初始化工作应该在实时处理开始之前就做完,并且重要的初始化步骤失败时应调用RtReleaseShutdownHandler。如果在关闭时需要一些新的线程,你可以事先创建一些线程,让它们处在以下状态:暂停、等待事件或由关闭函数(shutdown handler)触发的全局变量的变化。
  • 使用Windows的函数不能工作。往一个进程中添加使用RTX和Windows的关机程序是危险的,因为调用Windows的任何操作都会挂起进程或线程。
  • 实时打开(如RtOpenEvent)调用一般能工作,但极少情况下有可能会失败,故最好是避免调用它们。

E. 文件系统

蓝屏后,FAT/FAT32会要求磁盘检查,NTFS分区不要求。

F. RTX场景

在每一个需要蓝屏后运行的进程中添加关机处理函数。由此操作创建的进程和所有线程将会在蓝屏后继续工作。

RTX一般会在进程最开始时,即时序严格要求的处理开始之前,执行所有初始化,内存分配和非确定性操作。这一点在使用关机处理函数之前尤为重要,因为蓝屏后,非确定性函数都不能使用(并会导致线程/进程挂起)。你可以设计检测系统状态的程序,在蓝屏发生时通过发一个事件、改变一个变量或者类似技术来警告它们。在关机处理函数返回前主进程不应结束。因为这会阻止关机处理函数返回和挂起进程。

main()

{

BOOL bBlueScreen = FALSE;

RtCreateEvent()…

CreateThread()…

RtAttachShutdownHandler()…

Sleep(INFINITE);

// until shutdown handler returns

}

正常关机或蓝屏后,关机处理函数开始执行。一般地,关机发生时,此线程的实体会警告此进程和它的线程,它们的行为也随之改变。当需要的处理结束后,关机处理函数返回。这里,RtPulseEvent会被调用,以通知任何睡眠的线程或其他程序。例程rtxtcpserver改变了一个全局变量的值来阻止创建线程的程序。当关机处理函数返回时,相关的进程和其所有线程将会中止。你必须引进一些机制,来确保直到处理结束时关机处理函数一直打开。

ShutdownHandler()

{

// when shutdown occurs, pulse event

RtPulseEvent()

// or set a global variable

bBlueScreen = TRUE;

// continue other processing, but keep ShutdownHandler open

RtWaitForSingleObject()

}

此线程等待在关机处理函数中一个事件的触发。尽管蓝屏后不能创建线程,但是你可以创建蓝屏前不工作的线程。

Thread1()

{

// wait until event is triggered

RtWaitForSingleObject()

// shutdown occurred, begin cleanup

}

G. 错误检查和清理

在RTX关机模式并不需要(并不可能)关闭句柄或销毁对象。因为不能再分配内存,这些对象使用的内存也不需要了,所以这部分的清理是不必要的。但是必须注意的是不能向Windows请求资源,因为操作系统已经不可用,任何调用都将导致线程/进程挂起。

为了清理,你可能需要像下面的代码一样放置一些销毁、关闭句柄和退出函数:

if (bBlueScreen==TRUE)

Sleep(INFINITE); // no destructors or process exits allowed

H. 系统初始化

系统初始化过程中,如果一个重要的部分不能被初始化,可以通过调用RtReleaseShutdownHandler来释放关机处理函数:

if (!(hTimer = RtCreateTimer( NULL, stackSize, default TimerHandler, NULL, RT_PRIORITY_MAX, CLOCK_FASTEST)))

{

printf("Shutdown: Error: Could not create the timer.  GetLastError = %d\n", GetLastError());

RtReleaseShutdownHandler(hShutdown);

return ERROR_OCCURRED;

}

2.  关机处理

RTX关机处理机制为在Windows紧急蓝屏崩溃或RTSS之外“正常”关闭时产生的Windows突然死亡情况下的实时设备设计。当Windows突然死亡时,RTX推迟了其死亡过程,并切换至RTX关机模式,以允许RTSS程序做一些紧急的清理调用。在RTX关机处理过程中,RTX子系统仍可操作并且全部功能可用;Win32 RTX线程则不能。在RTX关闭时,只有通过调用RtAttachShutdownhandler的RTSS进程才有功能。我们将这些进程命令为关机进程(shutdown processes)。在RTX关机周期中没有时限,可以达到永远(但此时Windows将不能执行它自己的关机程序了)。

在RTX关机模式下,关机处理与其他进程有所不同。在Windows关机期间,只有这些RTSS进程保持功能,所有其他的都被冻结。每一个关机处理函数(由RtReleaseShutdownhandler()连接),在单独的RTSS线程上下文中作用,并只有在RTX 关机期间激活。在正常的Windows和RTX操作时,这些RTX关机线程都处在休眠状态。只有一个关机处理函数可以被连接到RTSS进程。对同一个程序的RtReleaseShutdownhandler() 第二次调用将被忽略,除非这之间调用了RtReleaseShutdownhandler()。

关机处理线程开始自调用使用RtAttachShutdownhandler()连接的关机处理函数。此函数有两个参数,第一个参数由用户在调用RtAttachShutdownhandler时定义,第二个参数由RTX提供,用来解释当前关机的原因,以帮助关机处理函数动态地检测Windows出了什么问题。

关机处理线程不是唯一在Windows关机期间活跃的RTSS关机处理进程。所有其他的RTSS关机处理线程也活跃,并且并不限制于普通RTSS实时表现(不需要Windows的地方)。然而,取决于Windows关机的类型,它们可以被限制为所有或部分非实时调用。Windows只会在所有RTSS关机进程结束后才能继续关机。一旦最后一个RTSS关机处理进程退出,RTSS就会停止或者卸载,然后Windows会继续进行关机进程。

在RTX关机期间,RTSS关机处理进程可以跟其他线程一样完全控制它的关机处理线程--可以延迟其动作,甚至可以改变其优先级(这样做并不明智),但是它不可以创建新的RTSS线程和对象。可以在关机处理线程上下文中调用GetCurrentThread() 来获取关机处理线程的句柄。唯一的区别是,如果关机处理线程存在或者被中止(因为“return”,调用了ExitThread() 或者 TerminateThread()),整个关机处理进程仍然存在(就像它是主线程一样)。

Windows 蓝屏关机

所有关机处理线程被激活,另外还有一个额外的线程:关机线程。RTS定时器工作,所有线程可以执行实时调用。但是,它们不能调用任何非实时函数(需要Windows服务),因为当Windows出现致命损坏并将要崩溃之时只有RTX子系统能够工作。唯一的例外是调用RtPrintf() 和 printf() ,这二者在RTX关机模式时将在蓝屏上直接打印信息,但是打印的区域仅限于蓝屏的大小。

在切换到关机模式之前,RTX有选择的将屏幕重置为字符模式,这取决于Shutdown Print Handling 设置。这个重置可能会消耗时间,甚至如果RTSS工作在同一个处理器时有可能不是一个实时调用(在重置时可能会屏蔽中断)。这通常发生于单一处理器的系统上,有时会出现在多处理器系统中的共享模式中。

Windows正常关机

在此阶段不建议创建新的RTSS线程和对象,因为Windows已经关闭了一些服务。

3.  使能停止消息

RTX绿屏或者Windows蓝屏上的停止消息可以迅速提供一个系统崩溃的关键信息。为了使能停止消息,你必须关闭Windows自动重启选项

a. 系统属性->高级

b. 启动和故障恢复->设置

c. 系统失败->自动重启系统,不勾选。

4.  解读Windows停止屏幕

在Windows上,经典的“蓝屏”已经被淘汰。用户仍然可以使用“minidump”或者小内存转储选项来获得相同类型的信息。二者都需要在系统盘有2MB的页面文件,并进行相关的配置。

这种转储文件包含了以下信息:

停止信息和参数及其他数据

加载的驱动列表

  • 停止运行的处理器的processor context (PRCB)
  • 进程信息和停止工作的进程的内核内容(EPROCESS)
  • 进程信息和停止工作的线程的内核内容(ETHREAD)
  • 停止工作的线程的内核态调用堆(Kernel-mode call stack)

5.  解读RTX绿屏停止消息

当RTSS程序发生不可恢复的异常时,RTX异常处理程序会产生一个绿屏。RTX绿屏主要包含四段数据:技术信息,线程上下文和当前线程堆这三个是RTX特有的,而最后一段刚类似于Windows蓝屏时的信息。

1. 技术信息段
此段数据提供了:

  • bug自检码:一个表明错误源的16进制数
  • 当前RTSS进程名称与ID
  • 当前RTSS线程ID与地址
  • 异常地址

2. 线程上下文

包含线程上下文信息

3. 当前线程堆

包含最后活动的RTSS线程,包括线程标识,进程名称,进程标识,指标线程行为的标志,当前状态,原始优先级和当前优先级。

4. 解读蓝屏消息

停止消息段提供了如下bug检查数据:

*** STOP: #E(#1, #2, #3, #4)
*** Address XXXXXXXX has base at YYYYYYYY-Kernel Image

其中

#E = 停止代码.

#1 = identifies the address that was referenced improperly.

#2 = identifies the IRQL that was required to access the memory.

#3 = identifies the access as a Write (Read = 0).

#4 = identifies the instruction address that attempted to access the memory that was referenced in the first parameter

Text = The text interpretation attempts to match one of the entries in the stop message to a loaded image base address to determine approximately where the fault was raised.

Posted in Embedded | Tagged , , | Leave a comment

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

本文档包括以下内容:


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停止事件之后要求进行磁盘检查。

Posted in Embedded | Tagged , , | 1 Comment

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

本文档包括以下内容:


在VS中运行一个RTSS映像

To specify the Configuration Properties settings:

1.   From the Configurations drop-down menu, select RTSSRelease.

2.   From the Project menu, choose Properties to open the Property pages dialog box, and then choose the Configuration Properties,  Debugging node. 项目属性 -> 调试

3.    In the Command field, type in RTSSrun.exe. Include the full path, for example: 在 “命令”中输入Rtssrun的路径

C:\Program Files\Ardence\RTX\bin\rtssrun.exe

4.   In the Command Arguments field, enter the path to your .rtss image. For example: 在“命令参数”中输入要运行的rtss映像路径

C:\Program Files\Microsoft Visual Studio\MyProjects\Example\RTSSRelease\Example.rtss

  1. Click OK to save the settings.

要运行RTSS映像:

From the Debug menu, choose Start without Debugging.       “调试”-> “开始执行(Ctrl + F5)”


生成和注册RTDLL

生成RTDLL的方法与生成rtss的方法相同。

使用RTSSrun来注册生成的RTDLL。


编码技术

  • 使用RTX动态链接库
  • 使用C运行时库函数
  • 加载rtapi_w32.dll
  • 使用浮点数
  • 使用MMX 和SSE
  • 编写RTSS设备驱动
  • C++ 和结构化异常捕获
  • 饥饿管理
  • 用关机处理程序测试RTX程序

1. 使用RTX动态链接库

本节包括以下内容:

  • Descriptions of the two types of real-time DLLs (RTSS DLL and RTDLL)
  • C Runtime Libraries: Programming Considerations for DLLs
  • References to RTSS DLL and RTDLL code examples关于RTSS DLL和RTDLL

    RTSS DLL

    RTSS DLL其实并不是DLL,而是一个可以导出供其他RTSS进程使用的RTSS程序。它们共同一个地址空间。可以在启动时加载,也可以从C/C++编写的Windows程序中调用(e.g., System("RTSSrun LibName.rtss")。尽管与RTSS程序类似,但是其入口点为Main,并被编译链接之后产生一个可以供其他RTSS程序调用的导出函数库。一般地,一个RTSS DLL的Main将会简单地产生一个SuspendThread调用。RTSS DLL允许你在一个调用的程序中用名字引用函数,但是加载时比较麻烦,因为其他RTSS程序使用它们时不会自动加载和卸载它们。

    RTDLL

    RTDLL是可以通过调用LoadLibrary和FreeLibrary动态地加载和卸载的RTSS对象。当引用它们的最后一个进程中止时会自动从内存中卸载。RTDLL不应被静态的加载或延迟加载(delay loaded)。因为RTDLL不需要链接到一个显式的导出库,而是提供一种方便的、弹性的运行时动态适应方法。

    C Runtime Libraries: Programming Considerations for DLLs C运行时库:DLL的编程考虑

    本小节讨论当你设计一个将要与RTX提供的C运行库(RTXlibc.lib or RTXlibcmt.lib)进行链接的RTSS DLL或RTDLL时,需要一直进行考虑的问题。

    MS的C运行库初始化代码假定全局变量有进程范围,比如,会为每一个使用库的进程分配一个所有C运行库的全局变量和结构体的拷贝。但是,在RTSS DLL和RTDLL中不是这样。

    RTSS DLL

    因为RTSS DLL是一些被链接成产生一个导出库的RTSS进程,也因为它们在关机之前不会从内存被卸载,所以,初始化时产生的全局结构体会在使用RTSS DLL的进程的存活周期内一直保留。

    提示:被多个进程使用的RTSS DLL中的少部分C运行时函数会带来不安全因素。

    你不应使用的函数有:fprintf(), getenv(), perror(), printf(), vsprintf(), and wprintf()。因为这些函数信赖于每个进程的全局变量,它们会产生可能导致系统重启的结果。注意这里的“被多个进程使用”意思是在系统启动和关闭时被多于一个的进程在任何时刻使用,包括同一个RTSS映像、在一系列里使用同一个RTSS PID运行两次。

    RTDLLs

    RTDLL不是RTSS进程;他们是可以动态加载和卸载的RTSS对象。因为一个RTDLL产生的对象通常属于调用它的进程,当此进程中止时它们也就被随之销毁。另一方面,C运行库初始化时产生用来内存分配的堆(heaps),这些堆会一直保留到初始加载RTDLL的进程中止之时。因为C运行库函数的行为只在一个RTDLL里可靠,这个RTDLL是多个进程通过有严格限制的LoadLibrary, FreeLibrary 函数调用的。 建议永远不要注册通过C运行库链接得到的RTDLLit,这可以通过  RTSSrun 的 /s 开关来实现。

    RTSS DLL 和 RTDLL 代码例程

    1. RTSS DLL Code Example

    This programming example demonstrates a simple RTSS DLL that exports one function, toggle(), which toggles the state of the PC speaker. A timer is used to control the frequency with which toggle() is called in order to generate a tone with a constant pitch. This example is shown in five parts:

    1. Simple dll.c program
    2. Definition file (dll.def)
    3. Simple program which imports toggle() from dll.rtss
    4. Makefile used to link dll.c
    5. Win32 program to start the DLL and the application that uses it

    RTSS DLL Part 1: dll.c


    #include "windows.h"

    #include "rtapi.h"

    #define SPEAKER_PORT ((PUCHAR)0x61) // Port IO address for speaker

    #define GATE_BIT 0x02

    //

    // MAIN - just suspend the main thread for this process until its

    // use as a DLL is finished and the process is terminated.

    //

    int main(int argc, char **argv)

    {

    SuspendThread( GetCurrentThread());

    return 0;

    }

    //

    // The exported DLL function.

    //

    VOID declspec(dllexport) Toggle(VOID)

    {

    UCHAR i;

    i = RtReadPortUchar( SPEAKER_PORT); // Read PIT PORTB register

    i ^=GATE_BIT; // Change GATE bit

    RtWritePortUchar( SPEAKER_PORT, i); // Write it to PIT PORTB

    }



    RTSS DLL Part 2: dll.def


    LIBRARY DLL.RTSS

    DESCRIPTION 'DLL RTSS'

    EXPORTS

    Toggle



    RTSS DLL Part 3: dll-test.c


    #include "windows.h"

    #include "stdio.h"

    #include "rtapi.h"

    #define NO_ERRORS 0

    #define ERROR_OCCURRED -1

    //

    // External function prototype.

    //

    VOID _stdcall Toggle(VOID);

    //

    // Timer handler -- call the "Toggle" function.

    int RTFCNDCL TimerHandler(PVOID unused)

    {

    Toggle(); // Call the DLL exported function

    return NO_ERROR;

    }

    //

    // MAIN -- start the timer and wait 10 seconds.

    //

    int main(int argc,char *argv[])

    {

    LARGE_INTEGER time;

    HANDLE hTimer;

    ULONG stackSize = 0;

    int waitTime = 10000; //10 seconds

    //

    // Setup and start the periodic timer.

    //

    if (!(hTimer = RtCreateTimer(

    NULL, // Security - NULL is none

    stackSize, // Stack size - 0 is use default

    TimerHandler, // Timer handler

    NULL, // NULL context (argument to handler)

    RT_PRIORITY_MAX, // Priority

    CLOCK_FASTEST))) // Always use fastest available clock

    {

    printf("ERROR: Could not create the RTX timer.\n");

    return (ERROR_OCCURED);

    }

    time.QuadPart = 10000; // 1 milliscond interval

    if (!RtSetTimerRelative( hTimer, &time, &time))

    {

    printf("ERROR: Could not set and start the RTAPI timer.\n");

    return (ERROR_OCCURED);

    }

    //

    // Wait for 10 seconds.

    //

    Sleep(waitTime);

    //

    // Stop and delete the timer.

    //

    if (!RtDeleteTimer( hTimer))

    {

    printf("ERROR: Could not Delete timer.\n");

    return (ERROR_OCCURED);

    }

    return (NO_ERRORS);

    }



    RTSS DLL Part 4: dll.mak


    NODEBUG = 1

    !include <rtx.mak>

    all: dll.rtss dll-test.rtss RunTest.exe

    dll.rtss: dll.obj

    lib -nodefaultlib -machine:$(CPU) -out:dll.lib -def:dll.def dll.obj

    link $(rtsslflags) -out:dll.rtss dll.exp dll.obj $(rtsslibs)

    del dll.exp

    dll-test.rtss: dll.lib dll-test.obj

    link $(rtsslflags) -out:$*.rtss $*.obj dll.lib $(rtsslibs)

    clean:

    -del *.rtss

    -del *.obj

    -del *.exe

    -del dll.lib



    RTSS DLL Part 5: runtest.c


    #include "windows.h"

    #include "stdio.h"

    #define NO_ERRORS 0

    #define ERROR_OCCURRED -1

    //

    // Standard function to run a utility.

    //

    LONG RunUtility( PCHAR lpCmd )

    {

    STARTUPINFO sinfo;

    PROCESS_INFORMATION pinfo;

    LONG exitCode = 0;

    //

    // Initialize startup info to all zeros.

    //

    ZeroMemory(&sinfo, sizeof(sinfo));

    sinfo.cb=sizeof(sinfo);

    //

    // Create the process to run the utility.

    //

    if (CreateProcess(NULL, lpCmd, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo)==FALSE)

    {

    return (exitCode-1);

    }

    //

    // Wait for the utility to complete.

    //

    WaitForSingleObject( pinfo.hProcess, INFINITE);

    //

    // Get the exit code (RTSSrun returns the process slot) and close handles.

    //

    GetExitCodeProcess( pinfo.hProcess, &exitCode);

    CloseHandle( pinfo.hThread);

    CloseHandle( pinfo.hProcess);

    return exitCode;

    }

    //

    // MAIN.

    //

    int main( int argc, char *argv[])

    {

    LONG dllPid, testPid;

    char buf[50];

    int sleepTime = 5000;

    LONG exitCode = 0;

    //

    // Load the RTSS DLL first.

    //

    dllPid = RunUtility("RTSSrun dll.rtss");

    if (dllPid<=exitCode)

    {

    printf("DLL failed to load.\n");

    return (ERROR_OCCURED);

    }

    //

    // Now run the test program.

    //

    testPid = RunUtility("RTSSrun dll-test.rtss");

    if (testPid<=exitCode)

    {

    printf("DLL-TEST failed to run,\n");

    return (ERROR_OCCURED);

    }

    // Sleep for 5 seconds and then terminate program and dll.

    Sleep(sleepTime);

    sprintf( buf, "RTSSkill %d", testPid);

    RunUtility( buf);

    sprintf( buf, "RTSSkill %d", dllPid);

    RunUtility( buf);

    return NO_ERROR;

    }


    2. RTDLL Code Example

    This example implements the same functionality as the RTSS DLL example above using an RTDLL to provide the toggle() function. It is shown in four parts:

    1. Simple RTDLL program source code
    2. Simple RTSS application which loads the RTDLL and calls an exported subroutine
    3. Makefile used to create the RTSS application and RTDLL
    4. RTSSrun command used to register the RTDLL

    RTDLL Part 1: sampleRtdll.c


    #include "windows.h"

    #include "rtapi.h"

    #define SPEAKER_PORT ((PUCHAR)0x61) //Port IO address for speaker

    #define GATE_BIT 0x02

    //exported Rtdll Function

    __declspec ( dllexport )

    int _stdcall Toggle(int argc, char* argv[])

    {

    UCHAR i;

    // Read PIT PORTB register

    i = RtReadPortUchar( SPEAKER_PORT);

    // Check GATE bit

    i^= GATE_BIT;

    // Write it to PIT PORTB

    RtWritePortUchar( SPEAKER_PORT, i);

    return 0;

    }

    //DllMain must Explicitly return True

    BOOL WINAPI _stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)

    {

    return TRUE;

    }



    RTDLL Part 2: usingRtdll.c


    #include <windows.h>

    #include <stdio.h>

    #include <rtapi.h>

    #define NO_ERRORS 0

    #define ERROR_OCCURRED -1

    #define SPEAKER_PORT ((PUCHAR)0x61) //Port IO address for speaker

    FARPROC FunctionPtr = NULL;

    int RTFCNDCL TimerHandler(PVOID unused)

    {

    //call Function Toggle

    FunctionPtr(0, NULL);

    return NO_ERRORS;

    }

    /*** MAIN ****/

    int main(int argc, char* argv[])

    {

    HANDLE hLibModule = NULL;

    HANDLE hTimer = NULL;

    LARGE_INTEGER time;

    LPCSTR lpLibFileName = "sampleRtdll.dll";

    LPCSTR lpProcName = "_Toggle@8";

    ULONG sleepTime = 10000;

    //*********** Sample Code: usingRtdll ***********\\

    //load Library sampleRtdll

    hLibModule = LoadLibrary(lpLibFileName);

    //check if loadLibrary returned correctly

    if(hLibModule==NULL)

    {

    //error caused by loading a corrupt or unregistered Rtdll

    RtPrintf("UsingRtdll: ERROR: LoadLibrary() failed. Get last Error = %d\n",GetLastError());

    RtPrintf("%s maybe corrupt or not registered with RTSS\n", lpLibFileName);

    return (ERROR_OCCURED);

    }

    //Get function from Rtdll

    FunctionPtr = GetProcAddress(hLibModule, lpProcName);

    //check if function was found

    if(FunctionPtr == NULL)

    {

    //error caused by nonexistent function name

    RtPrintf("UsingRtdll: Error: GetProcAddress() failed. Get Last Error = %d\n",GetLastError());

    RtPrintf("The Function %s does not exist\n", lpProcName);

    //free library before exit

    FreeLibrary(hLibModule);

    return (ERROR_OCCURED);

    }

    //Enable so Win32 can use PortIO

    if (! RtEnablePortIo(SPEAKER_PORT, 1))

    {

    printf("UsingRtdll: Error: Could not enable Port IO\n");

    FreeLibrary(hLibModule);

    return (ERROR_OCCURED);

    }

    // Setup and start the periodic timer.

    hTimer = RtCreateTimer(NULL, 0, TimerHandler, NULL, RT_PRIORITY_MAX,CLOCK_FASTEST);

    //check if timer was created

    if(hTimer == NULL)

    {

    RtPrintf("UsingRtdll: ERROR: RtCreateTimer failed. Get Last Error = %d\n",GetLastError());

    //free library before exit

    FreeLibrary(hLibModule);

    return (ERROR_OCCURED);

    }

    time.QuadPart = 10000; // 1 milliscond interval

    if (!RtSetTimerRelative( hTimer, &time, &time))

    {

    RtPrintf("UsingRtdll: ERROR: Could not set and start the RTAPI timer.\n");

    //free library before exit

    FreeLibrary(hLibModule);

    return (ERROR_OCCURED);

    }

    // Wait for 10 seconds.

    Sleep(sleepTime);

    // Stop and delete the timer.

    if(!RtDeleteTimer(hTimer))

    {

    RtPrintf("UsingRtdll: ERROR: RtDeleteTimer failed. Get Last Error = %d.\nGetLastError());

    //free library before exit

    FreeLibrary(hLibModule);

    return (ERROR_OCCURED);

    }

    //free the Library before exiting Process

    if(!FreeLibrary(hLibModule))

    {

    //error caused by an invalid Library handle

    RtPrintf("UsingRtdll: Error: FreeLibrary() failed. Get Last Error = %d\n",GetLastError());

    return (ERROR_OCCURED);

    }

    //the end

    return (NO_ERRORS);

    }


    RTDLL Part 3: rtdll.mak


    NODEBUG = 1

    RTSS_CRT = 1

    !include <rtx.mak>

    all: sampleRtdll.rtdll usingRtdll.rtss \

    sampleRtdll.dll usingRtdll.exe

    clean:

    -del *.rtdll

    -del *.lib

    -del *.obj

    -del *.exp

    -del *.dll

    -del *.exe



    RTDLL Part 4: Register the rtdll


    C:\> RTSSRun /dll sampleRtdll
Posted in Embedded | Tagged , , | Leave a comment

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

本文档包括以下内容:

安装VS RTX向导

提示:以下过程只是在安装RTX之后再安装VS时才需要。如果首先安装了VS,然后再安装了RTX,则RTX向导会自动安装。

“添加/删除程序”-->RTX,单击“更改”-->

  1. In the Welcome screen, click Next.
  2. Click Modify, then click Next.
  3. On the Custom Setup screen, expand Microsoft Visual Studio Support.
  4. Click the icon next to the version of Visual Studio you have and choose This feature will be installed on local hard drive.
  5. Click Next.
  6. Click Install.
  7. Click Finish.

新建一个RTX工程(2005 and .NET)

提示:RTX不支持.NET环境下的托管代码。

To create an RTX Project:

  1. From the Visual Studio menu bar select File > New > Project.
  2. Select Visual C++ Projects from the Project types list.
  3. Select one of the following from the templates area:
    • RTX Application Wizard
    • RTX Device Driver Wizard
    • RTX Network Driver Wizard
  1. On the bottom of the dialog you can edit the default project name and location.
  2. Click OK to start the wizard. The Overview page displays the current settings of the RTX Project. Edit the settings of the RTX Project using the wizard. See the following topics for more information:

For Device Drivers:

For Applications:

For Network Drivers:

RTX项目包括四个生成设置:Win32 Release, Win32 Debug, RTSSRelease 和RTSSDebug。

RTX向导可以生成一个可以运行的基本的C语言程序框架,其中包括定时器、事件对象等基本用法。


使用RTX设备驱动向导

1. 生成项目

略。

2. 编辑驱动设置

  1. 在RTX Device Driver Wizard中单击 Driver Settings
  2. 要生成一个RTX驱动,选择 RTX application (.rtss)。 要生成一个RTDLL,选择 Build Device Driver as a DLL
  3. 选择 UNICODEASCII 字符编码方式。
  4. 如果你需要 C 运行时函数的支持,选择 single-threaded 或 multi-threaded library。
    Note:  Visual Studio 2005 不再支持 single-thread C Runtime library。
  5. 如果这些设置满足需要,单击 Finish。否则,单击 Program Settings ,继续编辑程序设置。

3. 编辑程序设置(2005 and .NET)

  1. 单击左侧的 Program Settings
  2. RTX Device Driver Wizard 能够为PCI或串行设备建立一个基本的程序框架。如果选择了 Provide PCI Device framework 或 Provide Serial Device framework ,向导会往项目中插入包含基本功能的C源代码和相关头文件。 如果选择了 No framework,则向导会只保存项目的设置,并不包括任何头文件或C 源文件。
  3. 如果选择了 Provide PCI Device FrameworkProvide Serial Device Framework ,RTX 代码段就会被包含进程序框架中。这些代码显示了RTAPI的合适调用,可做为如何使用这些函数的例子。在其中的"TO DO" 注释下面,用户可以添加自己的代码。可以为一个项目中选择一个或多个代码段,下表显示了现有的代码段及其描述:
代码段
描述

Interrupt Service Routine

创建一个基本的ISR模板,可以用来当一个中断被共享时确定中断的拥有者。
Shared Interrupt Support
支持中断共享代码段。

Basic IO support

支持端口IO的代码段。使能/禁用端口IO,对一个IO端口进行基本的读写操作。

Basic Memory Mapping Support

支持内存映射的代码段。提示:这个代码段不支持串行设备。

4. 编译和链接选项(For VS 2005)

注意VS2005提供的清单(manifest)功能不能嵌入到一个.rtss程序中。

  • <RTXSDKDir> 指向RTX SDK路径。
  • <APP>指向程序的名称。
  • <RunDir>指向RTDLL运行的路径,通常为 C:\WINDOWS\RTSS\rtdll。

提示:

  • 当选择“add support for RT-TCP/IP Support”时,预处理定义 _WSPIAPI_H ("/D _WSPIAPI_H_") 会被加入到项目的编译选项中,库rtxtcpip.lib会被加入到链接选项中。
  • 浮点模型被设置成 /fp:fast 以获得最佳性能。详情见《使用浮点数》这一小节的内容。

(1) RTSS Debug No C Runtime:

编译选项

/Od /I "<RTXSDKDir>\include"

/D "WIN32" /D "UNDER_RTSS" /D "_DEBUG" /D "VISUALSTUDIO=8" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MTd /GS- /fp:fast /GR- /Fo"RTSSDebug\\"

/Fd"RTSSDebug/<APP>.pdb" /W3 /nologo /c /Z7 /Gd /errorReport:prompt

链接选项

/OUT:"<APP>.rtss" /INCREMENTAL:NO /NOLOGO /LIBPATH:"<RTXSDKDir>\lib" /MANIFEST /MANIFESTFILE:"RTSSDebug\:<APP>.rtss.intermediate.manifest" /NODEFAULTLIB /NODEFAULTLIB:"libc" /NODEFAULTLIB:"libcd" /NODEFAULTLIB:"libcmt" /NODEFAULTLIB:"libcmtd" /DEBUG /PDB:":<APP>.pdb" /SUBSYSTEM:NATIVE /DRIVER /ENTRY:"_RtapiProcessEntry@8" /MACHINE:X86 /ERRORREPORT :P ROMPT rtapi_rtss.lib rtx_rtss.lib

(2) RTSS Release No CRuntime:

编译选项

/Ox /I "<RTXSDKDir>\include" /D "WIN32" /D "UNDER_RTSS" /D "NDEBUG" /D "RELEASE" /D "VISUALSTUDIO=8" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MT /GS- /fp:fast /GR- /Fo"RTSSRelease\\" /Fd"RTSSRelease/<APP>.pdb" /W3 /nologo /c /Gd /errorReport:prompt

链接选项

/OUT:"<APP>.rtss" /INCREMENTAL:NO /NOLOGO /LIBPATH::"<RTXSDKDir>\lib" /MANIFEST /MANIFESTFILE:"<APP>.rtss.intermediate.manifest" /NODEFAULTLIB /NODEFAULTLIB:"libc" /NODEFAULTLIB:"libcd" /NODEFAULTLIB:"libcmt" /NODEFAULTLIB:"libcmtd" /SUBSYSTEM:NATIVE /DRIVER /ENTRY:"_RtapiProcessEntry@8" /MACHINE:X86 /ERRORREPORT :P ROMPT rtapi_rtss.lib rtx_rtss.lib

(3) RTSS Debug Multi thread CRuntime:

编译选项

/Od /I "<RTXSDKDir>\include" /D "WIN32" /D "UNDER_RTSS" /D "_DEBUG" /D "VISUALSTUDIO=8" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MTd /GS- /fp:fast /GR- /Fo"RTSSDebug\\" /Fd"RTSSDebug/<APP>.pdb" /W3 /nologo /c /Z7 /Gd /errorReport:prompt

链接选项

/OUT:"<APP>.rtss" /INCREMENTAL:NO /NOLOGO /LIBPATH:"<RTXSDKDir>\lib" /LIBPATH:"RTXSDKDir>\lib\VisualStudio8" /MANIFEST /MANIFESTFILE:"RTSSDebug\<APP>.rtss.intermediate.manifest" /NODEFAULTLIB /NODEFAULTLIB:"libc" /NODEFAULTLIB:"libcd" /NODEFAULTLIB:"libcmt" /NODEFAULTLIB:"libcmtd" /DEBUG /PDB:"<APP>.pdb" /SUBSYSTEM:NATIVE /DRIVER /ENTRY:"_RtapiProcessEntryCRT@8" /MACHINE:X86 /ERRORREPORT :P ROMPT startupCRT.obj rtxlibcmt.lib oldnames.lib rtapi_rtss.lib rtx_rtss.lib

(4) RTSS Release Multi thread CRuntime:

编译选项

/Ox /I "<RTXSDKDir>\include" /D "WIN32" /D "UNDER_RTSS" /D "NDEBUG" /D "RELEASE" /D "VISUALSTUDIO=8" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MT /GS- /fp:fast /GR- /Fo"RTSSRelease\\" /Fd"RTSSRelease/<APP>.pdb" /W3 /nologo /c /Gd /errorReport:prompt

链接选项

/OUT:"<APP>.rtss" /INCREMENTAL:NO /NOLOGO /LIBPATH:"<RTXSDKDir>\lib" /LIBPATH:"<RTXSDKDir>\lib\VisualStudio8" /MANIFEST /MANIFESTFILE:"RTSSRelease\<APP>.rtss.intermediate.manifest" /NODEFAULTLIB /NODEFAULTLIB:"libc" /NODEFAULTLIB:"libcd" /NODEFAULTLIB:"libcmt" /NODEFAULTLIB:"libcmtd" /SUBSYSTEM:NATIVE /DRIVER /ENTRY:"_RtapiProcessEntryCRT@8" /MACHINE:X86 /ERRORREPORT :P ROMPT startupCRT.obj rtxlibcmt.lib oldnames.lib rtapi_rtss.lib rtx_rtss.lib

(5) RTDLL Debug No CRuntime

编译选项

/Od /I "<RTXSDKDir>\include" /D "WIN32" /D "UNDER_RTSS" /D "_DEBUG" /D "RTX_EXPORTS" /D "VISUALSTUDIO=8" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" /FD /EHsc /MTd /GS- /fp:fast /GR- /Fo"RTSSDebug\\" /Fd"RTSSDebug/<APP>.pdb" /W3 /nologo /c /Z7 /Gd /errorReport:prompt

链接选项

/OUT:"<APP>.rtdll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"<RTXSDKDir>\lib" /DLL /MANIFEST /MANIFESTFILE:"RTSSDebug\<APP>.rtdll.intermediate.manifest" /NODEFAULTLIB /NODEFAULTLIB:"libc" /NODEFAULTLIB:"libcd" /NODEFAULTLIB:"libcmt" /NODEFAULTLIB:"libcmtd" /DEBUG /PDB:"<APP>.pdb" /SUBSYSTEM:NATIVE /DRIVER /ENTRY:"_RtapiDllEntry@8" /MACHINE:X86 /ERRORREPORT :P ROMPT rtapi_rtss.lib rtx_rtss.lib startupdll.obj

(6) RTDLL Release No CRuntime

编译选项

/Ox /I "<RTXSDKDir>\include" /D "WIN32" /D "UNDER_RTSS" /D "NDEBUG" /D "RELEASE" /D "RTX_EXPORTS" /D "VISUALSTUDIO=8" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" /FD /EHsc /MT /GS- /fp:fast /GR- /Fo"RTSSRelease\\" /Fd"RTSSRelease/<APP>.pdb" /W3 /nologo /c /Gd /errorReport:prompt

链接选项

/OUT:"<APP>.rtdll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"<RTXSDKDir>\lib" /DLL /MANIFEST /MANIFESTFILE:"RTSSRelease\<APP>.rtdll.intermediate.manifest" /NODEFAULTLIB /NODEFAULTLIB:"libc" /NODEFAULTLIB:"libcd" /NODEFAULTLIB:"libcmt" /NODEFAULTLIB:"libcmtd" /SUBSYSTEM:NATIVE /DRIVER /ENTRY:"_RtapiDllEntry@8" /MACHINE:X86 /ERRORREPORT :P ROMPT rtapi_rtss.lib rtx_rtss.lib startupdll.obj

(7) RTDLL Debug Multi thread CRuntime

编译选项

/Od /I "<RTXSDKDir>\include" /D "WIN32" /D "UNDER_RTSS" /D "_DEBUG" /D "RTX_EXPORTS" /D "VISUALSTUDIO=8" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" /FD /EHsc /MTd /GS- /fp:fast /GR- /Fo"RTSSDebug\\" /Fd"RTSSDebug/<APP>.pdb" /W3 /nologo /c /Z7 /Gd /errorReport:prompt

链接选项

/OUT:"<APP>.rtdll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"<RTXSDKDir>\lib" /LIBPATH:"<RTXSDKDir>\lib\VisualStudio8" /DLL /MANIFEST /MANIFESTFILE:"RTSSDebug\<APP>.rtdll.intermediate.manifest" /NODEFAULTLIB /NODEFAULTLIB:"libc" /NODEFAULTLIB:"libcd" /NODEFAULTLIB:"libcmt" /NODEFAULTLIB:"libcmtd" /DEBUG /PDB:"<APP>.pdb" /SUBSYSTEM:NATIVE /DRIVER /ENTRY:"_RtapiDllEntryCRT@8" /MACHINE:X86 /ERRORREPORT :P ROMPT startupDllCrt.obj rtxlibcmt.lib oldnames.lib rtapi_rtss.lib rtx_rtss.lib

( 8) RTDLL release Multi thread CRuntime

编译选项

/Ox /I "<RTXSDKDir>\include" /D "WIN32" /D "UNDER_RTSS" /D "NDEBUG" /D "RELEASE" /D "RTX_EXPORTS" /D "VISUALSTUDIO=8" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" /FD /EHsc /MT /GS- /fp:fast /GR- /Fo"RTSSRelease\\" /Fd"RTSSRelease/<APP>.pdb" /W3 /nologo /c /Gd /errorReport:prompt

链接选项

/OUT:"<APP>.rtdll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"<RTXSDKDir>\lib" /LIBPATH:"<RTXSDKDir>\lib\VisualStudio8" /DLL /MANIFEST /MANIFESTFILE:"RTSSRelease\<APP>.rtdll.intermediate.manifest" /NODEFAULTLIB /NODEFAULTLIB:"libc" /NODEFAULTLIB:"libcd" /NODEFAULTLIB:"libcmt" /NODEFAULTLIB:"libcmtd" /SUBSYSTEM:NATIVE /DRIVER /ENTRY:"_RtapiDllEntryCRT@8" /MACHINE:X86 /ERRORREPORT :P ROMPT startupDllCrt.obj rtxlibcmt.lib oldnames.lib rtapi_rtss.lib rtx_rtss.lib


使用RTX程序向导

1. 建立项目

略。

2. 编辑程序设置

同RTX设备驱动向导。

3. 编辑程序选项

如果选择了 Provide a program framework ,会有RTX代码段添加进项目中,有以下几种:

  • Event server thread: 创建一个子线程函数框架,包括一个命名的事件和一个子线程、设置线程的优先级、恢复/暂停线程。用户必须提供子线程函数代码,事件名称和异常代码。
  • Periodic timer thread: 创建一个周期性定时器框架。用户必须提供定时器生命时间,周期定时函数代码和异常代码。
  • RTDLL exported function: 创建一个生成RTDLL 的代码框架.  此选项只有在指定程序类型为RTDLL 才有效。
  • Interrupt handler thread (.NET only): 由Device Driver Wizard提供,产生一个有中断向量的中断处理函数框架。用户必须提供中断处理函数代码,总线信息和异常代码。
  • Port I/O (.NET only): 由Device Driver Wizard提供,显示了如何使能从用户态直接通过IO访问一个端口,还给出了一个如何读写蜂鸣器的例子。

4. 编译和链接选项(VS 2005)

(1) RTSS Debug No C Runtime

编译选项

/Od /I "<RTXSDKDir>\include"

/D "WIN32" /D "UNDER_RTSS" /D "_DEBUG" /D "VISUALSTUDIO=8" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MTd /GS- /fp:fast /GR- /Fo"RTSSDebug\\" /Fd"RTSSDebug/<APP>.pdb" /W3 /nologo /c /Z7 /Gd /errorReport:prompt

链接选项

/OUT:"<APP>.rtss" /INCREMENTAL:NO /NOLOGO /LIBPATH:"<RTXSDKDir>\lib" /MANIFEST /MANIFESTFILE:"RTSSDebug\:<APP>.rtss.intermediate.manifest" /NODEFAULTLIB /NODEFAULTLIB:"libc" /NODEFAULTLIB:"libcd" /NODEFAULTLIB:"libcmt" /NODEFAULTLIB:"libcmtd" /DEBUG /PDB:":<APP>.pdb" /SUBSYSTEM:NATIVE /DRIVER /ENTRY:"_RtapiProcessEntry@8" /MACHINE:X86 /ERRORREPORT :P ROMPT rtapi_rtss.lib rtx_rtss.lib

(2) RTSS Release No CRuntime

编译选项

/Ox /I "<RTXSDKDir>\include" /D "WIN32" /D "UNDER_RTSS" /D "NDEBUG" /D "RELEASE" /D "VISUALSTUDIO=8" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MT /GS- /fp:fast /GR- /Fo"RTSSRelease\\" /Fd"RTSSRelease/<APP>.pdb" /W3 /nologo /c /Gd /errorReport:prompt

链接选项

/OUT:"<APP>.rtss" /INCREMENTAL:NO /NOLOGO /LIBPATH::"<RTXSDKDir>\lib" /MANIFEST /MANIFESTFILE:"<APP>.rtss.intermediate.manifest" /NODEFAULTLIB /NODEFAULTLIB:"libc" /NODEFAULTLIB:"libcd" /NODEFAULTLIB:"libcmt" /NODEFAULTLIB:"libcmtd" /SUBSYSTEM:NATIVE /DRIVER /ENTRY:"_RtapiProcessEntry@8" /MACHINE:X86 /ERRORREPORT :P ROMPT rtapi_rtss.lib rtx_rtss.lib

(3) RTSS Debug Multi thread CRuntime

编译选项

/Od /I "<RTXSDKDir>\include" /D "WIN32" /D "UNDER_RTSS" /D "_DEBUG" /D "VISUALSTUDIO=8" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MTd /GS- /fp:fast /GR- /Fo"RTSSDebug\\" /Fd"RTSSDebug/<APP>.pdb" /W3 /nologo /c /Z7 /Gd /errorReport:prompt

链接选项

/OUT:"<APP>.rtss" /INCREMENTAL:NO /NOLOGO /LIBPATH:"<RTXSDKDir>\lib" /LIBPATH:"RTXSDKDir>\lib\VisualStudio8" /MANIFEST /MANIFESTFILE:"RTSSDebug\<APP>.rtss.intermediate.manifest" /NODEFAULTLIB /NODEFAULTLIB:"libc" /NODEFAULTLIB:"libcd" /NODEFAULTLIB:"libcmt" /NODEFAULTLIB:"libcmtd" /DEBUG /PDB:"<APP>.pdb" /SUBSYSTEM:NATIVE /DRIVER /ENTRY:"_RtapiProcessEntryCRT@8" /MACHINE:X86 /ERRORREPORT :P ROMPT startupCRT.obj rtxlibcmt.lib oldnames.lib rtapi_rtss.lib rtx_rtss.lib

(4) RTSS Release Multi thread CRuntime

编译选项

/Ox /I "<RTXSDKDir>\include" /D "WIN32" /D "UNDER_RTSS" /D "NDEBUG" /D "RELEASE" /D "VISUALSTUDIO=8" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MT /GS- /fp:fast /GR- /Fo"RTSSRelease\\" /Fd"RTSSRelease/<APP>.pdb" /W3 /nologo /c /Gd /errorReport:prompt

链接选项

/OUT:"<APP>.rtss" /INCREMENTAL:NO /NOLOGO /LIBPATH:"<RTXSDKDir>\lib" /LIBPATH:"<RTXSDKDir>\lib\VisualStudio8" /MANIFEST /MANIFESTFILE:"RTSSRelease\<APP>.rtss.intermediate.manifest" /NODEFAULTLIB /NODEFAULTLIB:"libc" /NODEFAULTLIB:"libcd" /NODEFAULTLIB:"libcmt" /NODEFAULTLIB:"libcmtd" /SUBSYSTEM:NATIVE /DRIVER /ENTRY:"_RtapiProcessEntryCRT@8" /MACHINE:X86 /ERRORREPORT :P ROMPT startupCRT.obj rtxlibcmt.lib oldnames.lib rtapi_rtss.lib rtx_rtss.lib

(5) RTDLL Debug No CRuntime

编译选项

/Od /I "<RTXSDKDir>\include" /D "WIN32" /D "UNDER_RTSS" /D "_DEBUG" /D "RTX_EXPORTS" /D "VISUALSTUDIO=8" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" /FD /EHsc /MTd /GS- /fp:fast /GR- /Fo"RTSSDebug\\" /Fd"RTSSDebug/<APP>.pdb" /W3 /nologo /c /Z7 /Gd /errorReport:prompt

链接选项

/OUT:"<APP>.rtdll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"<RTXSDKDir>\lib" /DLL /MANIFEST /MANIFESTFILE:"RTSSDebug\<APP>.rtdll.intermediate.manifest" /NODEFAULTLIB /NODEFAULTLIB:"libc" /NODEFAULTLIB:"libcd" /NODEFAULTLIB:"libcmt" /NODEFAULTLIB:"libcmtd" /DEBUG /PDB:"<APP>.pdb" /SUBSYSTEM:NATIVE /DRIVER /ENTRY:"_RtapiDllEntry@8" /MACHINE:X86 /ERRORREPORT :P ROMPT rtapi_rtss.lib rtx_rtss.lib startupdll.obj

(6) RTDLL Release No CRuntime

编译选项

/Ox /I "<RTXSDKDir>\include" /D "WIN32" /D "UNDER_RTSS" /D "NDEBUG" /D "RELEASE" /D "RTX_EXPORTS" /D "VISUALSTUDIO=8" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" /FD /EHsc /MT /GS- /fp:fast /GR- /Fo"RTSSRelease\\" /Fd"RTSSRelease/<APP>.pdb" /W3 /nologo /c /Gd /errorReport:prompt

链接选项

/OUT:"<APP>.rtdll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"<RTXSDKDir>\lib" /DLL /MANIFEST /MANIFESTFILE:"RTSSRelease\<APP>.rtdll.intermediate.manifest" /NODEFAULTLIB /NODEFAULTLIB:"libc" /NODEFAULTLIB:"libcd" /NODEFAULTLIB:"libcmt" /NODEFAULTLIB:"libcmtd" /SUBSYSTEM:NATIVE /DRIVER /ENTRY:"_RtapiDllEntry@8" /MACHINE:X86 /ERRORREPORT :P ROMPT rtapi_rtss.lib rtx_rtss.lib startupdll.obj

(7) RTDLL Debug Multi thread CRuntime

编译选项

/Od /I "<RTXSDKDir>\include" /D "WIN32" /D "UNDER_RTSS" /D "_DEBUG" /D "RTX_EXPORTS" /D "VISUALSTUDIO=8" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" /FD /EHsc /MTd /GS- /fp:fast /GR- /Fo"RTSSDebug\\" /Fd"RTSSDebug/<APP>.pdb" /W3 /nologo /c /Z7 /Gd /errorReport:prompt

链接选项

/OUT:"<APP>.rtdll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"<RTXSDKDir>\lib" /LIBPATH:"<RTXSDKDir>\lib\VisualStudio8" /DLL /MANIFEST /MANIFESTFILE:"RTSSDebug\<APP>.rtdll.intermediate.manifest" /NODEFAULTLIB /NODEFAULTLIB:"libc" /NODEFAULTLIB:"libcd" /NODEFAULTLIB:"libcmt" /NODEFAULTLIB:"libcmtd" /DEBUG /PDB:"<APP>.pdb" /SUBSYSTEM:NATIVE /DRIVER /ENTRY:"_RtapiDllEntryCRT@8" /MACHINE:X86 /ERRORREPORT :P ROMPT startupDllCrt.obj rtxlibcmt.lib oldnames.lib rtapi_rtss.lib rtx_rtss.lib

( 8) RTDLL release Multi thread CRuntime

编译选项

/Ox /I "<RTXSDKDir>\include" /D "WIN32" /D "UNDER_RTSS" /D "NDEBUG" /D "RELEASE" /D "RTX_EXPORTS" /D "VISUALSTUDIO=8" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" /FD /EHsc /MT /GS- /fp:fast /GR- /Fo"RTSSRelease\\" /Fd"RTSSRelease/<APP>.pdb" /W3 /nologo /c /Gd /errorReport:prompt

链接选项

/OUT:"<APP>.rtdll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"<RTXSDKDir>\lib" /LIBPATH:"<RTXSDKDir>\lib\VisualStudio8" /DLL /MANIFEST /MANIFESTFILE:"RTSSRelease\<APP>.rtdll.intermediate.manifest" /NODEFAULTLIB /NODEFAULTLIB:"libc" /NODEFAULTLIB:"libcd" /NODEFAULTLIB:"libcmt" /NODEFAULTLIB:"libcmtd" /SUBSYSTEM:NATIVE /DRIVER /ENTRY:"_RtapiDllEntryCRT@8" /MACHINE:X86 /ERRORREPORT :P ROMPT startupDllCrt.obj rtxlibcmt.lib oldnames.lib rtapi_rtss.lib rtx_rtss.lib


使用RTX网络驱动向导

略。


使用Makefile来创建程序和DLL

可以使用RTX托管的makefile(rtx.mak)来创建一个程序的RTSS和Win32版本。rtx.mak包含编译C文件和链接obj文件的规则。可以使用rtx.mak在一个makefile中指定Win32可执行文件(.exe),因为rtx.mak包括win32.mak。

Makefile 变量

NODEBUG: Specifies that no debugging information is included in the executable image.

RTSS_CRT: Links RTSS single-threaded applications with the C run-time library.

RTSS_MTCRT: Links RTSS multi-threaded applications with the C run-time library.

VISUALSTUDIO=X

where X = 6 for Visual Studio 6 C Runtime support
7 for Visual Studio .NET C Runtime support
71 for Visual Studio .NET 2003 C Runtime support
8 for Visual Studio 2005 C Runtime support6

Note: RTX no longer registers its lib and include directories with the System, so before building your application, you will need to run RtxSetEnv.bat, located in the RTX bin directory.


使用Makefile来创建动态链接库

以下内容介绍如何生成RTSS DLL和RTDLL。

1. 生成RTSS DLL

可以使用包括所需初始化程序的'main'进入点来生成一个RTSS DLL。需要以下两种文件:

dll.c — 定义了调用库函数的源文件

dll.def — 定义了DLL名称和导出函数

注意进入RTSS DLL的进入点为 MAIN。

RTSS DLL Makefile 例子

The following example shows a typical RTSS DLL makefile for dll.c.


NODEBUG = 1

!include <rtx.mak>

all: dll.rtss

dll.rtss: dll.obj

lib -nodefaultlib -machine:$(CPU) -out:dll.lib -def:dll.def dll.obj

link $(rtsslflags) -out:dll.rtss dll.exp dll.obj $(rtsslibs)

del dll.exp

clean:

-del *.rtss

-del *.obj

-del *.exe

-del dll.lib

2. 生成RTDLL

The following is an example of an nmake input file which will build an RTDLL and Win32 DLL from a single source file, thandler.c.


!include <rtx.mak>

all: thandler.dll thankler.rtdll

clean:

-del thandler.obj thandler.dll thandler.rtdll

Posted in Embedded | Tagged , , | Leave a comment

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

本文档包括以下内容:


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

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

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

程序开发指南

为保证成功的开发实时应用程序,设计者和开发人员必须仔细分析如何划分程序,也必须在非实时进程(Win32)和实时进程(RTSS)建立正确的平衡并决定二者之间的接口。
例如,在Win32进程中有大量的严格时间处理,而在RTSS进程中有太多的非严格时间处理,或者在进程接口间有太多同步或数据流,那么,程序的性能,可用性和其他开发与维护工作都会变得很危险。对开发者和他们的用户来说,在初期就花费大量时间对任务的主要结构进行深入的分析和设计是值得的。

测试实时程序

支持使用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也能导出函数以被其他模块加载和动态链接。但是,在这种情况下,不支持提示二者的联系信息,而且导出的模块必须首先被手动加载,然后在程序结束时手动卸载。

Posted in Embedded | Tagged , , | Leave a comment

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

本文档包括以下内容:


RTSSrun

使用RTSSrun工具可以:
  • 运行一个RTSS程序
  • 注册一个RTDLL
  • 注册一个RTSS程序或者RTDLL开机运行

1. 运行一个RTSS程序

当使用RTSSrun运行一个RTSS进程时,它会扫描RTSS进程服务槽以获得一个空闲槽。如果成功,新进程的slot号就作为进程ID返回,否则返回-1。

命令行形式:RTSSRun [/q|/n|/l] filename.rtss

参数:

/q or /quiet - 关闭RTX进程加载成功或失败的消息提示。没有此选项时,如果RTSSrun失败,RTX会显示一个消息框。

/n or /nonpage - 如果local memory被默认使能,此开关将使RTSS程序向Windows非分页内存池(无论是否已经分配内存)请求内存,而不是使用RTX  local memory。

/l or /local - 如果local memory默认没有使能,此标志将使用RTSS程序向RTX Local Memory请求内存,而不是从Windows请求非分页内存。

例子:

下列命令将运行sample.rtss,使用从RTX local memory pool中申请的内存:

RTSSrun /l sample.rtss

下列命令将运行sample.rtss,使用从Windows非分页内存池中申请的内存:

RTSSrun /n sample.rtss

2. Register an RTDLL

一旦一个RTDLL被注册,它就能通过标准的MS LoadLibrary函数被任何RTSS进程加载。

当你注册RTDLL时,当前版本的.rtdll文件就被注册到了RTX子系统,因此,当你重建一个RTDLL时,你必须重新运行RTSSrun以能够访问新版本。

注意:RTDLL继承可以用也可以不用加载它的RTSS进程的本地内存(local memory)。

使用以下命令来注册一个RTDLL:RTSSrun [/q] /d [/s /t] filename.rtdll

参数:

/q or /quiet - 同1

/d or /dll - 注册一个RTDLL。此参数为必须有。

/s or /share - 此选项可以让一个RTDLL同时被几个进程调用。如果没有此参数,则只有一个进程的线程可以同时加载一个RTDLL;其他的就会加载失败。如果有此参数,只有一个RTDLL的实例被加载,故此时共享全局变量。

/t or /test - 注册RTDLL后进行测试加载或卸载。如果使用此参数,则必须和/d参数配合使用。

注意:要查看当前已注册的RTDLL或者注销一个RTDLL,请使用RTSSkill工具。

例子:

下面的命令注册sample.rtdll:

RTSSrun /d sample.rtdll

下面的命令注册sample.rtdll,并使之可以同时被几个进程同时加载:

RTSSrun /d /s sample.rtdll

3. 支持开机启动程序

在注册一个RTSS程序或RTSS DLL自动启动之前,RTX必须被配置为Automatic startup。在RTX Properties控制面板里的Settings 标签页可以进行此项配置。

如果一个程序被设为开机时启动,则此程序通常在RTX子系统启动之后、系统启动时的早期就启动。如果想移除一个程序开机自动启动,使用RTSSKill /b <process slot number>。

注册一个RTSS进程开机启动:RTSSrun [/q] /b filename.rtss

参数:

/q or /quiet:同1.

/b or /boot:Registers the RTSS process to run at boot time。

/n or /nonpage:同1.

/l or /local:同1.


RTSSkill

此工具可以用来:

  • 中止一个RTSS进程
  • 注销一个RTDLL
  • 查看RTSS进程和已注册的RTDLL

1. 中止一个RTSS进程

1.   找出一个RTSS程序的进程槽(slot):

  • 在命令行中输入RTSSkill
  • 找到进程ID(由RTSSRun返回),进程ID与进程槽一样。

2.  使用以下命令:

RTSSkill [/b] process_number

/b 可选参数,适用于是否开机自动启动的进程。

process_number 为RTSS程序加载后的对应进程槽号。

例子:

To terminate process in process slot 001, type:

RTSSkill 001

2. 注销一个RTDLL

不能注销一个正在被RTSS进程加载的RTDLL。这样做会使RTDLL处在不稳定的状态。

注销RTDLL命令:

RTSSkill filename.rtdll

提示:可以通过在命令终端输入RTLLKill来查看已经注册的RTDLL。


RTSSview(查看RTSS进程信息)

查看诸如事件,旗语和加载的RTDLL等信息。

命令:

rtssrun rtssview [/a]

/a or /all:Provides internal system processes and WIN32 proxy processes


RTSS Object Viewer

此工具可以观察当前RTX环境中所有活动的对象。


Measuring Timer Latencies

1. Measuring Timer Latencies

RTX运行时提供了SRTM这个实时的API定时器延迟测量工具,它可以测量一个程序观察到的时间延迟。一个SRTM直方图用不同方式显示了两个极点信息:第一个极点是接近于最好的情况,第二个极点为脏缓存(dirty-cache)情况。直方图还会时不时显示航天器级别中断masking的附加更小的尖峰。默认地,此工具产生15秒的声音并打印一个定时器响应延迟的直方图。可以使用此工具来测量RTSS延迟。

命令:

RTSSrun "c:\program files\Ardence\rtx\samples\srtm.rtss" [-h][-s][-1][f] seconds_to_sample

参数:

-h = 显示直方图 (in addition to summary).

-s = 打开声音 (由定时器驱动的方波).

-1 = 使用10 ms 定时器周期 (default is 1 ms).

-f = 使用能够使用的最快的定时器 (1 ms or better).

seconds_to_sample = 将测试的定时器延迟以秒为持续时间单位

2. Measuring HAL-Level Timer Latencies

KSRTM是一个测试HAL级别定时器延迟的驱动和Win32工具。短代码路径使之比SRTM对缓存紧张(cache jitter)少一些敏感。它可以确定对一个实时程序来说,是Windows操作系统组件还是设备驱动导致了最坏的延迟事件。

KSRTM测量定时器响应延迟并生成测试结果的报告和直方图。

This tool exercises the real-time HAL extension, and measures and reports timer response latencies against a synchronized clock. It can present a histogram of such latencies and report which kernel component was running when the longest latency event occurred. It can also provide a list of drivers.

KSRTM optionally measures the latencies associated with kernel (DPC-level) and multimedia (user-level) timers. It also allows the timer to drive the sound speaker (a 500-microsecond timer will generate a 1000 Hz square wave). Any timing jitter will produce an audible frequency wobble.

注意: KSRTM 只能运行在单处理器系统中。

To measure HAL-level timer latency, type the following at a command prompt:

rtssrun "c:\program files\Ardence\rtx\samples\ksrtm.rtss" [-r][-k][-m][-h][-n]
[-s][-i][-c][-d][-l][-u minutes] seconds_to_sample

参数:

-r = Real-time HAL extension timer (default).

-k = Kernel (DPC-level) timer.

-m = Multimedia (user-level) timer.

-h = Histogram of latencies (in addition to summary).

-n = No use of real-time priorities.

-s = Sound output (square wave driven by timer).

-i = IRQL HIGH stalls (test interrupt isolation).

-c = Cache flush/dirty and TLB shoot down stalls.

-d = Display loaded driver information.

-l = Longest latency event information.

-u minutes = Minutes between display updates.

seconds_to_sample = Duration in seconds to sample timer response latencies.


KSRTM 与SRTM的比较

KSRTM(Kernel System Response Time Measurement)和SRTM(System Response Time Measurement)都可以测量定时器延迟。

KSRTM能提供导致最坏延迟的源头的详细信息,它只测量到ISR开始的时间。SRTM能测量一个RTSS程序的定时器程序(timer handler),比如:一个全线程上下文的总时间;它提供对RTSS应用程序延迟更可信的测量。

在大多数基于奔腾系列处理器的系统上,由SRTM报告的RTX环境(srtm.rtss)最坏情况延迟范围在2-20ms之间,而由Win32环境的SRTM(srtm.exe)报告的此范围在30-100ms之间。


Timer Latency Display Tool

此工具由以下两部分组成:

  • 一个运行正常Windows任务的控制和显示程序
  • 一个RTSS程序,进行时间的测量

这两个任务通过共享内存来进行通讯。

RTSS任务类似于SRTM。主线程创建一个RTX定时器,并使之工作在可用的最快的计时速率上。然后线程进入一个循环中,不停检查共享内存中的一个中止请求标志位,并在测试间隔中进行睡眠处理。

定时器每次计时满时,RTSS调用定时器函数,此函数读取RTSS系统时钟,并计算出观察到的时间与请求的调度时间的差别。在共享内存中一个显示此差别的直方图被编译。RTSS任务还会把发现到的最短/最长延迟记录下来。

Posted in Embedded | Tagged , , | Leave a comment