头文件:
#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);
}