首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

uCOS-II通过邮箱方式实现任务间数据传递的简单实例

uCOS-II通过邮箱方式实现任务间数据传递的简单实例

/******************************************************************

Name:            Lambda
Date:            2013.03.23
Desciption:        创建两个任务,任务1不断循环发送字符A到字符Z,通过
                 邮箱的方式传递数据给任务2,任务2将从任务1收到的数据
                 通过串口打印在超级终端里。
                                         
*******************************************************************/

#include "config.h"

#define     TASK_STK_SIZE    512                        //定义每个堆栈长度为512

OS_STK        TaskStartStk[TASK_STK_SIZE];            //创建起始任务的堆栈
OS_STK        Task1Stk[TASK_STK_SIZE];            //创建功能任务1的堆栈
OS_STK        Task2Stk[TASK_STK_SIZE];            //创建功能任务2的堆栈
OS_EVENT    *TxMbox;                            //定义一个邮箱,用来传递发送消息
OS_EVENT     *AckMbox;                            //定义一个邮箱,用来传递应答消息


void TaskStart(void *pdata);
static void TaskStartCreateTasks(void);
void Task1(void *pdata);
void Task2(void *pdata);


/**********************************************************
                                        Main函数
**********************************************************/
int Main(void)
{
    TargetInit();                 //目标板初始化
    OSInit();                       //uC/OS-II初始化
    OSTimeSet(0);              //设置系统时基,建议予以保留
    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 7);    //创建起始任务TaskStart  
    OSStart();

    return 0;
}


/******************************************************************
                         起始任务函数TaskStart
*******************************************************************/

void TaskStart(void *pdata)
{

    pdata = pdata;                            //防止编译器报警
   
    TxMbox = OSMboxCreate( (void *)0 );        //创建一个邮箱,用来传递发送消息
    AckMbox = OSMboxCreate( (void *)0 );    //创建一个邮箱,用来传递应答消息
   
    TaskStartCreateTasks();                    //调用该函数来创建更多的功能任务

    while(1){                                //所有的任务都应该是一个无限循环的过程
        OSTimeDlyHMSM(0,0,1,0);            //将该任务挂起1秒,uCOS-II开始调度,让下一个就绪的最高优先级的任务运行
    }

}


/******************************************************************
                 创建功能任务函数TaskStartCreateTasks
*******************************************************************/

static void TaskStartCreateTasks(void)
{
    OSTaskCreate(Task1, (void *)0, &Task1Stk[TASK_STK_SIZE - 1], 8);            //创建功能任务Task1,优先级为8,不传递参数
    OSTaskCreate(Task2, (void *)0, &Task2Stk[TASK_STK_SIZE - 1], 9);            //创建功能任务Task2,优先级为9,不传递参数
}



/******************************************************************
                         功能任务函数Task1
*******************************************************************/

void Task1(void *pdata)
{
    char    TxMsg;
    INT8U err;
   
    pdata = pdata;                                    //防止编译器报警
   
    TxMsg = 'A';   
    while(1)
    {
        OSMboxPost(TxMbox, (void *)&TxMsg);        //把消息A的指针通过邮箱TxMbox发送出去
        OSMboxPend(AckMbox, 0, &err);                //一直等待邮箱AckMbox收到应答信号,只有从任务2收到应答信号后才往下执行
        
        TxMsg++;                                //循环发送字符A到字符Z
        if(TxMsg > 'Z'){
            TxMsg = 'A';
            
        //OSTimeDlyHMSM(0,0,1,0);                    //去掉该函数才能正常打印,但打印速度会非常快; 添加后反而会挂死任务只能打印字符A,就不动了??
                                                //此处的问题还请有经验的朋友指导一下啊。
                                                
        }
    }
}
继承事业,薪火相传
返回列表