关键词: RTX 共享内存 Shared Memory
RTX是运行在内核模式下(Ring 0), 直接与硬件交互,从而可以比Win32获得更精准和更快的时间间隔。
UI(User Interface)界面用来与人进行交互的,而这个UI是建立在Win32层面上的,即用户模式(Ring 3).
那么,RTX和UI是如何进行通讯的呢?RTX是用共享内存(Shared Memory)的方式来实现UI界面对RTSS程序的控制和获取其执行状态的。
同样,RTX程序内部各线程直接的通讯也是用Shared Memory来实现的,见下图:
由谁来创建Shared Memory,是UI程序还是RTX程序?
其实UI程序和RTX程序都可以的。
因为之前我博客里写的关于RS232通讯是以UI创建Shared Memory的, 这次我就以RTX程序创建Shared Memory 为例,两者其实是一样的,有兴趣,请看博客“RTX实时平台实现RS232通讯”里面关于如何使用Shared Memory代码。
链接: http://blog.csdn.net/hongxin7/archive/2010/05/18/5605855.aspx
第一步,创建UI和RTX项目,请参考我的资源 ” 如何在VC++ 6.0创建RTX项目”。
链接: http://download.csdn.net/source/2586313
第二步,框架出Shared Memory, 因为共享内存可能涉及到数据类型是不同的,一般情况下都会使用结构体来表示Shared Memory的框架,见源代码shm.h头文件。
第二步,在RTX项目里创建Shared Memory
if(!(hSHM = RtCreateSharedMemory( (DWORD)PAGE_READWRITE,
(DWORD)0,
(DWORD)(sizeof(SHAREDMEMORY)),
sharedmemory,
&location)))
hSHM: shared memory的识别句柄
参数1: 说明这段共享内存权限,只读PAGE_READONLY, 可读写PAGE_READWRITE
参数2: 共享内存的高32位
参数3: 共享内存的低32位
参数4: 指定Shared Memory对象的名字,这个很重要,在打开该Shared Memory时,需要用该名字来进行匹配。
参数5: 指定Shared Memory的虚拟地址,如下Shared Memory结构体指针pSHM获得该共享内存的地址
pSHM =(pSHAREDMEMORY)location;
一旦Shared Memory创建成功,就可以对该Shared Memory进行读写了。
pSHM->bStop = FALSE; //布尔赋值
pSHM->iTest = 24; //整形赋值
strcpy(pSHM->szBuffer, "taste"); //字符串赋值
第三步,在UI程序里打开Shared memory.
if((hsm = RtOpenSharedMemory(SHM_MAP_WRITE, FALSE, sharedmemory, (VOID **)&psm)) == NULL)
参数1: 权限 SHM_MAP_WRITE可读写
参数2: 忽略 FALSE
参数3: Shared Memory对象的名字,必须与创建Shared Memory一致。
参数4: 指定该Shared Memory地址
这样就可以啦。
实例界面如下
源代码地址: http://download.csdn.net/source/2590617
本文来自CSDN博客:http://blog.csdn.net/hongxin7/archive/2010/08/02/5782200.aspx