Chinaunix首页 | 论坛 | 博客
  • 博客访问: 50706
  • 博文数量: 6
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 98
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-18 20:33
文章分类
文章存档

2014年(4)

2013年(2)

我的朋友

分类: 嵌入式

2013-03-18 21:09:37

作为一个刚接触uCOS-II的新手,在看了一些代码之后,萌生出写一个创建uCOS-II多任务的参考模版,虽然不是万能,但相信可以节省一点时间,也可以和大家一起交流。

其中如有错误之处,还望各位高手多多保函,还望指正,帮助我进步,谢谢。


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

 Name:              Lambda
 Date:               2013.03.18
 Description:      这是一个基于S3C2440的uCOS-II创建多任务的模板,只包含主程序程序代码                        
*******************************************************************/

#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的堆栈
char               TaskData;                                      //定义功能任务传递的参数
OS_EVENT    *MySem;                                        //定义一个信号量

void TaskStart();
static void TaskStartCreateTasks(void);
void Task1(void *pdata);
void Task2(void *pdata);
/******************************************************************
                             main函数
*******************************************************************/
int main(void)
{

    /*
        该部分可添加代码
    */
    
    
    OSInit();                                                            //初始化uCOS,此时系统默认创建两个任务:空闲任务和统计任务,该两个任务优先级最低        
    
    MySem = OSSemCreate(1);                                 //创建一个信号量,并初始化为1,即通知内核某一时刻只允许一个任务访问该函数
    
    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 2);    //创建起始任务TaskStart
    
    OSStart();                                                         //启动系统,将CPU权限交给uCOS-II

    return 0;
}

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

void TaskStart(void *pdata)
{
    #if OS_CRITICAL_METHOD == 3
        OS_CPU_SR cpu_sr;
    #endif

    pdata = pdata;                              //防止编译器报警

    /*
        该部分可添加代码
    */

    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], 3);                     //创建功能任务Task1,优先级为3,不传递参数
    OSTaskCreate(Task2, (void *)&TaskData, &Task2Stk[TASK_STK_SIZE - 1], 4);        //创建功能任务Task2,优先级为4,传递char类型的参数
}


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

void Task1(void *pdata)
{
    pdata = pdata;                        //防止编译器报警
    
    while(1)
    {
        /*
            该部分可添加代码
        */

        OSTimeDly(1);                    //将该任务挂起1个时钟节拍,uCOS-II开始调度,让下一个就绪的最高优先级的任务运行    
    }

}


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

void Task2(void *pdata)
{
    INT8U err;

    pdata = pdata;                                           //防止编译器报警
    
    while(1)
    {
        OSSemPend(MySem,0,&err);          //Task2首先检查MySem信号量,并将查询信号量的指针作为参数传递给该函数;第二个参数表示超时时限,0表示无限期等待信号量
                                                          //MySem在建立时被初始化为1,并且没有其他任务使用该信号量,故可以立即得到该信号量并继续运行;若该信号量被其它任务使用
                                                          //则uCOS-II将挂起该任务并调度,找到下一个就绪的最高优先级,并使之运行
        /*
            该部分可添加代码

        */


        OSSemPost(MySem);                            //释放信号量

        OSTimeDly(1);                                     //将该任务挂起1个时钟节拍,uCOS-II开始调度,让下一个就绪的最高优先级的任务运行    
    }

}





阅读(3890) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~