在本例中,我们建立4个任务。在操作系统启动前,首先建立一个消息队列。在任务2-4中,任务会通过消息队列把自己的任务号传送到任务1,任务1负责把任务号通过数码管显示出来。
使用消息队列首先要建立消息队列,建立消息队列使用OSQCreate()函数。本例在操作系统开始运行前使用下面的语句建立一个消息队列完成消息的传送。
#define MSG_QUEUE_SIZE 20
MsgQueue = OSQCreate(&MsgQueueTbl[0], MSG_QUEUE_SIZE);
MSQ=OSQCreate(&MSQT[0],MSG_QUEUE_SIZE);
这样就建好了一个消息队列,以下是任务2-4的代码。
任务二:
void Task2 (void *pdata)
{
char msg[20];
strcpy(&msg[0], "0002"); /* 得到一个字符数组代表任务2 */
for (;;)
{
OSQPost(MsgQueue, (void *)&msg[0]); /* 使用消息队列发送 */
OSTimeDlyHMSM(0, 0, 0, 500);
}
}
任务三:
void Task3 (void *pdata)
{
char msg[20];
strcpy(&msg[0], "0003"); /* 得到一个字符数组代表任务2 */
for (;;)
{
OSQPost(MsgQueue, (void *)&msg[0]); /* 使用消息队列发送 */
OSTimeDlyHMSM(0, 0, 0, 500);
}
}
任务四:
void Task4 (void *pdata)
{
char msg[20];
strcpy(&msg[0], "0004"); /* 得到一个字符数组代表任务2 */
for (;;)
{
OSQPost(MsgQueue, (void *)&msg[0]); /* 使用消息队列发送 */
OSTimeDlyHMSM(0, 0, 0, 500);
}
}
任务2-4的消息需要任务1进行显示,LEDDisplay()函数是数码管显示函数。任务1的代码如下:
任务一:
void Task1 (void *pdata)
{
char *msg;
INT8U err;
for (;;)
{
msg = (char *)OSQPend(MsgQueue, 0, &err); /* 使用消息队列接收 */
LEDDisplay(msg);
OSTimeDlyHMSM(0, 0, 0, 100);
}
}
文章评论(0条评论)
登录后参与讨论