0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RT-Thread記錄(七、IPC機(jī)制之郵箱、消息隊(duì)列)

矜辰所致 ? 來源:矜辰所致 ? 作者:矜辰所致 ? 2022-06-22 10:06 ? 次閱讀
講完了線程同步的機(jī)制,我們要開始線程通訊的學(xué)習(xí),
線程通訊中的郵箱消息隊(duì)列也屬于 RT-Thread 的IPC機(jī)制。

目錄

前言
一、郵箱
1.1 郵箱控制塊
1.2 郵箱操作
1.2.1 創(chuàng)建和刪除
1.2.2 初始化和脫離
1.2.3 發(fā)送郵件
1.2.4 接收郵件
1.3 示例(指針傳遞)
1.3.1 郵箱消息傳遞
1.3.2 郵箱個數(shù)示例
二、消息隊(duì)列
2.1 消息隊(duì)列控制塊
2.2 消息隊(duì)列操作
2.2.1 創(chuàng)建和刪除
2.2.2 初始化和脫離
2.2.3 發(fā)送消息
2.2.4 接收消息
2.3 消息隊(duì)列原理簡析
2.4 示例(消息隊(duì)列原理理解)
2.4.1 理解消息隊(duì)列原理
2.4.2 消息傳遞
結(jié)語

前言

與上篇文章的介紹的信號量、互斥量和事件集,郵箱、消息隊(duì)列同樣為 RT-Thread IPC機(jī)制。但是信號量它們屬于線程同步機(jī)制,并不能在線程之間傳遞消息,我們本文介紹的 郵箱、消息隊(duì)列就是實(shí)現(xiàn)線程間消息傳遞的機(jī)制。

相對于上一篇文章的內(nèi)容,線程通訊的學(xué)習(xí)會相對復(fù)雜些,因?yàn)樯婕暗较⒌膫鬟f,消息在實(shí)際項(xiàng)目中的可能存在多種不同的情況,所以 郵箱和消息隊(duì)列的使用場景和方式是關(guān)鍵,尤其是消息隊(duì)列?;旧蠈?shí)際項(xiàng)目中的所有消息類型都可以使用消息隊(duì)列的方式。消息隊(duì)列應(yīng)用于串口通信我會單獨(dú)用一篇博文來說明,本文先做基礎(chǔ)介紹和基本示例的講解。

