zephyr筆記 2 5 4 訊息佇列

2021-08-19 15:32:49 字數 2087 閱讀 5478

訊息佇列是實現簡單訊息佇列的核心物件,允許執行緒和isr非同步傳送和接收固定大小的資料項。

我正在學習 zephyr,乙個很可能會用到很多物聯網裝置上的作業系統,如果你也感興趣,可點此檢視帖子zephyr學習筆記彙總。

可以定義任何數量的訊息佇列。 每個訊息佇列都由其記憶體位址引用。

訊息佇列具有以下關鍵屬性:

訊息佇列的環形緩衝區必須與n位元組邊界對齊,其中n是2的冪(即1,2,4,8,…)。為確保儲存在環形緩衝區中的訊息與此邊界相似,資料項大小必須也是n的倍數。

訊息佇列在被使用之前必須被初始化。這將其環形緩衝區設定為空。

資料項可以由執行緒或isr傳送到訊息佇列。傳送執行緒指向的資料項被複製到乙個等待執行緒(如果存在的話);否則如果空間可用,則將專案複製到訊息佇列的環形緩衝區中。在任何一種情況下,傳送的資料區域的大小必須等於訊息佇列的資料項大小。

如果執行緒在環形緩衝區已滿時嘗試傳送資料項,傳送執行緒可能會選擇等待空間變為可用。當環形緩衝區已滿時,任意數量的傳送執行緒可能會同時等待;當空間變得可用時,它被賦予等待時間最長的最高優先順序傳送執行緒。

資料項可以由執行緒從訊息佇列接收。資料項被複製到接收執行緒指定的區域;接收區域的大小必須等於訊息佇列的資料項大小。

如果執行緒嘗試在環形緩衝區為空時接收資料項,接收執行緒可能會選擇等待傳送資料項。當環形緩衝區為空時,任意數量的接收執行緒可能會同時等待;當資料項變得可用時,它被賦予等待時間最長的最高優先順序接收執行緒。

注意:核心確實允許isr從訊息佇列接收專案,但是如果訊息隊列為空,則isr不能嘗試等待。
訊息佇列使用 struct k_msgq 型別的變數來定義。它必須通過呼叫k_msgq_init() 來初始化。

以下**定義並初始化乙個空的訊息佇列,該訊息佇列能夠儲存10個專案,每個專案的長度為12個位元組。

struct data_item_type ;

char __aligned(4) my_msgq_buffer[10 * sizeof(data_item_type)];

struct k_msgq my_msgq;

k_msgq_init(&my_msgq, my_msgq_buffer, sizeof(data_item_type), 10);

或者,可以通過呼叫 k_msgq_define 在編譯時定義和初始化訊息佇列。

以下**與上面的**段具有相同的效果。觀察巨集定義了訊息佇列及其緩衝區。

k_msgq_define(my_msgq, sizeof(data_item_type), 10, 4);
通過呼叫 k_msgq_put() 將資料項新增到訊息佇列中。

以下**構建在上述示例上,並使用訊息佇列將資料項從生成執行緒傳遞到乙個或多個消費執行緒。 如果訊息佇列由於消費者無法跟上而填滿,則生成執行緒會拋棄所有現有資料,以便儲存新資料。

void producer_thread(void)

/* data item was successfully added to message queue */}}

通過呼叫 k_msgq_get() 從資料佇列中獲取資料項。

以下**構建在上述示例上,並使用訊息佇列處理由乙個或多個生成執行緒生成的資料項。

void consumer_thread(void)

}

如果需要,可以使用訊息佇列來傳輸大資料項。但是,這會增加中斷延遲,因為在寫入或讀取資料項時中斷被鎖定。 通常通過交換指向資料項的指標而不是資料項本身來傳送大資料項。核心的記憶體對映和記憶體池物件型別可以有助於此類資料傳輸。

通過使用核心的郵箱物件型別可以實現同步傳輸。

下列訊息佇列api,都在 kernel.h 中提供了:

k_msgq_define

k_msgq_init

()k_msgq_put

()k_msgq_get

()k_msgq_purge

()k_msgq_num_used_get

()k_msgq_num_free_get

()

zephyr學習筆記 前言

一直在找適合用於教學嵌入式作業系統。在我心目中,適合用於教學的作業系統應具備如下特點 contiki是非實時作業系統,實時作業系統中的那些機制它幾乎都沒有,用於教學的確是不合適。當初學contiki主要原因是它實現了6lowpan,也是在為將來學華為liteos作準備。之後學ti rtos也是因為大...

訊息佇列 訊息佇列

輪詢排程 一次性分發所有訊息,保證訊息平均分配,不管消費者是否能正常消費 訊息應答 保證消費端能確實消費,不丟失 公平 乙個乙個分發所有訊息,在保證分發到的執行緒確認回覆後,才分發下個訊息給下個空閒的消費者,訊息持久化 保證佇列中的訊息不丟失,包括3要素 交換器 訊息佇列 訊息都必須宣告持久化 發布...

zephyr筆記 2 1 4 系統執行緒

我正在學習 zephyr,乙個很可能會用到很多物聯網裝置上的作業系統,如果你也感興趣,可點此檢視帖子zephyr學習筆記彙總。系統執行緒是核心在系統初始化時自動產生的執行緒。核心產生以下系統執行緒。該執行緒執行核心初始化,然後呼叫應用程式的 main 函式 如果已定義 預設情況下,主線程使用最高配置...