vxworks訊息佇列相關函式和案例

2021-10-07 10:34:39 字數 3223 閱讀 8202

標頭檔案:

#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...