RT-Thread學習記錄12 郵箱的使用

以下爲看視頻筆記..........

1. 郵箱的工作機制

RT-Thread操作系統的郵箱用於線程間通信(郵箱具有數據交互功能,但互斥量、信號量等IPC沒有數據交互功能),特點是開銷比較低,效率較高。郵箱中的每一封郵件只能容納 固定的4字節內容  (針對32位處理系統,指針的大小即爲4個字節,所以一封郵件恰好能夠容納一個指針)。

線程或中斷服務例程把一封4 字節長度的郵件發送到郵箱中,而其他需要的線程可以從郵箱中接收這些郵件並進行處理。“
 

2. 郵箱控制塊



在RT-Thread中,郵箱控制塊是操作系統用於管理郵箱的-一個數據結構。
struct rt_ mailbox
{
    struct rt_ipc_object parent;/**< inherit from ipc_ object */

    rt_uint32_t        *msg_pool;/**< start address of message buffer */

    rt_uint16_t        size; /*< size of message pool */

    rt_uint16_t        entry;/**< index of messages in msg_ pool,郵件的數目 */

    rt_uint16_t        in_offset;/**< input offset of the message buffer */

    rt_uint16_t        out_offset;/**< output offset of the message buffer */
 
    rt_list_t          suspend_sender_thread; /**< sender thread suspended on this mailbox,若郵箱滿了,在發送郵件時線程就會掛起,記錄這個發送郵件的線程 */

};

typedef struct rt_ _mailbox *rt_ mailbox_ _t;

定義靜態郵箱: struct rt_mailbox     static_mb

定義動態郵箱: rt_mailbox_t           dynamic_mb
3.  郵箱的操作API

初始化與脫離

這組API用於靜態郵箱的操作

rt_err_t  rt_mb_init(rt_mailbox_t  mb,const  char *name,
                     void *msgpool,rt_size_t size,rt_uint8_t flag)
//調用這個函數,系統就會把郵箱加入到對象管理器中,第一個參數郵箱控制塊的指針,指明初始化那個郵箱,第二個參數給郵箱起一個名字,第三個參數是給郵箱配置一個緩衝區用來保存郵箱中的郵件,即把緩衝區的地址傳進來,第四個參數說明郵件能存多少個郵件(郵件是固定大小四個字節,若size是10,則郵箱大小爲40),會後一個參數可爲RT_IPC_FLAG_FIFO,RT_IPC_FLAG_PRIO,
若郵箱中沒有郵件時,線程等待的方式

rt_err_t  rt_mb_detach(rt_mailbox_t  mb)
//當不用郵箱時,從對象管理器中移除

創建與刪除

這組API用於動態郵箱的操作

rt_mailbox_t  rt_mb_create(const char *name,rt_size_t size,
                            rt_uint8_t  flag)
//動態創建郵箱的大小依據size參數,創建成功返回一個郵箱的指針,失敗返回0
rt_err_t  rt_mb_delete(rt_mailbox_t  mb)

發送郵件

rt_err_t  rt_mb_send(rt_mailbox_t  mb,rt_uint32_t  value)
//value參數就是發送郵件的內容,郵件發送的兩種方式:內容少於四個字節時可以傳郵件內容,當郵件內容大於四個字節時可以把郵件內容指針傳入(針對32bit處理器,一個指針四個字節)。
當郵箱已滿,則返回一個郵箱滿 的錯誤標誌。可以在中斷和線程中使用
rt_err_t  rt_mb_send_wait(rt_mailbox_t  mb,rt_uint32_t  value,rt_int32_t  timeout)
//與上一個發送函數多一個參數timeout,當郵箱已滿時,發送函數可以等待timeout的時間,注意不可以在中斷中使用

接受郵件

rt_err_t  rt_mb_recv(rt_mailbox_t  mb,rt_uint32_t  *value,rt_int32_t   timeout)

//value爲接受郵件的地址或內容的指針。若接受時郵箱是空的,等待時間爲timeout

4. 郵箱的示例示例使用

在mailbox_sample.c中

 這個程序會創建2個動態線程,一個靜態的郵箱對象,其中一個線程往郵箱中發送郵件, 一個線程往郵箱中收取郵件。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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