RTX基礎之共享記憶體 Shared Memory

2021-05-23 21:37:15 字數 1603 閱讀 1315

rtx是執行在核心模式下(ring 0), 直接與硬體互動,從而可以比win32獲得更精準和更快的時間間隔。

ui(user inte***ce)介面用來與人進行互動的,而這個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**。

第一步,建立ui和rtx專案,請參考我的資源 」 如何在vc++ 6.0建立rtx專案」。

第二步,框架出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位址

這樣就可以啦。

例項介面如下

Linux XSI IPC 之共享記憶體

共享記憶體基礎知識01 共享記憶體基礎知識02 注意 如果在 中沒有手動刪除,共享記憶體並不會隨著程式的終止而自動清理!其中 第一列就是共享記憶體的key 第二列是共享記憶體的編號shmid 第三列就是建立的使用者owner 第四列就是許可權perms 第五列為建立的大小bytes 第六列為連線到共...

Linux IPC之共享記憶體

程序都有自己的虛擬位址空間 每個程序的虛擬位址空間都不一樣 自己只能操作自己的位址空間 虛擬位址空間 這時如何實現程序間的資料交換,這裡核心給我們提供了介面,讓多個程序共同操作同塊特殊的記憶體區域,這就實現了資料交換 共享記憶體區域是被多個程序共享的一部分物理記憶體。如果多個程序都把該記憶體區域對映...

IPC之共享記憶體

標頭檔案 sys shm.h ipcs m 檢視共享記憶體狀況 1 共享記憶體的建立 shmget 函式 同一段記憶體被不同程序共享 但是共享記憶體並不提供同步機制 需要訊號量等加以輔助 int shmget key t key,size t size,int shm key ipc private...