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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(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 郵箱個(gè)數(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é)語

前言

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

相對(duì)于上一篇文章的內(nèi)容,線程通訊的學(xué)習(xí)會(huì)相對(duì)復(fù)雜些,因?yàn)樯婕暗较⒌膫鬟f,消息在實(shí)際項(xiàng)目中的可能存在多種不同的情況,所以 郵箱和消息隊(duì)列的使用場景和方式是關(guān)鍵,尤其是消息隊(duì)列?;旧蠈?shí)際項(xiàng)目中的所有消息類型都可以使用消息隊(duì)列的方式。消息隊(duì)列應(yīng)用于串口通信我會(huì)單獨(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)核啟動(dòng)流程 — 啟動(dòng)文件和源碼分析
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ī)制之信號(hào)量、互斥量和事件集)

一、郵箱

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

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

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

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

同以前的線程那些一樣,動(dòng)態(tài)的方式,先定義一個(gè)郵箱結(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)建失敗
郵箱對(duì)象的句柄 	創(chuàng)建成功 
 */
rt_mailbox_t rt_mb_create(const char *name, rt_size_t size, rt_uint8_t flag)

最后的 flag 和信號(hào)量一樣建議 RT_IPC_FLAG_PRIO

pYYBAGKyeReAI15XAABhZnlz4fA191.png

刪除郵箱:

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

1.2.2 初始化和脫離

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

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

初始化郵箱:

/**
參數(shù)含義:
1、mb	 	郵箱對(duì)象的句柄,需要取自定義的結(jié)構(gòu)體地址
2、name	 	郵箱名稱
3、msgpool 	緩沖區(qū)指針(用戶自定義的數(shù)組的地址,第一個(gè)數(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 	郵箱對(duì)象的句柄
返回
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)用中,個(gè)人認(rèn)為緊急郵件有沒有都沒有影響!

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

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

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

1.2.4 接收郵件

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

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

1.3 示例(指針傳遞)

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

1.3.1 郵箱消息傳遞

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

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

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

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é)果,兩個(gè)按鍵按下,線程不僅能收到直接傳過來的4字節(jié)數(shù)據(jù),還能通過傳遞的指針發(fā)送一個(gè)字符串:

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

1.3.2 郵箱個(gè)數(shù)示例

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

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

我們?cè)賮砀囊幌拢?strong>使用一個(gè)按鍵測試一下這個(gè) size 是字節(jié)呢,還是直接是郵件個(gè)數(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í)際測試中,為了加深對(duì)某個(gè)對(duì)象的理解,比如這里的郵箱,可以直接打印出郵箱的參數(shù)來查看當(dāng)前郵箱的狀態(tài)。學(xué)會(huì)測試?。?!

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 個(gè)字節(jié)以內(nèi),但是如果如果把消息隊(duì)列的每條消息的最大字節(jié)規(guī)定在4個(gè)字節(jié)以內(nèi),那么消息隊(duì)列就和郵箱一樣了。

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

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

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

#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;                      /**< 每個(gè)消息長度 */
    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)建和刪除

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

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

/**
參數(shù):
1、name 		消息隊(duì)列的名稱
2、msg_size 	消息隊(duì)列中一條消息的最大長度,單位字節(jié)
3、max_msgs 	消息隊(duì)列的最大個(gè)數(shù)
4、flag 		消息隊(duì)列采用的等待方式,它可以取如下數(shù)值: RT_IPC_FLAG_FIFO 或 RT_IPC_FLAG_PRIO
返回:
RT_EOK 				發(fā)送成功
消息隊(duì)列對(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é)對(duì)齊,系統(tǒng)會(huì)自動(dòng)補(bǔ)全。

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

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

刪除消息隊(duì)列:

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

2.2.2 初始化和脫離

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

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

/**
參數(shù):
1、mq 			消息隊(duì)列對(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ì)列對(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ì)列對(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ā)送郵件:

/**
除了最后多一個(gè)時(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ì)列對(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í),接收者需指定存儲(chǔ)消息的消息隊(duì)列對(duì)象句柄,并且指定一個(gè)內(nèi)存緩沖區(qū),接收到的消息內(nèi)容將被復(fù)制到該緩沖區(qū)里。

/**
參數(shù):
mq 				消息隊(duì)列對(duì)象的句柄
buffer 			消息內(nèi)容
size 			消息大小
timeout 		指定的超時(shí)時(shí)間
返回:
RT_EOK 			成功收到
-RT_ETIMEOUT 	超時(shí)
-RT_ERROR 		失敗,返回錯(cuò)誤
 */
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é)會(huì)看源碼!

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

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ì)列,會(huì)發(fā)生一次調(diào)度:

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

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

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

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

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

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

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

我們?cè)谏厦?《2.3 消息隊(duì)列原理簡析》 分析了一下消息隊(duì)列的原理,我們?cè)賮硗ㄟ^一個(gè)例子直觀的加深一下理解。

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

pYYBAGKyeRyAXQOeAAAvb5BLk_Q666.png

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

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

通過 Key3 打印 消息隊(duì)列 對(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ì)消息隊(duì)列的理解:

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

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

2.4.2 消息傳遞

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

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個(gè)IPC機(jī)制,但是在項(xiàng)目中,它們的使用無處不在。

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

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

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

審核編輯:湯梓紅

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

    關(guān)注

    3

    文章

    352

    瀏覽量

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

    關(guān)注

    0

    文章

    505

    瀏覽量

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

    關(guān)注

    31

    文章

    1305

    瀏覽量

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

    關(guān)注

    0

    文章

    33

    瀏覽量

    3012
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

    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功能的。消息頭只是用來做索引功能,通過它可以索引到下一個(gè)消息頭的位置。如果大家還是有些不
    發(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 對(duì)象從 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 線程間同步和通信你用對(duì)了嗎

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

    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ù)大會(huì):Kconfig在RT-Thread中的工作機(jī)制

    RT-Thread全球技術(shù)大會(huì):Kconfig在RT-Thread中的工作機(jī)制 ? ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 14:49 ?1578次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):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 ?1550次閱讀
    <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 ?655次閱讀
    玩轉(zhuǎn)<b class='flag-5'>RT-Thread</b><b class='flag-5'>之</b>消息<b class='flag-5'>隊(duì)列</b>的應(yīng)用