1. 程式人生 > >風河虛擬化元件使用說明(17)—— 測試Shared Memory demo

風河虛擬化元件使用說明(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*/