RTX的编程接口.docx
《RTX的编程接口.docx》由会员分享,可在线阅读,更多相关《RTX的编程接口.docx(27页珍藏版)》请在冰豆网上搜索。
RTX的编程接口
体系架构
RTX的架构
RTX添加一个实时子系统,即所谓的RTSS,到Windows(参见上面的图)。
RTSS与其它Windows子系统是概念性相似(譬如Win32,POSIX,和DOS)因为它支持其自己的执行环境和API。
但在一个重要区域RTSS是不同的:
不是使用Windows调度程序,RTSS执行其自己实时线程调度。
此外,在单处理机环境里,所有RTSS线程调度在所有Windows调度之前发生,包括Windows管理的中断和延迟的过程调用(DPCs)。
实时进程间通信
RTSS也支持能被RTSS或Win32进程操纵的进程间通信对象(IPC)。
这使得在实时和非实时程序之间,简单标准的通信和同步成为可能。
最后,RTSS提供其它时间关键服务-譬如对RTSS进程实施时钟,定时器和中断管理。
HAL扩展名
RTX包括一个实时使能的硬件抽象层(HAL)扩展。
这个扩展在RTSS和Windows之间维护中断隔离。
Windows无法屏蔽(在中断控制级别)由RTSS管理的中断。
Windows中断在RTSS处理期间被屏蔽。
实时HAL扩展名支持关于RTSS的高分辨率时钟和定时器,当它和支持关于Windows的非实时钟和定时器。
其它实时HAL扩展名功能包括在RTSS和Windows之间的一个软件中断机制,基本的异常管理,和各种各样的改进都是为了确定性。
单处理机和多处理机系统
RTX支持单处理机和多重处理机都运行于Windows的系统。
RTX的运行时版本,它支持多重处理机系统,提供单处理机版本的所有功能,它利用英特尔MPS兼容的多重处理机系统,在Windows和RTX环境提供改善的性能。
运行RTX,为多重处理机系统,实施一个专用的处理器模型。
在这个模型中,RTSS运行在一个处理器,当其余的处理器继续运行在Windows系统。
多重处理机HAL在Windows起动次序期间获取最后逻辑处理器的控制。
它为RTSS保留。
RTSS程序可能被装载,然后被在专用处理器中执行。
关于Win32和RTSS进程的RTX应用程序编程接口,包括浮点单元(FPU)和结构化的异常处理,被单处理机和多重处理机系统使用。
这消除了为一个多处理机平台重新编码RTX(单处理机)应用软件的需要。
应用程序设计接口(API)
RTXAPI是基于Win32API的。
开发人员借鉴Win32经验,编码基础,和开发工具,和加速坚硬实时应用的开发。
Win32和RTSS进程支持全部的RTXAPI,但是,用不同的反应时间和性能特性-在开发环境之间允许开发人员共享或移动代码。
Win32和实时API
RTX支持一个子集Win32API功能,它提供一套特殊实时功能,通认作为RTAPI(实时API)。
RTAPI函数用"Rt"作为函数名的前缀。
某些RTAPI函数与Win32中与之对应的语义是相同的,但其他的是RTX(例如,没有相似的Win32调用)独有的。
例如,RTAPIIPC函数与Win32IPC函数的不同只在于他们运行的IPC命名空间和在决定性可能以实时IPC对象。
另一方面,Win32API不包括任何与中断管理有关的函数;因此,唯一中断管理函数被定义在RTAPI。
对RTXAPI的仔细的选择促进实时应用组件的高效率的开发。
RTX不包括Win32功能,譬如与GUI相关的调用,一般有时间要求不严格的应用程序组件使用。
实际上,Win32函数对于实时编程不是必需的,和不切实际执行确定性行为,不被包括在RTXAPI。
多数应用程序至少有两个进程一起工作-一个基于Win32的进程(利用GUI和其它Win32-only函数)和一个基于RTSS的进程执行时间严格的处理。
实时程序库
RTX支持各种各样的运行时库,并且提供基于MSVisualC++的'C'运行时库。
RTSS进程可能静态被链接包含这些库,只要他们不尝试链接到不受支持的Win32函数。
RTSS进程链接到专用版本的动态连接库(DLLs的),这些可能被使用模块化应用程序代码或提供实时软件环境的运行时定制。
Unicode
RTX支持Unicode应用程序。
RTSS进程可能使用wmain()函数和接受广义字符输入变量。
支持函数WCS系列,这些作为RTX支持的C运行时库一部分。
API
进程线程管理
进程和线程
一个进程包含一个地址空间,对象句柄,和一个或多个执行(线程)路径。
线程被用于响应中断和处理线程上下文中进程相关的异步事件。
RTSS和Win32的进程和线程只能进入他们自己的环境中的进程和线程。
1.RtGetThreadPriority
RtGetThreadPriority返回一个指定线程的优先权值。
2.RtSetThreadPriority
RtSetThreadPriority设置一个指定线程的优先权值。
系统内存管理
系统内存分配:
进程频繁地分配追加的内存去执行他们的操作。
RTX内存分配例行程序总是分配被锁定的内存。
1.RtAllocateLockedMemory
RtAllocateLockedMemory为避免内存使用时的分页错误,提交和锁定指定数量的内存。
2.RtFreeLockedMemory
RtFreeLockedMemory释放之前被RtAllocateLockedMemory提交和锁定的内存。
3.RtLockProcess
RtLockProcess将进程虚拟地址空间的某个部分锁定到物理内存。
4.RtUnlockProcess
RtUnlockProcess解锁锁定到物理内存的进程虚拟地址空间的那部分。
5.RtCommitLockProcessHeap
RtCommitLockProcessHeap提交和锁定系统进程堆去避免堆使用时的分页错误。
6.RtCommitLockHeap
RtCommitLockHeap提交和锁定堆去避免堆使用时的分页错误。
7.RtCommitLockStack
RtCommitLockStack提交和锁定指定栈去避免栈使用时的分页错误。
8.RtLockKernel
RtLockKernel锁定windows内核的虚拟地址空间的某个部分到物理内存。
9.RtUnLockKernel
RtUnLockKernel解锁之前被锁定到物理内存的windows内核的部分。
本地内存
本地内存是实现RTSS应用程序内存请求的一个RTX确定性分配的内存池。
从本地池分配内存RTSS应用程序不必为了请求Windows内存而去初始化一个服务请求中断(ServiceRequestInterrupt(SRI))。
当第一个RTSS应用程序开始并为一般非确定性函数提供确定性行为的时候,本地内存池将被创建。
1.RtAllocateLocalMemory
RtAllocateLocalMemory从先前分配的RTSS确定性内存池分配内存去避免SRI活动。
时钟和定时器
实时系统需要大量的操作系统时间服务请求。
操作系统必须维护一个精确次数的时间和时间表线程页的精确记账,挂起一个精确间隔的线程。
1.RtGetClockTime
RtGetClockTime获得指定时钟的当前值。
2.RtSetClockTime
RtSetClockTime设置一个指定时钟的当前值。
3.RtGetClockResolution
RtGetClockResolution获得一个指定时钟的resolution。
4.RtGetClockTimerPeriod
RtGetClockTimerPeriod获得一个指定时钟的最小定时器周期。
RtGetClockTime调用传送100ns的64位流量时间
5.RtGetRtssTimeAsFileTime
RtGetRtssTimeAsFileTime得到RTSS时间的当前值。
6.RtSetRtssTimeAsFileTime
RtSetRtssTimeAsFileTime设置RTSS时间的最新值
进程间通信
对象名字
它为进程共享对象句柄提供一种简易的方式。
由创建进程指定的名字受RTX_MAX_PATH字符限制,它包括除了反斜杠路径分隔符(\)以外的任何字符。
一旦进程创建了有名字的活动,互斥变量,信号量,或共享内存对象,其它进程可使用这个名字调用适当的功能(RtOpenEvent,RtOpenMutex,RtOpenSemaphore,或RtOpenSharedMemory)打开对象的句柄。
命名会区分大小写。
RtOpenEvent:
返回现有的命名事件对象的句柄
RtOpenMutex:
返回命名的RTSS互斥变量的句柄
RtOpenSemaphore:
返回现有的命名的信号量对象的句柄
RtOpenSharedMemory:
打开一个命名的物理映射的对象
RtCreateMutex:
创建一个RTSS互斥变量。
对这个新创建的互斥变量对象,返回一个句柄。
共享内存
RTSS共享内存对象是非页式物理内存区域,可以映射到进程的虚拟地址空间。
当一个共享内存对象有了名字,另外的进程可以进行内存映射。
通过句柄和虚拟地址来访问共享内存对象。
RtCreateSharedMemory:
创建一个物理内存的命名区域,它能映射到任何进程中去。
RtOpenSharedMemory:
打开一个命名的物理映射对象
信号量对象
RTSS信号量对象是一个同步对象,维护在零到指定最大值之间的计数。
每当线程完成一次信号量对象的等待,计数减一;当信号量释放时,记数增加可变数量。
当计数到达零,信号量对象的状态不再受信,并且直到一些线程数增加计数,其他线程数才完成对信号量对象的等待。
RtCreateSemaphore:
创建一个命名的或未命名的信号量对象
事件对象
事件对象是同步对象,其状态可通过调用RtSetEvent或RtPulseEvent明确地被设置为受信状态。
事件对象的二种类型是:
Manual-resetevent和Auto-resetevent
事件对象在给线程发信号,表明一个特殊事件发生了时相当有用。
RtSetEvent:
设置指定事件对象的状态为受信状态
RtPulseEvent:
提供单一的操作,来设置(信号化)指定事件对象,然后在释放适当数量的等待线程后,将事件重置(设置为无信号状态)。
RtResetEvent:
将指定事件对象的状态设置为无信号
RtWaitForSingleObject:
当下面的情况之一发生时,返回:
指定对象处于受信状态
超时时间间隔到期
RtCreateEvent:
创建一个命名的或未命名的事件对象
互斥对象:
RTSS互斥对象是一个同步对象,当它不属于任何线程时,它的状态时受信的;当互斥量被一个线程拥有时,它处于非受信状态。
互斥变量仲裁独占访问共享资源。
RtReleaseMutex:
放弃一个RTSS互斥量的所有权
设备管理
中断
RTX中断管理提供使能一个应用程序能够很好的满足中断请求从设备访问计算机。
RtAttachInterrupt允许用户使中断服务线程和中断服务请求跟基线或者基于消息的硬件中断关联。
RtAttachInterruptVectorEx允许用户使中断服务线程和中断服务请求跟共享的或者非共享的硬件中断关联。
RtAttachInterruptVector允许用户使在用户区句柄历程跟一个中断关联。
RtReleaseInterrupt通过使用RtAttachInterrupt发布一个先前附着的中断。
RtRe