uc/os-II的启动流程

uc/os-II的启动流程:

1 在程序中分配工作堆栈:
分配工作堆栈的主要目的是为工作执行时的参数,堆栈提供存放和访问空间。我们可以通过定义数组 unsigned int StackX[STACKSIZE],并

在工作启动时传送该数组完成工作堆栈的初始化。
   eg :
unsigned int StackX【STACKSIZE】;

2 建立工作函数体:
函数体中包含的内容有参数的定义以及初始化;功能函数或者是指令语句;设定工作挂起时间间隔。
   eg : 
void Task4(void *Id)
    {
        变量的定义以及初始化
        功能函数或者指令语句
        OSTimerDly(100);//任务挂起时间间隔
    }

3 描述启动工作:
   传送工作函数的地址,工作堆栈的地址,工作的优先顺序。
    eg :
void TaskStart(void *Id)
    {
        .......
        char Id4='4';
        .......
        OSTaskCreate(Task4,(void *)0,&Stack4[STACKSIZE-1],5);
        .......
    }

4 在main()函数体中完成启动流程:
   主要包括执行工作前硬件的初始化,作业系统的初始化,启动定时中断,启动工作等等。
    eg :
void main(void)
    {
初始化系统的硬件
OSInit();//uCOS的初始化
任务的建立,消息机制的建立
OSStart();//开始多任务的调度,作业系统开始运作
    }

一个简单的例子:

//定义工作任务,并为任务堆栈分配内存空间
#define STACKSIZE 64

unsigned int Stack1[STACKSIZE];
unsigned int Stack2[STACKSIZE];
unsigned int Stack3[STACKSIZE];
unsigned int StackMain[STACKSIZE];
/**********************************************/
*工作名称: Task1 
*功能:     工作1完成LED指示灯的闪烁
*参数:     Id---输入,工作标识
/**********************************************/
void Task1(void *Id)
{
   while(1)
   {
    leds_on();
    OSTimeDly(300);
    leds_off();
    OSTimeDly(130);
   }
}

/**********************************************/
*工作名称: Task2 
*功能:     工作2完成8段数码管的循环显示
*参数:     Id---输入,工作标识
/**********************************************/
void Task2(void *Id)
{
   int i;
   while(1)
   {
    for(i=0;i<16;i++)
    {
     Digit_Led_Symbol(i);
     OSTimeDly(150);
    }
   }

}

/**********************************************/
*工作名称: Task3 
*功能:     工作3完成计数,并显示
*参数:     Id---输入,工作标识
/**********************************************/
void Task3(void *Id)
{
   int i=0;
   while(1)
   {
    i++;
    uHALr_printf(" %d \r",i);
    OSTimeDly(90);
   }
}

/**********************************************/
*工作名称: TaskStart 
*功能:     主工作完成启动三个工作的功能
*参数:     Id---输入,工作标识
/**********************************************/
void TaskStart(void *Id)
{
   char Id1='1';
   char Id2='2';
   char Id3='3';
  
   uHALr_InitTimers();//使能计时器计数中断

//建立uc/OS工作,同时赋予工作的优先顺序,数字越小,优先级就越高
   OSTaskCreate(Task1,(void *)&Id1,&Stack1[STACKSIZE-1],2);
   OSTaskCreate(Task2,(void *)&Id2,&Stack2[STACKSIZE-1],3);
   OSTaskCreate(Task3,(void *)&Id3,&Stack3[STACKSIZE-1],4);

//删除当前的任务
   OSTaskDel(OS_PRIO_SELF);

}

/**********************************************/
*工作名称: Main
*功能:     主函数完成硬件的初始化,作业系统的初始化,启动定时中断,启动工作
/**********************************************/

int Main(void)
{
char Id0='0';

ARMTargeInit();//硬件的初始化,主要是指目标板的初始化

OSInit();//uc/os的初始化

OSTimeSet(0);//系统时间的设定

//建立主工作
OSTaskCreate(TaskStart,(void *)&Id0,&StackMain[STACKSIZE-1],0);

ARMTargetStart();//启动定时中断

OSStart();//启动作业系统,开始多任务的调度!

return(0);
}

posted @ 2013-05-30 21:33  cronus象牙塔  阅读(352)  评论(0编辑  收藏  举报