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