RTT学习
一互斥量:是信號(hào)量的一種,用于共享資源的排他性使用,以鎖的形式存在,初始化時(shí)為可用,不能在中斷中使用,可能導(dǎo)致優(yōu)先級(jí)翻轉(zhuǎn)。
二 事件:創(chuàng)建、刪除、初始化、解綁、等待、發(fā)送。可以一對(duì)多多對(duì)的,發(fā)送一個(gè)事件,所有等待的都有效。可以進(jìn)行邏輯“與”“或”,不能進(jìn)行累加;而信號(hào)量可以累加但不能進(jìn)行與或;
三 郵箱:創(chuàng)建、刪除、初始化、解綁、發(fā)送、接收。用于線程間多數(shù)據(jù)的傳遞,類似管道,郵箱單次發(fā)送默認(rèn)4字節(jié)(一個(gè)指針的大小),郵箱開銷小比信號(hào)量和消息隊(duì)列效率高。如果是數(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; };對(duì)于這樣一個(gè)消息結(jié)構(gòu)體,其中包含了指向數(shù)據(jù)的指針data_ptr和數(shù)據(jù)塊長(zhǎng)度的變量data_size。當(dāng)一個(gè)線程需要把這個(gè)消息發(fā)送給另外一個(gè)線程時(shí),可以采用如下的操作:
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ù)塊的長(zhǎng)度*/ /* 發(fā)送這個(gè)消息指針給mb郵箱*/ rt_mb_send(mb, (rt_uint32_t)msg_ptr);而在接收線程中,因?yàn)槭杖∵^來的是指針,而msg_ptr是一個(gè)新分配出來的內(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); }消息隊(duì)列:也是線程或中斷與線程間通訊的一種異步通訊手段,且不限長(zhǎng)度(只能發(fā)送4字節(jié)的限制,如果長(zhǎng)度為4則消息隊(duì)列退化成消息郵箱)。每個(gè)隊(duì)列包含若干消息框,每個(gè)消息框存放一條消息。緩存池地址,消息框數(shù)及每個(gè)消息框大小,當(dāng)前已有的消息數(shù),頭和尾。
除了創(chuàng)建、刪除、初始化、解綁、收、發(fā)外還有一個(gè)緊急發(fā)送,將隊(duì)列放到消息隊(duì)列的頭而不是尾部。注意下面例子:消息隊(duì)列因?yàn)槭菙?shù)據(jù)內(nèi)容的直接復(fù)制(深拷貝),所以用局部變量即可
這樣也就免去動(dòng)態(tài)內(nèi)存分配的煩惱了(也就不用擔(dān)心,接收線程在接收到消息時(shí),消息內(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ù)塊的長(zhǎng)度 */ /* 發(fā)送這個(gè)消息指針給mq消息隊(duì)列 */ rt_mq_send(mq, (void*)&msg_ptr, sizeof(struct msg)); }
void message_handler() {struct msg msg_ptr; /* 用于放置消息的局部變量 */ /* 從消息隊(duì)列中接收消息到msg_ptr中 */ if (rt_mq_recv(mq, (void*)&msg_ptr, sizeof(struct msg)) == RT_EOK) { /* 成功接收到消息,進(jìn)行相應(yīng)的數(shù)據(jù)處理 */ } } 線程A發(fā)消息隊(duì)列給線程B,并希望得到B的收到確認(rèn)信息,此時(shí)確認(rèn)信息可以用信號(hào)量(只是通知收到了)或者用郵箱(還包括狀態(tài)值信息)
?
??
轉(zhuǎn)載于:https://www.cnblogs.com/jieruishu/p/10254603.html
總結(jié)
- 上一篇: 一百元人民币多重 仅有1.15克
- 下一篇: vue生命周期图示中英文版Vue实例生命