/****************************************************************************************************/
//Test.c
#include <stdlib.h>
#include <stdio.h>
#include "Test.h"
#include <taskLib.h>
#include <msgQLib.h>
#include <semLib.h>
#define MAX_MESSAGE_COUNT 100
#define MAX_MESSAGE_LENGTH 400
int offset;
unsigned char SharedBuf[2*1024];
/*任务1 消息的发送*/
void loop1(MSG_Q_ID id)/*the function for task 1, like a thread under Windows or Unix*/
{
unsigned char msg[MAX_MESSAGE_LENGTH] = {1};
for( ; ;)
{
taskDelay(10);//快速发送消息,10ms,直至消息队列满
if (msgQSend(id, msg, MAX_MESSAGE_LENGTH, WAIT_FOREVER, MSG_PRI_NORMAL) == OK)
{
printf("longping1!! Send %d\n", msg[0]);
}
else
{
printf("Sending message ERROR!\n");
}
}
}
/*任务2 消息的接收*/
void loop2(MSG_Q_ID id)/*the function for test 2, like a thread under Wondows or Unix*/
{
unsigned char msg[MAX_MESSAGE_LENGTH] = {0};
for( ; ;)
{
taskDelay(30);//满速取消息,消息队列满了以后,收发达到平衡,发消息的10ms和30ms效果相同
if (msgQReceive(id, msg, MAX_MESSAGE_LENGTH, WAIT_FOREVER) != ERROR)
{
printf("looping2!! Receive %d\n", msg[0]);
}
else
{
printf("Receiving message ERROR!\n");
}
}
}
/*任务3 获取信号量,信号量减1操作*/
void loop3(SEM_ID semID)
{
for ( ; ;)
{
taskDelay(100);//获取信号量,速度快
if (semTake(semID, WAIT_FOREVER) == OK)
{
offset = (++offset) % 2048;
printf("looping3!! Take SemID is: %d.Now I get one element: %d\n", (int)semID, SharedBuf[offset]);
}
}
}
/*任务4 释放信号量,信号量加1操作*/
void loop4(SEM_ID semID)
{
for ( ; ;)
{
taskDelay(200);//释放信号量,速度慢,可以控制获取信号量,虽然获取延时短,但是没有释放信号量,只能等待
if (semGive(semID) == OK)
{
printf("looping4!! Gave SemID is: %d.Now I get one element: %d\n", (int)semID, SharedBuf[offset]);
}
}
}
void InitialSharedBuf()
{
int i;
offset = 0;
for (i=0; i<2048; i++)
{
SharedBuf[i] = i;
}
}
int main()
{
MSG_Q_ID msgID;
SEM_ID semID;
signed int taskArray[100] = {0};
char ch;
int i;
/*to build a message Queue.*/
InitialSharedBuf();
msgID = msgQCreate(MAX_MESSAGE_COUNT, MAX_MESSAGE_LENGTH, MSG_Q_FIFO);
semID = semBCreate(SEM_Q_FIFO, SEM_FULL);
/*下面启动4个任务*/
/*start a task(thread)*/
taskArray[0] = taskSpawn("loop1 ", 80, 0, 64*1024, (FUNCPTR)loop1, (MSG_Q_ID)msgID, 0, 0, 0, 0, 0, 0, 0, 0, 0);
/*start another task(thread)*/
taskArray[1] = taskSpawn("loop2 ", 80, 0, 64*1024, (FUNCPTR)loop2, (MSG_Q_ID)msgID, 0, 0, 0, 0, 0, 0, 0, 0, 0);
/*start another task(thread)*/
taskArray[2] = taskSpawn("loop3 ", 80, 0, 64*1024, (FUNCPTR)loop3, (SEM_ID)semID, 0, 0, 0, 0, 0, 0, 0, 0, 0);
/*start another task(thread)*/
taskArray[3] = taskSpawn("loop4 ", 80, 0, 64*1024, (FUNCPTR)loop4, (SEM_ID)semID, 0, 0, 0, 0, 0, 0, 0, 0, 0);
/*主任务循环,当接收到'e'结束所有任务*/
for ( ; ;)
{
ch = getchar();
if (ch == 'e')
{
i = 0;
while (taskArray[i])
{
taskDelete(taskArray[i]);
printf("The task: %d is ended.\n", taskArray[i]);
taskArray[i] = 0;
i ++;
}
break;
}
}
printf("The Main Function is Ended.\n");
return 0;
}
/**************************************************************************************/
上面演示了消息、信号量和任务的创建,在Turnado下编译调试过,没有问题。
zhangggdlt
2005.04.28