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);
}

转载于:https://www.cnblogs.com/skl374199080/archive/2013/05/30/3109266.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值