UCOSII 消息邮箱 消息队列

代码来自于书本光盘 《嵌入式操作系统UCOSII原理及应用》

消息邮箱实例

/************************Test*************************************/
#include "includes.h"
#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; //用于退出的键
char*s;
char*ss;
INT8U err;  
INT8U y=0; //字符显示位置
INT32U Times=0;
OS_EVENT *Str_Box;
void  StartTask(void *data); //声明起始任务
void  MyTask(void *data); //声明任务
void  YouTask(void *data); //声明任务
/************************主函数*********************************/
void  main (void)
{
    OSInit( ); //初始化uCOS_II
    PC_DOSSaveReturn( ); //保存Dos环境
    PC_VectSet(uCOS, OSCtxSw); //安装uCOS_II中断
    Str_Box = OSMboxCreate ((void*)0); //创建互斥型信号量
    OSTaskCreate(StartTask, //创建任务StartTask
(void*)0, //给任务传递参数
&StartTaskStk[TASK_STK_SIZE - 1], //设置任务堆栈栈顶
0); //使任务的优先级别为0
    OSStart( ); //启动多任务管理
}
/***********************任务StartTask*******************************/
void  StartTask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif
    pdata = pdata; 
    OS_ENTER_CRITICAL( );
    PC_VectSet(0x08, OSTickISR); //安装时钟中断向量
    PC_SetTickRate(OS_TICKS_PER_SEC); //设置uCOS_II时钟频率
    OS_EXIT_CRITICAL( );


    OSStatInit( ); //初始化统计任务
    OSTaskCreate(MyTask, //创建任务MyTask
(void*)0, //给任务传递参数
&MyTaskStk[TASK_STK_SIZE - 1], //设置任务堆栈栈顶
3); //使任务的优先级别为3
    OSTaskCreate(YouTask, //创建任务YouTask
(void*)0, //给任务传递参数
&YouTaskStk[TASK_STK_SIZE - 1], //设置任务堆栈栈顶
4); //使任务的优先级别为4


    for (;;) 
    {
//如果按下Esc键则退出uCOS_II
if (PC_GetKey(&key) == TRUE) 
{
            if (key == 0x1B) 
   {
                PC_DOSReturn();
            }
        }
        OSTimeDlyHMSM(0, 0, 3, 0); //等待3秒
    }
}
/************************任务MyTask*******************************/
void  MyTask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif
    pdata = pdata;
  
    for (;;) 
    {
sprintf(s,"%d" ,Times);
OSMboxPost(Str_Box,s); //发送消息

        /*PC_DispStr(10,++y,
Str_Box->OSEventPtr,//s,
DISP_BGND_BLACK+DISP_FGND_WHITE );*/
Times++;       
        OSTimeDlyHMSM(0, 0, 1, 0); //等待1秒
    }
}
/************************任务YouTask******************************/
void  YouTask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif
    pdata = pdata;     
     
    for (;;) 
    {
ss=OSMboxPend(Str_Box,10,&err);                //请求消息                           
        PC_DispStr(10,++y,
ss,
DISP_BGND_BLACK+DISP_FGND_WHITE );          
        OSTimeDlyHMSM(0, 0, 1, 0); //等待1秒
    }
}


/************************End**************************************/



实例2消息队列



#include "includes.h"


#define  TASK_STK_SIZE   512 //任务堆栈长度
#define N_MESSAGES 128


OS_STK   StartTaskStk[TASK_STK_SIZE]; //定义任务堆栈区
OS_STK MyTaskStk[TASK_STK_SIZE];
OS_STK   YouTaskStk[TASK_STK_SIZE];


INT16S   key; //用于退出uCOS_II的键
char *s100;
char *s;
char *s500;
char * ss;
void * MsgGrp[N_MESSAGES];   //存放消息的数组


INT8U   err;
INT8U x=0,y=0; //字符显示位置


OS_EVENT *Str_Q;   //定义消息队列


void  StartTask(void *data);
void  MyTask(void *data);
void  YouTask(void *data);


void  Quitkey(void);


/************************主函数*********************************************/
void  main (void)
{
    OSInit(); //初始化uCOS_II
    PC_DOSSaveReturn(); //保存Dos环境
    PC_VectSet(uCOS, OSCtxSw); //安装uCOS_II中断


    Str_Q=OSQCreate(&MsgGrp[0],N_MESSAGES);
    OSTaskCreate(StartTask,0,&StartTaskStk[TASK_STK_SIZE - 1],0);
    OSStart();
}


//*****************************StartTask********************************************
void  StartTask(void *pdata)
{
    pdata=pdata;
    OS_ENTER_CRITICAL();
    PC_VectSet(0x08, OSTickISR);
    PC_SetTickRate(OS_TICKS_PER_SEC);
    OS_EXIT_CRITICAL();
    OSStatInit();


    OSTaskCreate(MyTask,0,&MyTaskStk[TASK_STK_SIZE - 1],1);
    OSTaskCreate(YouTask,0,&YouTaskStk[TASK_STK_SIZE - 1],2);
s="how many times can this strings be received?";
OSQPostFront(Str_Q,s);
for(;;)
{
if(OSTimeGet()>100&&OSTimeGet()<500)
{
s100="now 100<OSTime<500";
OSQPostFront(Str_Q,s100);
s="which task received this string?";
OSQPostFront(Str_Q,s);
}
if(OSTimeGet()>5000&&OSTimeGet()<5500)
{
s500="now 5000<OSTime<5500";
OSQPostFront(Str_Q,s500);
}
OSTimeDlyHMSM(0,0,1,0);
}




}
//*****************************MyTask********************************************
void  MyTask (void *pdata)
{
    pdata = pdata; 


    for (;;) 
{
ss=OSQPend(Str_Q,0,&err);
PC_DispStr(9,++y,ss,DISP_BGND_BLACK+DISP_FGND_WHITE);
        Quitkey();
OSTimeDlyHMSM(0,0,1,0);
        }
}


//*****************************YouTask********************************************
void  YouTask (void *pdata)
{
    pdata = pdata; 


    for (;;) 
{
ss=OSQPend(Str_Q,0,&err);
        PC_DispStr(10,++y,ss,DISP_BGND_BLACK+DISP_FGND_WHITE);
Quitkey();
OSTimeDlyHMSM(0,0,1,0);
        }
}




//*****************************Quitkey()********************************************
void Quitkey(void)
{
if(PC_GetKey(&key)==TRUE)
{
if(key==0x1B)
{PC_DOSReturn();}
}
}


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值