风河虚拟化组件使用说明(17)—— 测试Shared Memory demo

参考User Guide文档"Shared Memory Features",目前支持Shared Memory特性的Windows系统只有Windows 10,VxWorks系统只有VxWorks 7。

首先确认GuestOS Windows 10是否安装Shared Memory驱动:

 检查vx_vsb工程,确认Shared Memory相关组件都已添加:

 编译vx_vsb工程,之后检查vx_vip工程,确认Shared Memory相关组件都已添加:

 编译vx_vip工程,重新添加进romfs文件系统。之后检查rootos_vsb工程,确认Shared Memory相关组件都已添加:

 编译rootos_vsb工程,检查rootos_vip工程的相关组件都已添加:

 拷贝Vxworks镜像至目标机,启动目标机。启动GuestOS VxWorks 7及GuestOS Windows 10,在hvconfig脚本下使用device list命令查看设备,确定RootOS拥有设备vmem0.0,vmem1.0,vmem2.0,vmem3.0:

 确定GuestOS VxWorks 7拥有设备vmem0.1,vmem4.0,GuestOS Windows 10拥有设备vmem1.1,vmem4.1:

 共享内存图示如下:

 下载并在主机安装Visual Studio 2017 (15.0),只有15.0以后的版本才能编译例程中的代码:

 找到例程的目录,包含源代码及VS工程:

 将编译好的ShmemServer.exe和ShmemClient.exe复制到目标机的win10系统上,注意最好在目标机上也装上Visual Studio 2017。

在RootOS,,GuestOS VxWorks 7运行vmemServer(),在GuestOS Windows 10运行ShmemServer.exe:

 在RootOS,GuestOS VxWorks 7运行vmemClient(),在GuestOS Windows 10运行ShmemClient.exe:

注意到Server函数有两个参数,分别表示是共享内存编号及传输一个Message占有的字节数;Client函数有三个参数,分别表示与Server函数对应的那一块共享内存编号、传输多少个Message、每个Message占有的字节数。

在三个操作系统上分别运行Server和Client函数后,可看到共享内存传递信息的相关数据,如Client接收到多少个Message,共传输多少字节,产生多少个中断,总耗时,数据速率。

例程完毕,再深入了解下这个例程。

RootOS及GuestOS VxWorks 7上的Shared Memory例程代码可以通过下列方式查找,在此以GuestOS VxWorks 7为例,RootOS同理。实际上,RootOS及GuestOS VxWorks 7的例程已经被打包成所谓的“层”,配置VIP工程时添加组件就是添加“层”。

 打开vx_vip的Kernel Configuration,找INCLUDE_HYPERVISOR_SHMEM_TESTS,在Synopsis栏下找到cdf文件:

 打开cdf文件后定位到usrHvShmemTests.c:

 之后在主机上搜索这个c文件:

 打开后发现实际调用了vmemTestInit():

 vmemTestInit()位于shmemTest.c中,该C文件路径是C:/WindRiver/ vxworks-7/ pkgs/os/hv/ guest-benchmarks-1.0.1.2/shmem/src/shmemTest.c:

 在此可以看出,Shared Memory例程的代码位于以下目录,其中h文件夹和src文件夹及Makefile用于编译适用于VxWorks (RootOS或GuestOS)的例程,Window文件夹中存有VS工程:

 在主机的 Windriver Workspace目录下搜索shmemTest,可发现在RootOS和GuestOS VxWorks 7的VSB工程目录下编译的shmemTest.o,实际在RootOS和GuestO VxWorks7下调用的vmemClient就是来自这个shmemTest.o,每次编译rootos_vip和vx_vip时,代码都会重新编译:

 对例程稍作修改,得到将GuestOS VxWorks 7作为Client,GuestOS Windows 10作为Server,VxWorks 7向Windows 10传递字符串的DEMO。

GuestOS VxWorks 7使用C:/WindRiver/ vxworks-7/ pkgs/os/hv/ guest-benchmarks-1.0.1.2 /shmem/src/shmemTest.c中的vmemClient()函数:

 GuestOS Windows 10使用下列路径中的vs解决方案:

  在GuestOS Windows 10中也安装好Visual Studio 2017后,打开ShmemServer.sln,添加调试参数:

 并对代码稍作修改,适当添加输出信息:

 在主机上修改vx_vsb工程用到的代码shmemTest.c。在GuestOS VxWorks 7和GuestOS Windows 10两端的代码中加上 puts(buffer + sizeof(UINT32));  打印出在操作系统间传递的字符串(例程中是msg0.msg1.msg2...):

 在主机上重新编译vx_vsb,vx_vip,重新添加vx_vip镜像进入romfs,重新编译rootos_vip,将镜像拷贝至目标机,重新启动目标机,进入GuestOS VxWorks 7和GuestOS Windows 10。

先运行Server(Server的参数通过vs的调试选项配置,vmemServer()参数为1 32,两个参数间通过空格隔开),再运行Client(Client的参数通过GuestOS VxWorks 7的C Shell配置,vmemClient 1,100,32),可看到在GuestOS之间传递的字符串:

 Server和Client之间通过共享内存传递信息的代码流程如下:

Server   /*Generate the device name 把共享内存块当成一个设备*/

            /*Open a handle to the shared memory device */

            /*Create the event used to signal interrupts*/

            /*Tell the driver to use this event to signal interrupts*/

            /*Determine shared memory size*/

            /*Calculate max number of messages shared memory area will hold*/

            /*Wait for the message*/

Client     /*Confirm buffer size*/

             /*Allocate temporary buffers*/

             /*Create the semaphore used to signal interrupts*/

              /*Open the shared memory device*/

              /*Connect the interrupt handler*/

              /*Determine shared memory size*/

              /*Calculate max number of messages shared memory area will hold*/

             /*Generate the outgoing message and send it*/

              /*Wait for the reply message*/

Server   /*Read the message*/

Server   /*Generate reply message and send it*/

Client    /*Read the reply message*/

           /*Validate the reply message*/

          /*Calculate performance*/    

猜你喜欢

转载自blog.csdn.net/wofreeo/article/details/83714170