本 RT-Thread 專欄記錄的開發(fā)環(huán)境:
RT-Thread記錄(一、RT-Thread 版本、RT-Thread Studio開發(fā)環(huán)境 及 配合CubeMX開發(fā)快速上手)
RT-Thread記錄(二、RT-Thread內(nèi)核啟動流程 — 啟動文件和源碼分析
RT-Thread 內(nèi)核篇系列博文鏈接:
RT-Thread記錄(三、RT-Thread 線程操作函數(shù)及線程管理與FreeRTOS的比較)
RT-Thread記錄(四、RT-Thread 時(shí)鐘節(jié)拍和軟件定時(shí)器
RT-Thread記錄(五、RT-Thread 臨界區(qū)保護(hù))
RT-Thread記錄(六、IPC機(jī)制之信號量、互斥量和事件集)

一、郵箱

RT-Thread 中的郵件是線程、中斷服務(wù)、定時(shí)器向線程發(fā)送消息的有效手段(中斷和定時(shí)器需要非阻塞方式,不能等待發(fā)送,也不能接收)。

郵箱中的每一封郵件只能容納固定的 4 字節(jié)內(nèi)容(32位內(nèi)核正好可以傳遞一個指針)。

郵箱特點(diǎn) RAM空間占用少,效率較高。

RT-Thread 有點(diǎn)類似 FreeRTOS 的任務(wù)通知,同樣的只能傳遞4個字節(jié)內(nèi)容。
但是 FreeRTOS 的任務(wù)通知是屬于任務(wù)自己的,每個任務(wù)有且只有一個通知,
而 RT-Thread 的郵箱由郵箱控制塊統(tǒng)一管理,新建一個郵箱,可以包含多封郵件(每封4個字節(jié))。

1.1 郵箱控制塊

老規(guī)矩用源碼,解釋看注釋(使用起來也方便復(fù)制 ~ ~!)

#ifdef RT_USING_MAILBOX
/**
 * mailbox structure
 */
struct rt_mailbox
{
    struct rt_ipc_object parent;             /**< inherit from ipc_object */
    rt_ubase_t          *msg_pool;           /**< 郵箱緩沖區(qū)的開始地址  */
    rt_uint16_t          size;               /**< 郵箱緩沖區(qū)的大小      */
    rt_uint16_t          entry;              /**< 郵箱中郵件的數(shù)目 */
    rt_uint16_t          in_offset;          /**< 郵箱緩沖的入口指針 */
    rt_uint16_t          out_offset;         /**< 郵箱緩沖的出口指針 */
    rt_list_t            suspend_sender_thread;   /**< 發(fā)送線程的掛起等待隊(duì)列 */
};
typedef struct rt_mailbox *rt_mailbox_t;
#endif

1.2 郵箱操作

1.2.1 創(chuàng)建和刪除

同以前的線程那些一樣,動態(tài)的方式,先定義一個郵箱結(jié)構(gòu)體的指針變量,接收創(chuàng)建好的句柄。

創(chuàng)建郵箱:

/**
參數(shù)的含義:
1、name 		郵箱名稱
2、size			郵箱容量(就是多少封郵件,4的倍數(shù))
3、flag 		郵箱標(biāo)志,它可以取如下數(shù)值: RT_IPC_FLAG_FIFO 或 RT_IPC_FLAG_PRIO
返回值:
RT_NULL 		創(chuàng)建失敗
郵箱對象的句柄 	創(chuàng)建成功 
 */
rt_mailbox_t rt_mb_create(const char *name, rt_size_t size, rt_uint8_t flag)

最后的 flag 和信號量一樣建議 RT_IPC_FLAG_PRIO

pYYBAGKyeReAI15XAABhZnlz4fA191.png

刪除郵箱:

/**
參數(shù)的含義:
mb 	郵箱對象的句柄
返回
RT_EOK 	成功
 */
rt_err_t rt_mb_delete(rt_mailbox_t mb)

1.2.2 初始化和脫離

靜態(tài)的方式,先定義一個郵箱結(jié)構(gòu)體,然后對他進(jìn)行初始化。

這里要注意,還要定義一個數(shù)組,用來做郵箱的內(nèi)存空間,和靜態(tài)初始化線程一樣。

初始化郵箱:

/**
參數(shù)含義:
1、mb	 	郵箱對象的句柄,需要取自定義的結(jié)構(gòu)體地址
2、name	 	郵箱名稱
3、msgpool 	緩沖區(qū)指針(用戶自定義的數(shù)組的地址,第一個數(shù)組元素的地址)
4、size 	郵箱容量(就是數(shù)組的大小/4)
5、flag 	郵箱標(biāo)志,它可以取如下數(shù)值: RT_IPC_FLAG_FIFO 或 RT_IPC_FLAG_PRIO
返回
RT_EOK 	成功
 */
rt_err_t rt_mb_init(rt_mailbox_t mb,
                    const char  *name,
                    void        *msgpool,
                    rt_size_t    size,
                    rt_uint8_t   flag)

脫離郵箱:

/**
參數(shù)的含義:
mb 	郵箱對象的句柄
返回
RT_EOK 	成功
 */
rt_err_t rt_mb_detach(rt_mailbox_t mb)

1.2.3 發(fā)送郵件

在 RT-Thread 中發(fā)送郵件分為 有無等待方式發(fā)送郵件,以及發(fā)送緊急郵件。

在我建的工程版本中,并沒有發(fā)送緊急郵件函數(shù)了,這里按照工程源碼來說明,就不介紹發(fā)送緊急郵件的函數(shù)了,在一般的 STM32 應(yīng)用中,個人認(rèn)為緊急郵件有沒有都沒有影響!

無等待方式適用于所有的線程和中斷,等待方式不能用于中斷中!

無等待發(fā)送郵件:

/**
參數(shù):
1、mb	 	郵箱對象的句柄
2、value 	郵件內(nèi)容
返回
RT_EOK 		發(fā)送成功
-RT_EFULL 	郵箱已經(jīng)滿了
看函數(shù)原型,其實(shí)就是把等待方式發(fā)送的時(shí)間改成了0
 */
rt_err_t rt_mb_send(rt_mailbox_t mb, rt_ubase_t value)
{
    return rt_mb_send_wait(mb, value, 0);
}

無等待發(fā)送其實(shí)就是使用等待方式發(fā)送郵件,等待時(shí)間為0。

等待方式發(fā)送郵件:

/**
參數(shù):
1、mb 		郵箱對象的句柄
2、value 	郵件內(nèi)容
3、timeout 	超時(shí)時(shí)間
返回:
RT_EOK 			發(fā)送成功
-RT_ETIMEOUT 	超時(shí)
-RT_ERROR 		失敗,返回錯誤
 */
rt_err_t rt_mb_send_wait(rt_mailbox_t mb,
                         rt_ubase_t   value,
                         rt_int32_t   timeout)

1.2.4 接收郵件

接收郵件時(shí),除了指定接收郵件的郵箱句柄,并指定接收到的郵件存放位置(需要有一個變量來保存接收到的數(shù)據(jù))。

/**
參數(shù)含義:
1、mb 		郵箱對象的句柄,從哪個郵件控制塊取郵件
2、value 	郵件內(nèi)容,需要用一個變量保存
3、timeout 	超時(shí)時(shí)間
返回值:
RT_EOK 	接收成功
-RT_ETIMEOUT 	超時(shí)
-RT_ERROR 	失敗,返回錯誤
 */
rt_err_t rt_mb_recv(rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout)

1.3 示例(指針傳遞)

2個示例,第一個是正常的消息傳遞,第二個是與郵箱創(chuàng)建個數(shù)有關(guān)的引導(dǎo)示例。

1.3.1 郵箱消息傳遞

前面說到過,郵箱中的每一封郵件只能容納固定的 4 字節(jié)內(nèi)容,但是4字節(jié)可以傳遞指針,我們分別做個簡單的演示。

示例中,我們使用兩個不同的按鍵來發(fā)送郵件,通過一個事件來接收郵件,并打印收到的郵件內(nèi)容。

按鍵key3,發(fā)送4字節(jié)的內(nèi)容,按鍵Key2,發(fā)送一個字符串指針:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

郵件創(chuàng)建:

pYYBAGKyeRiAJ8cRAAAd5J9ja8E495.png

在接收線程中,我們打印出接收到的數(shù)值:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

測試結(jié)果,兩個按鍵按下,線程不僅能收到直接傳過來的4字節(jié)數(shù)據(jù),還能通過傳遞的指針發(fā)送一個字符串:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_13,color_FFFFFF,t_70,g_se,x_16

1.3.2 郵箱個數(shù)示例

在上面的例子中,我們開始創(chuàng)建的郵箱大小就一個,我們測試下,如果沒有線程接收,是不是就會打印郵箱滿的消息,我們把線程接收郵箱代碼注釋掉,其他還是和前面測試一樣:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

我們再來改一下,使用一個按鍵測試一下這個 size 是字節(jié)呢,還是直接是郵件個數(shù),直接看圖說明:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

在靜態(tài)初始化郵件時(shí)候,我們需要注意我們開辟的空間大小,需要是4的倍數(shù),我們一般都是用數(shù)組除以4直接表示郵箱的size大小,如下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_13,color_FFFFFF,t_70,g_se,x_16

RT-Thread 是通過控制塊來管理這些IPC機(jī)制,在實(shí)際測試中,為了加深對某個對象的理解,比如這里的郵箱,可以直接打印出郵箱的參數(shù)來查看當(dāng)前郵箱的狀態(tài)。學(xué)會測試?。?!

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

二、消息隊(duì)列

消息隊(duì)列能夠接收來自線程或中斷服務(wù)例程中不固定長度的消息,并把消息緩存在自己的內(nèi)存空間中。

消息隊(duì)列和郵箱的區(qū)別是長度并不限定在 4 個字節(jié)以內(nèi),但是如果如果把消息隊(duì)列的每條消息的最大字節(jié)規(guī)定在4個字節(jié)以內(nèi),那么消息隊(duì)列就和郵箱一樣了。

典型應(yīng)用,使用串口接收不定長數(shù)據(jù)(后期會單獨(dú)有博文介紹消息隊(duì)列在串口接收上的應(yīng)用)。

2.1 消息隊(duì)列控制塊

消息隊(duì)列控制塊的這些屬性,我們等會用示例來打印出來看,加深一下對這些屬性的認(rèn)識。

#ifdef RT_USING_MESSAGEQUEUE
/**
 * message queue structure
 */
struct rt_messagequeue
{
    struct rt_ipc_object parent;                        /**< inherit from ipc_object */

    void                *msg_pool;                      /**< 消息隊(duì)列的開始地址 */

    rt_uint16_t          msg_size;                      /**< 每個消息長度 */
    rt_uint16_t          max_msgs;                      /**< 最大的消息數(shù)量 */

    rt_uint16_t          entry;                         /**< 已經(jīng)有的消息數(shù) */

    void                *msg_queue_head;                /**< list head 鏈表頭 */
    void                *msg_queue_tail;                /**< list tail 鏈表尾*/
    void                *msg_queue_free;                /**< 空閑消息鏈表 */

    rt_list_t            suspend_sender_thread;         /**< 掛起的發(fā)送線程 */
};
typedef struct rt_messagequeue *rt_mq_t;
#endif

2.2 消息隊(duì)列操作

2.2.1 創(chuàng)建和刪除

先定義一個郵箱結(jié)構(gòu)體的指針變量,接收創(chuàng)建好的句柄。

創(chuàng)建消息隊(duì)列:

/**
參數(shù):
1、name 		消息隊(duì)列的名稱
2、msg_size 	消息隊(duì)列中一條消息的最大長度,單位字節(jié)
3、max_msgs 	消息隊(duì)列的最大個數(shù)
4、flag 		消息隊(duì)列采用的等待方式,它可以取如下數(shù)值: RT_IPC_FLAG_FIFO 或 RT_IPC_FLAG_PRIO
返回:
RT_EOK 				發(fā)送成功
消息隊(duì)列對象的句柄 	成功
RT_NULL 			失敗
 */
rt_mq_t rt_mq_create(const char *name,
                     rt_size_t   msg_size,
                     rt_size_t   max_msgs,
                     rt_uint8_t  flag)

注意!msg_size 單位是字節(jié),在32位系統(tǒng)中 RT-Thread 默認(rèn)#define RT_ALIGN_SIZE 4 ,所以如果 msg_size 不是4字節(jié)對齊,系統(tǒng)會自動補(bǔ)全。

比如用戶定義為9,那么系統(tǒng)會自動把消息隊(duì)列大小設(shè)置為 12,定義為1,設(shè)置為4。

還有flag的使用,依然得注意一下,和郵箱信號量等一樣,注意實(shí)時(shí)性問題。

刪除消息隊(duì)列:

/**
參數(shù)
mq 		消息隊(duì)列對象的句柄
返回
RT_EOK 	成功
 */
rt_err_t rt_mq_delete(rt_mq_t mq)

2.2.2 初始化和脫離

靜態(tài)的方式,先定義一個消息隊(duì)列結(jié)構(gòu)體,然后對他進(jìn)行初始化。

初始化消息隊(duì)列:

/**
參數(shù):
1、mq 			消息隊(duì)列對象的句柄,需要取自定義的結(jié)構(gòu)體地址
2、name 		名稱
3、msgpool 		存放消息的地址
4、msg_size 	消息隊(duì)列中一條消息的最大長度,單位字節(jié)
5、pool_size 	存放消息的緩沖區(qū)大小
6、flag 		消息隊(duì)列采用的等待方式,
返回:
RT_EOK 	成功
 */
rt_err_t rt_mq_init(rt_mq_t     mq,
                    const char *name,
                    void       *msgpool,
                    rt_size_t   msg_size,
                    rt_size_t   pool_size,
                    rt_uint8_t  flag)

脫離消息隊(duì)列:

/**
參數(shù):
mq 		消息隊(duì)列對象的句柄
返回:
RT_EOK 	成功
 */
rt_err_t rt_mq_detach(rt_mq_t mq)

2.2.3 發(fā)送消息

和郵件一樣,在 RT-Thread 中發(fā)送郵件分為 有無等待方式發(fā)送,以及緊急消息發(fā)送。

無等待方式適用于所有的線程和中斷,等待方式不能用于中斷中!

無等待發(fā)送消息:

/**
看函數(shù)原型,其實(shí)就是把等待方式發(fā)送的時(shí)間改成了0
參數(shù):
1、mq 		消息隊(duì)列對象的句柄
2、buffer 	消息內(nèi)容
3、size 	消息大小
返回:
RT_EOK 		成功
-RT_EFULL 	消息隊(duì)列已滿
-RT_ERROR 	失敗,表示發(fā)送的消息長度大于消息隊(duì)列中消息的最大長度
 */
rt_err_t rt_mq_send(rt_mq_t mq, const void *buffer, rt_size_t size)
{
    return rt_mq_send_wait(mq, buffer, size, 0);
}

等待方式發(fā)送郵件:

/**
除了最后多一個時(shí)間,其他參數(shù),和上面無等待方式一樣
timeout 	超時(shí)時(shí)間(時(shí)鐘節(jié)拍)
*/
rt_err_t rt_mq_send_wait(rt_mq_t     mq,
                         const void *buffer,
                         rt_size_t   size,
                         rt_int32_t  timeout)

發(fā)送緊急消息:

/**
參數(shù):
1、mq 		消息隊(duì)列對象的句柄
2、buffer 	消息內(nèi)容
3、size 	消息大小
返回:
RT_EOK 		成功
-RT_EFULL 	消息隊(duì)列已滿
-RT_ERROR 	失敗
 */
rt_err_t rt_mq_urgent(rt_mq_t mq, const void *buffer, rt_size_t size)

2.2.4 接收消息

接收消息時(shí),接收者需指定存儲消息的消息隊(duì)列對象句柄,并且指定一個內(nèi)存緩沖區(qū),接收到的消息內(nèi)容將被復(fù)制到該緩沖區(qū)里。

/**
參數(shù):
mq 				消息隊(duì)列對象的句柄
buffer 			消息內(nèi)容
size 			消息大小
timeout 		指定的超時(shí)時(shí)間
返回:
RT_EOK 			成功收到
-RT_ETIMEOUT 	超時(shí)
-RT_ERROR 		失敗,返回錯誤
 */
rt_err_t rt_mq_recv(rt_mq_t    mq,
                    void      *buffer,
                    rt_size_t  size,
                    rt_int32_t timeout)

2.3 消息隊(duì)列原理簡析

消息隊(duì)列控制塊:

要理解 消息隊(duì)列 的原理,就得從他初始化的狀態(tài)開始說起:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

發(fā)送消息,其實(shí)所有的步驟都是在rt_mq_send_wait函數(shù)中的,再次強(qiáng)調(diào),學(xué)會看源碼!

關(guān)鍵的幾個地方說明一下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

當(dāng)然這里沒有特意的說明等待時(shí)間問題,因?yàn)榘l(fā)送和接收都可以阻塞等待,這里不是要理解的重點(diǎn)。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

發(fā)送完完成以后如果發(fā)現(xiàn)有線程在等待消息隊(duì)列,會發(fā)生一次調(diào)度:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

接收消息,其實(shí)類似,可以自己查看源碼,試著分析。

對于上述過程的理解,我單獨(dú)寫了個例子,結(jié)合例子去理解上面的步驟,更加直觀!請看下面 理解消息隊(duì)列原理示例。

2.4 示例(消息隊(duì)列原理理解)

2個示例,第一個為了更加直觀的理解消息隊(duì)列原理,第二個是簡單的消息傳遞。

對于典型的串口接收不定長度數(shù)據(jù)的示例,我會單獨(dú)使用一篇文章來介紹。

2.4.1 理解消息隊(duì)列原理

我們在上面 《2.3 消息隊(duì)列原理簡析》 分析了一下消息隊(duì)列的原理,我們再來通過一個例子直觀的加深一下理解。

新建一個消息隊(duì)列(注意新建時(shí)候的參數(shù)):

pYYBAGKyeRyAXQOeAAAvb5BLk_Q666.png

我們2個按鍵,通過Key2按鍵發(fā)送消息:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

通過 Key3 打印 消息隊(duì)列 對應(yīng)的狀態(tài)值:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

我們測試的時(shí)候,通過觀察消息隊(duì)列初始化以后的狀態(tài),然后每次發(fā)送以后觀察 head,tail,free的變化情況,加深我們對消息隊(duì)列的理解:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

通過上面的示例再去理解消息隊(duì)列的原理,就很直觀了,如果有消息接收,觀察地址的變化,同樣的可以分析出接收消息時(shí)候的原理。

2.4.2 消息傳遞

消息傳遞相對來說,就簡單多了,直接在上面的基礎(chǔ)上,新建一個任務(wù)接收消息(因?yàn)闆]有做長度識別,這里沒有做解析):

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

