RTThread學習筆記 執行緒間通訊學習(二)

2022-08-23 08:45:08 字數 2159 閱讀 8723

訊息佇列

在了解訊息佇列之前,先複習下資料結構的知識:佇列,插入和刪除受到限制的一種特殊線性表,只允許在後端進行插入操作,在前端進行刪除。

訊息佇列是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)。

郵箱控制塊:

struct

rt_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的起始位址加上...