頭文件:
#include <msgQLib.h>
- 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)
{
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);
}