還是通過上面的Key2按鍵發(fā)送消息:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_15,color_FFFFFF,t_70,g_se,x_16

結(jié)語

本文雖然只介紹了2個IPC機(jī)制,但是在項(xiàng)目中,它們的使用無處不在。

消息隊(duì)列的應(yīng)用在我們實(shí)際使用中,是很重要的,串口通信接收數(shù)據(jù)就是使用消息隊(duì)列來實(shí)現(xiàn)。對于消息隊(duì)列的串口應(yīng)用,我會單獨(dú)開一片博文來總結(jié)。

本文針對消息隊(duì)列的實(shí)現(xiàn)原理給出了很好的示例,還是那句話,學(xué)會多看源碼,多動手測試!

我會用心寫好每一篇博文,希望大家支持!謝謝!

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • IPC
    IPC
    +關(guān)注

    關(guān)注

    3

    文章

    335

    瀏覽量

    51715
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    502

    瀏覽量

    19615
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1249

    瀏覽量

    39727
  • 消息隊(duì)列
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    2960
收藏 人收藏

    評論

    相關(guān)推薦

    RT-Thread記錄(一、版本開發(fā)環(huán)境及配合CubeMX)

    RT-Thread 學(xué)習(xí)記錄的第一篇文章,RT-Thread記錄(一、RT-Thread 版本、RT-T
    的頭像 發(fā)表于 06-20 00:28 ?5045次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>記錄</b>(一、版本開發(fā)環(huán)境及配合CubeMX)

    RT-Thread記錄(二、RT-Thread內(nèi)核啟動流程)

    在前面我們RT-Thread Studio工程基礎(chǔ)之上講一講RT-Thread內(nèi)核啟動流程.
    的頭像 發(fā)表于 06-20 00:30 ?4883次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>記錄</b>(二、<b class='flag-5'>RT-Thread</b>內(nèi)核啟動流程)

    RT-thread內(nèi)核郵箱

    二、郵箱相關(guān)接口:在src/ipc.c中創(chuàng)建郵箱rt_mailbox_t rt_mb_create(const char *name,
    發(fā)表于 03-06 17:15

    RT-thread內(nèi)核消息隊(duì)列

    的所有內(nèi)存中的數(shù)據(jù)就是消息的真正內(nèi)容。rt-thread采用靜態(tài)隊(duì)列的方式來實(shí)現(xiàn)消息隊(duì)列IPC功能的。消息頭只是用來做索引功能,通過它可以索引到下一個消息頭的位置。如果大家還是有些不
    發(fā)表于 03-06 17:17

    一文讀懂RT-Thread操作系統(tǒng)的郵箱機(jī)制

    RT-Thread操作系統(tǒng)的郵箱有何作用?RT-Thread操作系統(tǒng)的郵箱機(jī)制管理數(shù)據(jù)結(jié)構(gòu)是怎樣的?
    發(fā)表于 02-28 08:10

    RT-Thread系統(tǒng)消息隊(duì)列常用的函數(shù)接口有哪些

    。rt_messagequeue 對象從 rt_ipc_object 中派生,由 IPC 容器所管理。消息隊(duì)列的操作函數(shù)RT-Thread
    發(fā)表于 03-31 14:14

    怎樣去操作RT-Thread系統(tǒng)的消息郵箱

    rt_ipc_object 中派生,由 IPC 容器管理。結(jié)構(gòu)體 rt_ipc_object 定義如下:結(jié)構(gòu)體定義中,繼承關(guān)系一目了然,不再贅述。管理郵箱
    發(fā)表于 03-31 14:29

    【原創(chuàng)精選】RT-Thread征文精選技術(shù)文章合集

    RT-Thread記錄(五、RT-Thread 臨界區(qū)保護(hù))RT-Thread記錄(六、IPC
    發(fā)表于 07-26 14:56

    rt-thread郵箱-隊(duì)列區(qū)別是什么?

    今天研究了下rt-thread,里面的郵箱隊(duì)列,除了消息尺寸不同之外還有別的差別嗎?怎么感覺像是同一種東西。
    發(fā)表于 10-31 08:29

    rt-thread 線程間同步和通信你用對了嗎

    系統(tǒng)優(yōu)化系列先停一停,總對人指指點(diǎn)點(diǎn)會讓大家反感的。今天給各位 rt-thread 使用者一些使用信號量、郵箱、消息隊(duì)列等同步和通信機(jī)制的...
    發(fā)表于 01-25 14:43 ?0次下載
    <b class='flag-5'>rt-thread</b> 線程間同步和通信你用對了嗎

    RT-Thread隱藏的寶藏completion

    completion 直接翻譯過來是完成,所以我更愿意稱 rt_completion 為 完成量。在 RT-Thread 的文檔中心 中講線程間通訊(IPC)時(shí),只介紹...
    發(fā)表于 01-25 19:27 ?0次下載
    <b class='flag-5'>RT-Thread</b>隱藏的寶藏<b class='flag-5'>之</b>completion

    RT-Thread全球技術(shù)大會:Kconfig在RT-Thread中的工作機(jī)制

    RT-Thread全球技術(shù)大會:Kconfig在RT-Thread中的工作機(jī)制 ? ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 14:49 ?1452次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會:Kconfig在<b class='flag-5'>RT-Thread</b>中的工作<b class='flag-5'>機(jī)制</b>

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    RT-Thread v5.0.2 發(fā)布

    RT-Thread 代碼倉庫地址: ●? https://github.com/RT-Thread/rt-thread RT-Thread 5.0.2 版本發(fā)布日志詳情: ●? htt
    的頭像 發(fā)表于 10-10 18:45 ?1299次閱讀
    <b class='flag-5'>RT-Thread</b> v5.0.2 發(fā)布

    玩轉(zhuǎn)RT-Thread消息隊(duì)列的應(yīng)用

    在嵌入式系統(tǒng)開發(fā)中,實(shí)時(shí)處理串口和ADC數(shù)據(jù)是一項(xiàng)重要的任務(wù)。本文將介紹如何在RT-Thread實(shí)時(shí)操作系統(tǒng)中,利用消息隊(duì)列來同時(shí)處理來自串口和ADC的數(shù)據(jù)。通過這種方法,我們能夠高效地管理和處理
    的頭像 發(fā)表于 07-23 08:11 ?444次閱讀
    玩轉(zhuǎn)<b class='flag-5'>RT-Thread</b><b class='flag-5'>之</b>消息<b class='flag-5'>隊(duì)列</b>的應(yīng)用