天天看點

Nucleus程序間通信(IPC)方式

實時作業系統Nucleus Plus提供了6種程序間通信方式。分别為:郵箱(mailboxes)、消息隊列(queues)和管道(pipes)、信号量(semaphores)、事件集(event groups)和消息(signals)。前三者用于程序間通信,後三者用于程序同步。本文總結了Nucleus Plus程序間通信方式。

i,首先說明Nucleus程序間通信的兩個基本概念。

消息(message):由一個或多個位元組(byte)或者字(32-bit word,4bytes)組成的資訊單元,可在不同程序間傳遞少量的資訊。郵箱(mailboxes)、消息隊列(queues)和管道(pipes)通信的構成單元是message。

事件(event)或者信号(signal):一個32-bit word中的每一位bit代表一個信号或者事件,僅僅能用于不同程序間通知某情況出現,不能攜帶額外的資訊。

當中一個32-bit word稱為一個事件組。這是事件集(event groups)和消息(signals)的構成單元。

ii,郵箱(mailboxes)、消息隊列(queues)和管道(pipes)

<col>

郵箱(mailboxes)

消息隊列(queues)

管道(pipes)

消息構成

4個32位字

單一消息

一個或多個32位字

多個消息

一個或多個位元組

任務挂起/喚醒

FIFO/程序優先級

廣播/多任務支援

支援

動态建立

數量限制

Note:

1,數量限制指的是一個任務所使用的郵箱、消息隊列或者管道的數量是否受限。

2,FIFO挂起/喚醒:當能夠滿足任務要求時,任務喚醒的順序依照先進先出進行。

3,任務優先級挂起/喚醒:依照被挂起任務的優先級順序進行喚醒,高優先級優先喚醒。

4,任務挂起/喚醒模式在郵箱、消息隊列或者管道被建立時确定。

iii,事件集(event groups)和消息(signals)

信号和事件以及後面介紹的信号量用來解決任務間的同步問題。

信号signal:

異步方式執行,任務提前指定信号處理子程式,每一個任務能夠處理32個信号。每一個信号對應32-bit字的一個位。

任務建立時預設信号是disable的,可通過設定信号屏障字的對應位來決定某信号是否使能。屏障字某位設為1表示使能該信号。信号僅僅能是一個程序去通知還有一個程序,即不支援廣播。

當信号出現。任務中斷而且調用信号處理程式,信号被處理後自己主動清除。

信号處理子程式不能被新信号中斷。不論什麼新信号的處理在目前信号處理完畢後進行。在第一個信号被驗證之前再次發送的相同的信号将被丢棄棄。

project開發中常結合信号和記憶體隊列來實作程序間的資料通信。一個簡單的樣例,程序A将資料寫入一段記憶體、産生一個對應的全局變量控制結構體。而後通過signal通知程序B去讀取;程序B收到signal後依據全局變量控制結構體到對應的記憶體中将該資料讀取處理。

事件event:

同步方式執行,是用于警告某一特定的系統事件已經發生的機制。每一個32-bit字成為一個事件集,當中的每一位稱作事件标志event flag。event flags的設定set和清除clear以及讀取receive能夠通過邏輯與/或進行。

另外。event flag被讀取received後可自己主動重置。

應用程式可能擁有的事件集沒有預先的設定。除非主動通過特定的服務申請。任務并不能知道某事件是否已經發生了。(The task does not recognize event flags are present until the specific service request is made.)

比如。一個事件組的32位event flag配置設定為:5位用于消息隊列事件、24位用于标示信号事件。其餘3位用于識别事件類型(是消息隊列、信号還是逾時)。示範樣例代碼例如以下(NU_EventWait函數封裝了Nucleus PLUS 事件組函數):

Nucleus程式間通信(IPC)方式

iv,最後是一種特殊的任務間同步手段--信号量(semaphores)

信号量(semaphore):是一種資料操作鎖。它本身不具有資料交換的功能,而是通過控制其它的通信資源(檔案,外部裝置)來實作程序間通信,它本身僅僅是一種外部資源的辨別。當程序不再使用一個信号量控制的共享資源時,信号量的值+1,對信号量的值進行的增減操作均為原子操作,這是因為信号量基本的作用是維護資源的互相排斥或多程序的同步訪問。

繼續閱讀