Zephyr 中 Mailbox 的使用

Mailbox 是啥?

一般,在操作系統中,線程之間是要相互通信的,最簡單的是叫做信號量,稍複雜一點的是 Mailbox。信號量用於通知對方一個簡單的狀態:可以通行或者不能通行,可以理解爲這個信號量就是紅綠燈,有紅燈和綠燈兩種狀態,紅燈表示你不能通行,綠燈表示你可以通行。用信號量時,一般是在信號量之外有約定,可以通行的情況下,是可以操作什麼資源,這個“可以操作什麼資源的信息”是沒有在信號量上有記錄的。Mailbox,中文翻譯是郵箱,除了接收方地址以外,還有信裏面的內容,傳遞了更多的信息。接收方發現郵箱中沒有待處理的信件,則等待或者去幹別的事情。發送方負責發送郵件,在發送前要確定接收方把所有郵件都處理完了。這裏特別注意,一個mailbox同時只能傳遞一封郵件(即一個消息),這裏不同於現實生活中的郵箱(現實生活中的郵箱可以塞很多郵箱,接收者可以累積多封郵件後一起處理,而zephyr中的mailbox則不同,發送方發送一個郵件後,只有等接收方處理完這個郵件後才能發送下一封郵件)。
 發送方有兩種方法來發送郵件:
 1)發送後,等待對方接收,在等待時不能幹其它事情,直到對方接收了這個消息後才繼續去幹活;
 2)發送後,立即去幹別的活,不管對方是否有接收完畢,但是,在發送下一封郵件前,要檢查接收方是否接收了,如果沒有接收,則不能發送。

接收方對郵件的處理也有兩種方法:
1)查看是否有收到郵件,如果有收到,同時就把郵件取出來去處理掉;
2)先查看,但是不去處理;待做了一些其它事情(也有可能沒有做其它事情)後再去把郵件取出並處理。

首先,需要先定義一個郵箱,讓發送方和接收方都知道這個郵箱:
用這個宏定義來定義郵箱: K_MBOX_DEFINE

其次,對郵箱做初始化:k_mbox_init()

發送方有兩個函數可用(分別對應“發送後等待”和“發送後不等待”):
k_mbox_put()
k_mbox_async_put()

接收方,統一用這個函數看郵箱:k_mbox_get()
如果在調用上面這個函數時,其中一個參數爲 NULL(用於存放接收的數據的地址空間),則先不處理消息,然後,再調用下面兩個函數之一來處理消息:
k_mbox_data_get()
k_mbox_data_block_get()

前者是普通的buffer機制,後者是 pool 機制。具體這兩者的區別,請參考 zephyr 的官方文檔。不屬於本次討論的範疇。

mailbox APIs (在 kernel.h中提供):

K_MBOX_DEFINE
k_mbox_init()
k_mbox_put()
k_mbox_async_put()
k_mbox_get()
k_mbox_data_get()
k_mbox_data_block_get()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章