日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

RTT学习

發(fā)布時間:2024/10/12 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RTT学习 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一互斥量:是信號量的一種,用于共享資源的排他性使用,以鎖的形式存在,初始化時為可用,不能在中斷中使用,可能導(dǎo)致優(yōu)先級翻轉(zhuǎn)。

二 事件:創(chuàng)建、刪除、初始化、解綁、等待、發(fā)送。可以一對多多對的,發(fā)送一個事件,所有等待的都有效。可以進(jìn)行邏輯“與”“或”,不能進(jìn)行累加;而信號量可以累加但不能進(jìn)行與或;

三 郵箱:創(chuàng)建、刪除、初始化、解綁、發(fā)送、接收。用于線程間多數(shù)據(jù)的傳遞,類似管道,郵箱單次發(fā)送默認(rèn)4字節(jié)(一個指針的大小),郵箱開銷小比信號量和消息隊列效率高。如果是數(shù)據(jù),結(jié)構(gòu)體可以采用以下方法

  數(shù)組:郵箱的地址為數(shù)組的開始地址;郵箱的容量為sizeof(數(shù)組)/4

  結(jié)構(gòu)體:

struct msg {rt_uint8_t *data_ptr; rt_uint32_t data_size; };

對于這樣一個消息結(jié)構(gòu)體,其中包含了指向數(shù)據(jù)的指針data_ptr和數(shù)據(jù)塊長度的變量data_size。當(dāng)一個線程需要把這個消息發(fā)送給另外一個線程時,可以采用如下的操作:

struct msg* msg_ptr;msg_ptr = (struct msg*)rt_malloc(sizeof(struct msg)); msg_ptr->data_ptr = ...; /* 指向相應(yīng)的數(shù)據(jù)塊地址*/ msg_ptr->data_size = len; /* 數(shù)據(jù)塊的長度*/ /* 發(fā)送這個消息指針給mb郵箱*/ rt_mb_send(mb, (rt_uint32_t)msg_ptr);

而在接收線程中,因為收取過來的是指針,而msg_ptr是一個新分配出來的內(nèi)存塊,所以在接收線程處理完畢后,需要釋放相應(yīng)的內(nèi)存塊:

struct msg* msg_ptr; if (rt_mb_recv(mb, (rt_uint32_t*)&msg_ptr) == RT_EOK) { /* 在接收線程處理完畢后,需要釋放相應(yīng)的內(nèi)存塊*/ rt_free(msg_ptr); }

消息隊列:也是線程或中斷與線程間通訊的一種異步通訊手段,且不限長度(只能發(fā)送4字節(jié)的限制,如果長度為4則消息隊列退化成消息郵箱)。每個隊列包含若干消息框,每個消息框存放一條消息。緩存池地址,消息框數(shù)及每個消息框大小,當(dāng)前已有的消息數(shù),頭和尾。
除了創(chuàng)建、刪除、初始化、解綁、收、發(fā)外還有一個緊急發(fā)送,將隊列放到消息隊列的頭而不是尾部。注意下面例子:消息隊列因為是數(shù)據(jù)內(nèi)容的直接復(fù)制(深拷貝),所以用局部變量即可
這樣也就免去動態(tài)內(nèi)存分配的煩惱了(也就不用擔(dān)心,接收線程在接收到消息時,消息內(nèi)存空間已經(jīng)被釋放)
void send_op(void *data, rt_size_t length) { struct msg msg_ptr; msg_ptr.data_ptr = data; /* 指向相應(yīng)的數(shù)據(jù)塊地址 */ msg_ptr.data_size = length; /* 數(shù)據(jù)塊的長度 */ /* 發(fā)送這個消息指針給mq消息隊列 */ rt_mq_send(mq, (void*)&msg_ptr, sizeof(struct msg)); }
void message_handler() {struct msg msg_ptr; /* 用于放置消息的局部變量 */ /* 從消息隊列中接收消息到msg_ptr中 */ if (rt_mq_recv(mq, (void*)&msg_ptr, sizeof(struct msg)) == RT_EOK) { /* 成功接收到消息,進(jìn)行相應(yīng)的數(shù)據(jù)處理 */ } } 線程A發(fā)消息隊列給線程B,并希望得到B的收到確認(rèn)信息,此時確認(rèn)信息可以用信號量(只是通知收到了)或者用郵箱(還包括狀態(tài)值信息)

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/jieruishu/p/10254603.html

總結(jié)

以上是生活随笔為你收集整理的RTT学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。