以下爲看視頻筆記..........
1. 消息隊列工作機制
消息隊列是RT-Thread中另一種常用的線程間通信方式,消息隊列是對郵箱的擴展。
消息隊列能夠接收來自線程或中斷服務例程中發出的不固定長度的消息,並把消息緩存在自己的內存空間中,而其他線程能夠從消息隊列中讀取相應的消息並進行對應的處理。
2. 消息隊列控制塊
消息隊列控制塊是操作系統用於管理消息隊列的一個數據結構
struct rt_messagequeue
{
struct rt_ipc_object parent;
void *msg_pool; //消息內存空間起始的地址
rt_uint16_t msg_size; //消息隊列中的消息框最大大小,以4的整數倍表示
rt_uint16_t max_msgs; //消息隊列中消息框的最大數目:msg_pool/(msg_size+4)[其中4表示消息用鏈表儲存所使用的指針大小]
rt_uint16_t entry; //消息隊列實時消息框的個數指示,有新的消息進來就加一,讀取了就減一
void *msg_queue_head; //指針指向消息的頭
void *msg_queue_tail; //指針指向消息的尾
void *msg_queue_free; //指針指向未使用的消息
}
typedef struct rt_messagequeue *rt_mq_t;
定義靜態消息隊列:struct rt_messagequeue static_mq
定義動態消息隊列 :rt_mq_t dynamic_mq
#define RT_ALIGN_SIZE 4 //對內存的操作四字節對齊
3. 消息隊列的操作
初始化與脫離,針對靜態線程隊列的API
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)
rt_err_t rt_mq_detach(rt_mq_t mq)
//第三個參數:定義一個內存空間,把地址賦給magpool,用來存儲消息,flag參數可爲:RT_IPC_FLAG_FIFO RT_IPC_FLAG_PRIO。msg_size是代表每一個消息的長度,爲4的倍數取值。pool_size爲內存池大小
創建與刪除,針對動態線程操作的APIAPI
rt_mq_t rt_mq_create(const char *name,rt_size_t msg_size,rt_size_t max_msgs,
rt_uint8_t flag)
rt_err_tr t_mq_delete(rt_mq_t mq)
發送消息
rt_err_t rt_mq_send(rt_mq_t mq, void *buffer, rt_size_t size)//普通消息的發送,放到列表的尾部
rt_err_t rt_mq_urgent(rt_mq_t mq, void *buffer, rt_size_t size) //緊急消息發送,放到列表的頭部
接收消息
rt_err_t rt_mq_recv(rt_ mq_t mq, void *buffer, rt_size_t size, rt_int32_t timeout)
4.代碼歷程在msgq_sample.c中