vxworks消息隊列相關函數和案例

頭文件:

#include <msgQLib.h>
  1. msgQCreate 創建一個消息隊列
MSG_Q_ID msgQCreate
    (
    int maxMsgs,       		/*隊列中存儲的最大消息數目*/
    int maxMsgLength,  		/*每個消息的最大字節數*/
    int options        		/*消息在消息隊列中的排列方式*/
    )         

options一般有兩個選項:
MSG_Q_FIFO 表示消息以先進先出的方式在隊列中
MSG_Q_PRIORITY 表示消息以優先級的方式在隊列中,高優先級的消息會直接送到隊列頂端
返回一個MSG_Q_ID類型的隊列ID

  1. 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狀態值

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

  1. msgQDelete 刪除一個消息隊列
STATUS msgQDelete
   (
   MSG_Q_ID msgQId      /*要刪除的隊列ID*/
   )

消息隊列例子

  1. 程序結構
    masqID1是一個消息隊列
    task1 是主任務,用來發送消息
    task2 是一個死循環任務
    主程序用來接收消息,當task1發送一個消息給主任務時,主任務調用taskDelete結束task2的運行
  2. 代碼

入口函數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) 
	{
		perror("semBCreate semID2 error! ");
		return (ERROR);
	}
	//設置看門狗並打開
	if ((wd20msID = wdCreate()) == NULL) 
	{
		perror("wd20msID create error!");
		return (ERROR);
	}
	if (wdStart(wd20msID, 16*2, (FUNCPTR)timer20msFUN, timer10msCounter) == ERROR) 
	{
		perror("wd20msID start error!");
		return (ERROR);
	}	
	//創建task1,task2
	if ((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)
	 {
		 if(strcmp(msgBuf,"0522")==0)
		 {
			 taskDelete(taskID1);
			 printf("task1 has been delete\n");
		 }
	 }

	 return 0;

task1()

void task1()
{
//一系列功能代碼...滿足條件時發送消息終結task2.....
	if (msgQSend (msgQId1, dele, sizeof (dele), WAIT_FOREVER,MSG_PRI_NORMAL) != ERROR)
				printf("msg send succcess\n");
}

task2

void Task2(void)
{
	while (1) 
	{
		semTake(semID2, WAIT_FOREVER);
	}
}

看門狗函數

void timer20msFUN(int times) 
{
	wdStart(wd20msID, 16*2, (FUNCPTR)timer20msFUN, times);
	
		semGive(semID2);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章