訊息佇列
在了解訊息佇列之前,先複習下資料結構的知識:佇列,插入和刪除受到限制的一種特殊線性表,只允許在後端進行插入操作,在前端進行刪除。
訊息佇列是rtt系統中常用的一種通訊結構,執行緒可以從佇列中讀取訊息,如果佇列中沒有訊息,則掛起執行緒。它是一種非同步通訊的方式。
由於佇列結構的特殊性,執行緒最先得到的訊息是最先進入訊息佇列的訊息,遵循先進先出的原則(fifo)。在rtt系統中,佇列可以傳遞不同長度的任意型別的訊息,並且擁有直接向佇列頭髮送訊息的緊急處理機制。訊息佇列最常見的用途就是進行執行緒間的資訊交換。
來看看它的實現,首先是rtt中的控制塊定義:
/*訊息佇列控制塊,在rtdef.h中定義
*/struct
rt_messagequeue
;typedef
struct rt_messagequeue *rt_mq_t;
從上到下依次為:
物件結構體
訊息池開始位址
訊息大小(位元組),最大訊息數目
記錄訊息個數的變數
表頭指標,表尾指標,空閒節點指標
傳送方執行緒掛起節點
/*建立函式,返回乙個訊息佇列控制代碼(rt_mq_t)
*/rt_mq_t rt_mq_create(
const
char *name, //
名字 rt_size_t msg_size, //
最大長度
rt_size_t max_msgs, //
最大容量
rt_uint8_t flag) //
模式,rtt中巨集定義了一些模式
/*刪除函式
*/rt_err_t rt_mq_delete(rt_mq_t mq)
//傳入控制代碼
/*傳送訊息函式
*/rt_err_t rt_mq_send(rt_mq_t mq,
const
void *buffer, rt_size_t size)
//傳入分別為控制代碼,資料位址,資料大小(位元組)
/*接收訊息函式
*/rt_err_t rt_mq_recv(rt_mq_t mq,
//控制代碼
void *buffer, //
讀取的位置
rt_size_t size, //
接收的長度
rt_int32_t timeout) //
等待時間
郵箱
郵箱是另一種常見的ipc通訊(程序間通訊)方式,相比於其他方式,其通訊內容被限制在每一封郵件只能容納4位元組的大小,換來的是其更低的開銷,更高的效率。
一封郵件恰好能容納stm32的乙個指標,這樣,可以把指向緩衝區的指標作為郵件傳送。(緩衝區:記憶體中預留的指定大小的空間,用來暫存輸入/輸出的資料)。也可以傳送結構體指標。
郵箱亦遵循先進先出原則(fifo)。
郵箱控制塊:
structrt_mailbox
;
/*建立函式
*/rt_mailbox_t rt_mb_create(
const
char *name, rt_size_t size, rt_uint8_t flag)
/*刪除函式
*/rt_err_t rt_mb_delete(rt_mailbox_t mb)
/*阻塞傳送,當郵箱滿時,可以進行等待
*/rt_err_t rt_mb_send_wait(rt_mailbox_t mb,
rt_ubase_t value,
rt_int32_t timeout)
/*非阻塞傳送,不會等待,如果滿會返回錯誤值
*/rt_err_t rt_mb_send(rt_mailbox_t mb, rt_ubase_t value)
/*接收
*/rt_err_t rt_mb_recv(rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout)
Rtthread學習筆記
rt sem init rt sem create rt sem take 等待 訊號量 rt sem release 放出 訊號量 rt sem detach 訊號量脫離2.互斥量 與訊號量不同的是,互斥量只能由持有執行緒釋放,其他執行緒不可釋放 取得互斥量的執行緒與高優先度的優先順序相同 rt ...
執行緒讓出實驗 RT Thread學習筆記 4
api rt thread yield 執行緒函式中呼叫,本執行緒釋放mcu。如果此時有別的相同優先順序的任務整處於等待狀態,將獲得mcu使用權。執行緒讓出就是給os增加乙個任務排程的機會。建立兩個執行緒,觀察他們的結果 執行緒讓出試驗 void yield test1 void parameter...
RT Thread學習筆記1 啟動順序與執行緒建立
目錄4.系統滴答時鐘 5.gpio驅動架構操作io 6.執行緒優先順序 時間片 7.鉤子函式 參考文獻 systeminit sub main rtthread startup main thread entry super main使用者主函式 自由分配的記憶體 堆 起始位址為ram的起始位址加上...