訊息佇列與其他方式的一些比較:
1、訊號量使用方便,可以解決很多任務間的協調問題,但是訊號量所傳遞的資訊有限,而記憶體共享雖然傳遞資訊可以大些,但是不標準。訊息佇列作為一種折忠方式用於執行緒之間的資訊交換。
2、訊息佇列允許許多的訊息排隊,而每個資訊可以有不同長度,而傳統管道中的資料僅僅是乙個資料流,沒有邊界。vxworks中的管道資料有訊息組成。
▲訊息佇列使用特性:
在傳輸較小的資料塊時,效率較高,但在傳輸大的資料時,不如共享記憶體高效。另外,訊息佇列不能指定接受者,訊息佇列不支援廣播機制,因此乙個任務所發出的資訊不能被許多任務所接收。
使用訊息佇列作為任務傳送資料量比較小的資料時的通訊機制是比較理想的,一般不會產生死鎖問題。
▲ 訊息佇列的種類:
分wind型和posix型。wind型轉為vxworks設計,而posix型是為了方便移植到其他遵循posix標準的作業系統上。分別包含的檔案庫為:
msgqlib wind訊息佇列庫
msgqshow wind訊息佇列檢視函式庫
mqpxlib posix訊息佇列庫
mqpxshow poxix訊息佇列檢視函式庫
▲原理簡述:
首先是建立乙個訊息佇列,該訊息佇列中指定存放最多訊息數的數量和每個訊息的最大長度,由此產生乙個訊息佇列名稱msgqid。任務a通過訊息傳送函式 msgqsend()將一段資訊傳送到訊息佇列中存放。如果有任務b在等待訊息佇列中的訊息,即該傳送的訊息馬上交給任務b,其中任務b有一定的存放區,即通過msgqreceive()將收到的資訊存放在任務b中自己的儲存區內。如果訊息佇列中沒有訊息,那麼在等待訊息的任務b將被阻塞並被新增到等待訊息的任務佇列中。
▲引數說明:
mymsgqid = msgqcreate (max_msgs, max_msg_len, msg_q_priority)
mymsgqid :訊息佇列名稱 max_msgs:最多訊息數目
max_msg_len:每個訊息最大的長度。msg_q_priority:屬性。這裡為基於優先順序的。還有乙個是fifo型的。這個引數說明是針對需要等待訊息的而且是被阻塞的任務而言的。即如果訊息佇列中沒有訊息,那麼等待訊息的任務被阻塞,這些阻塞的任務排列是基於優先順序的還是基於fifo型的。
msgqsend (mymsgqid, message, sizeof (message), wait_forever,
msg_pri_normal)
mymsgqid:訊息傳送到的訊息佇列名稱。message:訊息內容 sizeof (message):訊息大小 wait_forever:等待方式 msg_pri_normal:傳送訊息的優先順序。分為一般型和緊急型,這個優先順序是相對於訊息在訊息佇列中的排列順序而言的,如果為一般級別,則在訊息佇列的尾部,如果為緊急級別,則在訊息佇列中的頭部。
訊息佇列例子(很多教材上採用的,只做一修改):
#include "vxworks.h"
#include "msgqlib.h"
#define max_msgs (10)
#define max_msg_len (100)
msg_q_id mymsgqid;
task2 (void)
task3 (void)
#define message "greetings from task 1"
task1 (void)
void start(void)
試驗結果為:只列印出message from task 1:
greetings from task 1
說明:如果訊息佇列中的乙個訊息被取走,其他任務將不能再次接收這個訊息。如果有多個訊息,那麼按照訊息建立時的屬性引數進行訊息排列,乙個個一次性地被讀取。其實以上例子整個過程就是任務1建立乙個訊息佇列,並且往這個訊息佇列中放入訊息(也就是一串資料),然後任務2通過接收訊息佇列中儲存並排列好的訊息,這個有任務1送來的訊息被一次性使用給任務2調走,存放在任務2接收函式中指定的儲存區內,完成整個任務間的通訊。
Vxworks 訊息佇列
1.訊息佇列用於task之間傳遞資訊。2.多個任務向同乙個訊息佇列傳送訊息或接收訊息。3.isr可以用no wait方式傳送訊息。2.msgqsend status msgqsend msg q id msgqid,訊息佇列id char buffer,指向要傳送的訊息的指標 uint nbytes...
vxworks任務通訊之訊息佇列
訊息佇列的基礎使用 訊息佇列 任務a向任務b傳送訊息 include include include include include define task priority a 130 define task priority b 130 define stack size 225 int tas...
Vxworks 程序間通訊1 訊息佇列
1.訊息佇列用於task之間傳遞資訊。2.多個任務向同乙個訊息佇列傳送訊息或接收訊息。3.isr可以用no wait方式傳送訊息。2.msgqsend c sharp view plain copy status msgqsend msg q id msgqid,訊息佇列id char buffer...