文档介绍:嵌入式系统及应用第五章任务管理与调度*主要内容任务简介任务控制块任务管理任务调度优先级反转*第一节任务任务的定义及其主要特性任务的内容任务的分类任务参数*在嵌入式实时系统中任务是操作系统内核调度的基本单位。任务主要包含以下内容:代码:一段可执行的程序数据:程序所需要的相关数据(变量、工作空间、缓冲区等)堆栈程序执行的上下文环境*voidYourTask(void*pdata){for(;;){/*用户代码;调用uC/OS-II的某些功能函数*/:OSFlagPend();OSMboxPend();OSMutexPend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();/*用户代码*/}}任务的代码通常是一个无限循环,如下面代码所示:任务代码的定义需注意两点:返回参数必须定义成void。当任务开始执行时,可传递一个任何类型的参数。(参数类型是void指针)*voidYourTask(void*pdata){/*用户代码;OSTaskDel(OS_PRIO_SELF);}当任务完成后,任务可以自我删除,如下面代码。需注意:任务代码不是真的删除了,只是内核简单地不会再这个任务,这个任务的代码也不会再运行了。*intmain(void){//();//在开始多任务之前必须先建立一个任务OSTaskCreate(TestTask1,(void*)11,&TestTaskStk1[TASK_STK_SIZE],11);//第1个参数是指向该任务运行代码的指针,第2个参数是一个指向任务初始化数据的指针,//第3个参数是任务的堆栈起始地址(高地址向低地址增长),//第4个参数是任务的优先级,数值越小,优先级越高。//开始多任务,控制权交给内核OSStart();}voidTestTask1(void*pdata){printf("%4u:*****TestTask1Firstcall*****\n",OSTime);//创建其他任务OSTaskCreate(TestTask2,(void*)22,&TestTaskStk2[TASK_STK_SIZE],22);while(1){printf("%4u:*****TestTask11*****\n",OSTime);OSTimeDly(1);}}uC/OS的任务实例*voidTestTask2(void*pdata){while(1){printf("%4u:*****TestTask22*****\n",OSTime);OSTimeDly(1);}}注:堆栈大小有上限,对于X86处理器,OS_STK变量类型是16位变量,所以堆栈大小是1024B;,必须给这些任务分配一个独一无二的介于0-62的优先级。0是最高优先级。()函数并不返回main函数。*任务的主要特性任务具有以下特性:动态性:任务状态是不断变化的。一般分为就绪态、运行态和等待态。在多任务系统中,任务的状态将随着系统的需要不断进行变化。并发性(并行性?):系统中同时存在多个任务,这些任务在宏观上是同时运行的。异步独立性:每个任务各自按相互独立的不可预知的速度运行,走走停停。*任务与程序的区别:任务能真实地体现工作内容的并发性,而程序不能;程序是任务的组成部分除程序外,任务还包括数据、堆栈及其上下文环境等内容;程序是静态的,任务是动态的;任务有生命周期,有诞生、有消亡,是短暂的;而程序是相对长久的;一个程序可对应多个任务,反之亦然;任务具有创建其他任务的功能,而程序没有。*