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