|
目的:熟悉消息队列的简单应用
代码:#include "includes.h"
#define N_MESSAGES 128
#define TASK_STK_SIZE 512
OS_STK StartTaskStk[TASK_STK_SIZE];
OS_STK MyTaskStk[TASK_STK_SIZE];
OS_STK YouTaskStk[TASK_STK_SIZE];
INT16S key;
INT8U err;
INT8U y = 0;
OS_EVENT *Str_Q;
char *ss;
char *s100;
char *s;
char *s500;
void *MsgGrp[N_MESSAGES]; /*消息数组,消息数组存放着各消息的指针*/
void StartTask(void *data);
void MyTask(void *data);
void YouTask(void *data);
void main (void)
{
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);
OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS, OSCtxSw);
Str_Q = OSQCreate( &MsgGrp[0], N_MESSAGES ); /*建立消息队列,参数为消息指针数组的首址
和数组长度*/
OSTaskCreate(StartTask, (void *)0, &StartTaskStk[TASK_STK_SIZE - 1], 0);
OSStart();
}
void StartTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
pdata = pdata; /* Prevent compiler warning */
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR); /* Install uC/OS-II's clock tick ISR */
PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprogram tick rate */
OS_EXIT_CRITICAL();
OSStatInit(); /* Initialize uC/OS-II's statistics */
OSTaskCreate(MyTask,(void *)0, &MyTaskStk[TASK_STK_SIZE - 1], 3);
OSTaskCreate(YouTask,(void *)0, &YouTaskStk[TASK_STK_SIZE - 1], 4);
s = "how many times this str can receive?";
for(;;)
{
if( OSTimeGet()>100 && OSTimeGet()<500 )
{
s100 = "The value of OSTime is between 100 and 500";
OSQPostFront( Str_Q, s100 ); /*后进先出的方式安插消息*/
s = "which task received this str?";
OSQPostFront( Str_Q, s ); /*后进先出的方式安插消息*/
}
if( OSTimeGet()>5000 && OSTimeGet()<5500 )
{
s500 = "The value of OSTime is between 5000 and 5500";
OSQPostFront( Str_Q,s500 ); /*后进先出的方式安插消息*/
}
if( PC_GetKey(&key) == TRUE )
{
if( key == 0x1B )
{
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,1,0);
}
}
void MyTask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
pdata = pdata;
for (;;)
{
ss = OSQPend(Str_Q,0,&err); /*请求消息*/
PC_DispStr(10,++y,ss,DISP_BGND_BLACK + DISP_FGND_WHITE);
OSTimeDlyHMSM(0,0,1,0);
}
}
void YouTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
pdata = pdata;
for (;;)
{
ss = OSQPend(Str_Q,0,&err); /*请求消息*/
PC_DispStr(10,10,ss,DISP_BGND_BLACK + DISP_FGND_WHITE);
OSTimeDlyHMSM(0,0,1,0);
}
} |
|