標頭檔案:
#include
msgqcreate 建立乙個訊息佇列
msg_q_id msgqcreate
(int maxmsgs,
/*佇列中儲存的最大訊息數目*/
int maxmsglength,
/*每個訊息的最大位元組數*/
int options /*訊息在訊息佇列中的排列方式*/
)
options一般有兩個選項:
msg_q_fifo 表示訊息以先進先出的方式在佇列中
msg_q_priority 表示訊息以優先順序的方式在佇列中,高優先順序的訊息會直接送到佇列頂端
返回乙個msg_q_id型別的佇列id
msgqsend 向一訊息佇列傳送訊息包
status msgqsend
(msg_q_id msgqid,
/* 要傳送資訊的佇列id*/
char
* buffer,
/* 要傳送的資訊 */
uint nbytes,
/* 要傳送資訊的長度(位元組),即sizeof(buffer) */
int timeout,
/* 訊息進入佇列的等待時間 */
int priority /* 該訊息的優先順序 */
)
timeout意思是:當訊息佇列已滿時,等待訊息佇列有空間時所等待的時間。超過該時間還沒空間可用的話,訊息包被捨棄。它有兩個特殊值:no_wait(0)立即返回,不管訊息包是否被傳送;wait_forever(-1)一直等待訊息佇列有空間可用。
priority表示:指明傳送的訊息的優先順序,可能值有:msg_pri_normal(0)正常優先順序,將訊息置於訊息佇列的尾部;msg_pri_urgent(1)緊急訊息,將訊息置於訊息佇列的首部。
返回乙個status狀態值
msgqreceive從佇列接收訊息
int msgqreceive
(msg_q_id msgqid,
/* 接收訊息的佇列的id */
char
* buffer,
/* 接收訊息位元組緩衝區 */
uint maxnbytes,
/* 接受位元組的最大長度 */
int timeout /* 等待時間 */
)
該函式從訊息佇列msgqid接收訊息,將其拷貝到最大長度為maxnbytes的緩衝區buffer。如果訊息包長度超過maxnbytes,多餘部分被捨棄。等待時間timeout有兩個特殊值: no_wait(0)立即返回,wait_forever(-1)一直等待訊息佇列有訊息可取。
返回接收到的buffer的位元組大小或者error
msgqdelete 刪除乙個訊息佇列
status msgqdelete
(msg_q_id msgqid /*要刪除的佇列id*/
)
訊息佇列例子
程式結構
masqid1是乙個訊息佇列
task1 是主任務,用來傳送訊息
task2 是乙個死迴圈任務
主程式用來接收訊息,當task1傳送乙個訊息給主任務時,主任務呼叫taskdelete結束task2的執行**
入口函式main(id什麼的記得自己宣告)
//設定系統時鐘頻率
sysclkdisable()
;sysclkrateset
(1600);
sysclkenable()
;//建立訊息佇列if(
(msgqid1 = msgqcreate (max_msgs, max_msg_len, msg_q_fifo))!=
null
)printf
("msg create success!\n");
//建立二進位制訊號量if(
(semid2 =
sembcreate
(sem_q_fifo, sem_empty))==
null
)//設定看門狗並開啟if(
(wd20msid =
wdcreate()
)==null)if
(wdstart
(wd20msid,16*
2,(funcptr)timer20msfun, timer10mscounter)
== error)
//建立task1,task2if(
(taskid1 =
taskspawn
("taskid1"
,100
, vx_fp_task, stack_size,
(funcptr)task1,0,
0,0,
0,0,
0,0,
0,0,
0))==
null
)return
(error);if
((taskid2 =
taskspawn
("taskid2"
,100
, vx_fp_task, stack_size,
(funcptr)task2,0,
0,0,
0,0,
0,0,
0,0,
0))==
null
)return
(error)
;//主任務等待訊息if(
msgqreceive
(msgqid1, msgbuf, max_msg_len, wait_forever)
!= error)
}return
0;
task1()
void
task1()
task2
void
task2
(void
)}
看門狗函式
void
timer20msfun
(int times)
Vxworks 訊息佇列
1.訊息佇列用於task之間傳遞資訊。2.多個任務向同乙個訊息佇列傳送訊息或接收訊息。3.isr可以用no wait方式傳送訊息。2.msgqsend status msgqsend msg q id msgqid,訊息佇列id char buffer,指向要傳送的訊息的指標 uint nbytes...
Vxworks訊息佇列小結
訊息佇列與其他方式的一些比較 1 訊號量使用方便,可以解決很多任務間的協調問題,但是訊號量所傳遞的資訊有限,而記憶體共享雖然傳遞資訊可以大些,但是不標準。訊息佇列作為一種折忠方式用於執行緒之間的資訊交換。2 訊息佇列允許許多的訊息排隊,而每個資訊可以有不同長度,而傳統管道中的資料僅僅是乙個資料流,沒...
vxworks任務通訊之訊息佇列
訊息佇列的基礎使用 訊息佇列 任務a向任務b傳送訊息 include include include include include define task priority a 130 define task priority b 130 define stack size 225 int tas...