ucOS-II最详细的解释_第1页
ucOS-II最详细的解释_第2页
ucOS-II最详细的解释_第3页
ucOS-II最详细的解释_第4页
ucOS-II最详细的解释_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

μC/OS-IIFLTCHμC/OS-IIμC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。μC/OS-II的前身是μC/OS,是专门为计算机的嵌入式应用设计的。FLTCH主要内容1.计算机操作系统的基本概念2.操作系统中常用的数据结构3.并发操作系统的概念4.任务的要素5.uC/OS-II的任务调度6.uC/OS-II的中断和时钟7.uC/OS-II任务的同步与通信8.uC/OS-II的储存管理FLTCH计算机操作系统的基本概念FLTCH计算机操作系统的基本概念什么是计算机操作系统?操作系统是一种为应用程序提供服务的系统软件,是一个完整计算机系统的有机组成部分。从层次来看,操作系统位于计算机硬件之上,应用软件之下。所以也把它叫做应用软件的运行平台。FLTCH计算机操作系统的作用它在计算机应用程序与计算机硬件系统之间,屏蔽了计算机硬件工作的一些细节,并对系统中的资源进行有效的管理。通过提供函数(应用程序接口(API)),从而使应用程序的设计人员得以在一个友好的平台上进行应用程序的设计和开发,大大地提高了应用程序的开发效率。从用户的角度来看,它就是一大堆函数(API和系统函数),用户可以调用(普通调用或系统调用)它们来对系统资源进行操作。计算机硬件用汇编语言编写的硬件抽象层高级语言的接口应用软件操作系统FLTCHAPI什么是API?API(ApplicationProgrammingInterface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。FLTCH计算机操作系统的功能操作系统任务的管理存储管理I/O设备管理网络通信管理处理器管理FLTCH操作系统中经常用到的数据结构FLTCH操作系统中经常用到得数据结构(数组)。数组1。同一数据类型数据的集合;2。占用连续内存空间;3。其中的所有元素名称都相同,但每个元素都有一个编号;4。元素名去掉编号(下标),得到的是数组名,数组名是个指针。inta[10]a[0]a[1]a[2]a[3]a[9]……aa+1a+2a+3a+9指针数组FLTCH操作系统中经常用到得数据结构(位图)a[0]a[1]a[2]a[3]a[9]……1/0D7D6D5D4D3D2D1D0a+2aa+1a+3a+9…

a[10],可以记录80个事物的状态)位图:是数组的一种特殊应用。FLTCH操作系统中经常用到得数据结构(结构)structStudent{

intage;char*name;charsex;};结构:结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。

FLTCH

结构体FLTCH1、概述在实际应用有不少问题中只采用已学的变量和数组作为数据结构显得很不方便例:输入100个学生的学号、姓名和考试成绩,编写程序找出高分者和低分者。用变量和数组作数据结构可编写程序如下:FLTCHmain(){inti,num,maxnum,minnum;charname[20],maxname[20],minname[20];intscore,maxscore,minscore;maxscore=0;minscore=100;for(i=1;i<=100;i++){scanf(“%d%s%d”,&num,name,&score);if(score>maxscore){maxscore=score;maxnum=num;strcpy(maxname,name);}if(score<minscore){minscore=score;minnum=num;strcpy(minname,name);}

}

printf(“%d%d”,maxnum,maxscore);

printf(“%d%d”,minnum,minscore);}FLTCH明显缺点:①变量过多,同一学生的各个数据无联系,没有整体概念,不便管理。②操作不便(如更新过程)。显然,选用一种能把一个学生的数据构造成一个整体的构造型数据结构更合适,但不能是数组。对于这种情况,可以将一个学生的数据定义为一个结构体类型:

FLTCHstructstudent类型名{intnum;

charname[20];intscore;};定义了一个结构体类型,它包含三个成员。成员表,这里有三个成员FLTCH2、定义结构体类型变量的方法

前面定义的结构体类型只是一种“模型”,还必须定义结构体变量后才能存放数据。定义结构体变量有三种方法:1、先定义结构体类型再定义结构体变量定义了结构体类型后:

structstudentst,stmax,stmin;

类型符变量名

定义了三个结构体变量,每个变量包含三个成员,每个变量可存放一个学生的数据。FLTCH2、在定义结构体类型的同时定义结构体变量

structstudent{intnum;charname[20];intscore;}st,stmax,stmin;FLTCH3、直接定义结构体类型变量

struct不出现类型名

{intnum;charname[20];intscore;}st,stmax,stmin;常用第一种方法FLTCH说明:①类型与变量不同,只对变量分配空间与操作。②对成员可以单独使用,相当于普通变量。③成员也可以是一个结构体变量。

structdatestructstudent{intmonth;{intnum;intday;charname[20];intyear;structdatebirthday;};}st1,st2;

结构体里成员又是结构体变量④成员名可以与程序中的变量名相同,两者代表不同的对象。FLTCH3、结构体变量的引用

■成员引用可以对成员单独引用,形式为:结构体变量名.

成员名

成员运算符st.num=1001;st.score=90;strcpy(,“Li”);printf(“%d%s%d”,st.num,,st.score);scanf(“%d%s%d”,&st.num,,&st.score);可以引用成员的地址FLTCH如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员,只能对最低级的成员进行存取与运算。structdatestructstudent{intmonth;{intnum;intday;charname[20];intyear;structdatebirthday;};}st1,st2;st1.birthday.year=1960;st1.birthday.month=5;st1.birthday.day=15;FLTCH■整体引用可以对结构体变量进行整体赋值:stmax=st;将st中的所有内容赋值给stmax。对结构体变量的整体操作只限于赋值操作和参数传递,而且要求类型一致。不能对结构体变量进行整体输入输出。FLTCH结构体应用举例:编写程序输入100个学生的学号、姓名和考试成绩,找出高分者和低分者。

structstudent{intnum;charname[20];intscore;};FLTCHmain(){inti;structstudentst,stmax,stmin;stmax.score=0;stmin.score=100;for(i=1;i<=100;i++){scanf(“%d%s%d”,&st.num,,&st.score);if(st.score>stmax.score)stmax=st;if(st.score<stmin.score)stmin=st;}printf(“\n%5d%15s%5d”,stmax.num,,stmax.score);printf(“\n%5d%15s%5d”,stmin.num,,stmin.score);}FLTCH4、结构体变量的初始化对结构体变量可以在定义时指定初始值structstudent{intnum;charname[20];intscore;};structstudentst={1001,”wang”,95};FLTCH5、结构体数组

可以定义结构体数组来存放批量数据。■结构体数组的定义

structstudent{intnum;charname[20];intscore;};structstudenta[100];

定义a数组,可以存放100个学生的数据。

a数组的每个元素又是一个结构体变量。FLTCH■结构体数组的初始化在定义结构体数组的同时指定初值。

structstudent{intnum;charname[20];intscore;};

structstudenta[2]={{1001,”LiLi”,85},{1002,”wang”,90}};FLTCH或structstudent{intnum;charname[20];intscore;}a[2]={{1001,”LiLi”,85},{1002,”wang”,90}};FLTCH

■结构体数组元素的引用成员引用:

a[0].num=1001;strcpy(a[0].name,”wang”);a[0].score=85;

整体引用:

a[1]=a[0];与普通数组元素的引用相同

■结构体数组的应用输入100个学生的学号、姓名和考试成绩,然后按从高分到低分的顺序排列后输出。FLTCHstructstudent{intnum;charname[20];intscore;};main(){inti,j;structstudenta[100],t;for(i=0;i<100;i++)scanf(“%d%s%d”,&a[i].num,a[i].name,&a[i].score);FLTCH

for(i=0;i<99;i++){for(j=i+1;j<100;j++)if(a[i].score<a[j].score){t=a[i];a[i]=a[j];a[j]=t;}整体引用}for(i=0;i<100;i++)printf(“\n%5d%15s%5d”,a[i].num,a[i].name,a[i].score);}FLTCH6、指向结构体类型数据的指针

■指向结构体类型变量的指针

structstudentst,st1;

structstudent*p;p=&st;

指向st

定义指向结构体类型数据的指针变量pFLTCH通过指针变量引用结构体变量:①成员引用(*p).num=1001;或

p->num=1001;(*p).score=85;或

p->score=85;strcpy((*p).name,“wang”);

strcpy(p->name,“wang”);②整体引用st1=*p;等效于

st1=st;FLTCH■指向结构体数组的指针

structstudenta[100];

structstudent*p;p=a;

通过指针变量引用结构体数组元素:①成员引用

(*p).num=1001;或

p->num=1001;(*p).score=85;或

p->score=85;strcpy((*p).name,”wang”);

或strcpy(p->name,”wang”);FLTCH

一般地:(*(p+i)).num=1001;或

(p+i)->num=1001;(*(p+i)).score=85;或

(p+i)->score=85;strcpy((*(p+i)).name,”wang”);

strcpy((p+i)->name,”wang”);也可以用下标法:p[i].num=1001;p和a是等价的,就好比a[i].num=1001;②整体引用*(p+1)=*(p+0);或p[1]=p[0];FLTCH■用结构体变量和指向结构体的指针作函数参数用结构体变量作函数参数时,对应的实参应该是同类型的结构体变量(或数组元素),参数传递是“值传递”。用指向结构体的指针作函数参数时,对应的实参应该是同类型的结构体变量的地址(或数组的地址),参数传递是“地址传递”。FLTCHmain(){structstudentst={1001,”LiLi”,70};f(st);printf(“\n%5d%10s%5d”,st.num,,st.score);}f(structstudenta){a.score=90;printf(“\n%5d%10s%5d”,a.num,,a.score);}1001LiLi70sta1001LiLi90FLTCHmain(){structstudentst={1001,”LiLi”,70};f(&st);

printf(“\n%5d%10s%5d”,st.num,,st.score);}f(structstudent*a){a->score=90;

printf(“\n%5d%10s%5d”,a->num,a->name,a>score);}通过指针变量a可以访问它所指向的结构体。

1001LiLi70st2000aFLTCH7、用指针处理链表

■链表概述链表是一种重要的数据结构─动态数据结构。以具体例子来说明链表的概念及其应用:例:选择合适的数据结构来存放一批学生的学号及考试成绩,以便进一步处理。由于学生人数未知,用静态数据结构不合适。用链表处理较恰当。FLTCH用链表处理该问题的基本思路:将各学生的数据进行离散存放,来一个学生就分配一小块内存(结点)。并将各结点用指针依次连接起来─链表。

每结点应包含下一结点的开始地址。最后一个结点中的指针为空。链头指针指向第一个结点,是访问链表的重要依据。这样的链表称单向链表。

head学号成绩指针学号成绩指针学号成绩指针学号成绩指针学号成绩NULLFLTCH一个结点可用如下结构体描述:typedefstructstudent{intnum;学号

intscore;成绩

structstudent*next;下一结点的首地址}STU;typedef:自定义类型符FLTCH

■单向链表的建立①输入一个学生的数据。②分配结点空间,数据存入。③将该结点的首地址赋给上一结点的next,若该结点是第一个结点,则赋给头指针。④将该结点的next置为空,表示该结点为当前的最后结点。head学号成绩next学号成绩next学号成绩next学号成绩NULL学号成绩nextFLTCHSTU*creat(){STUst,*p0=NULL,*p,*head=NULL;while(1){scanf("%d%d",&st.num,&st.score);if(st.num<0)break;p=malloc(sizeof(STU));*p=st;(*p).next=NULL;if(p0==NULL)head=p;p0为前一结点的指针

else(*p0).next=p;p0=p;}returnhead;}学号成绩next学号成绩nexthead学号成绩NULLFLTCH■单向链表的访问以输出为例①通过头指针找到第一个结点.②输出当前结点的内容,并通过next找到后继结点,┄┄,直到next为空.FLTCHvoidoutput(STU*head){STU*p=head;while(p){printf("\n%d%d",(*p).num,(*p).score);p=(*p).next;}}head学号成绩next学号成绩next学号成绩NULL学号成绩nextFLTCH■删除结点操作①按链表的访问方法找到相应结点。②若该结点是第一个结点,则将后继结点指针赋给头指针。若该结点是最后一个结点,则将前缀结点的next置为空。若该结点是中间结点,则将后继结点指针赋给前缀结点的next。③释放该结点所占的内存单元。head学号成绩next学号成绩next学号成绩NULL学号成绩nextFLTCHSTU*delete(STU*head,intnumber){STU*p=head,*p0=NULL;while(p){if((*p).num==number){ if(p==head)head=(*p).next; elseif((*p).next==NULL)(*p0).next=NULL; else(*p0).next=(*p).next; free(p);break;}else{p0=p;p=(*p).next;}}returnhead;}假定要删除某一指定学号的结点

FLTCH■插入操作

假定将结点p插入到结点p0的后面,则插入操作的关键为:

p->next=p0->next;p0->next=p;head学号成绩next学号成绩next学号成绩next学号成绩NULLFLTCH操作系统中经常使用的数据结构(链表)structStudent{Student*nextintage;char*name;charsex;};nextnext两个元素的链表1。同数据类型数据的集合;2。不占用连续内存空间。使用上的特点:1。分类存放,但空间上不连续(不需要大量的连续存储空间);2。检索速度慢,且耗费的时间不固定;应用:存放大量的较大的表,类似档案柜FLTCH操作系统中经常使用的数据结构(队列)按照先进先出的规则组织的数据结构可以用数组也可以用链表来实现主要用于对象的排队FLTCH操作系统中经常使用的数据结构(堆栈)按照先进后出规则组织的数据结构主要用数组来实现主要用于程序模块的嵌套运行FLTCH在ucos-ii中,每个任务可以有5种状态,在任一时刻,任务的状态一定是这5种状态之一。等待或挂起就绪休眠中断服务运行↓←→→←←→收到消息,挂起时间到删除任务任务调度中断创建任务中断结束FLTCH1、单次执行类任务创建单次执行类任务运行删除↘↘voidMyTask(void*pdata){

}进行准备工作的代码;任务实体代码;调用任务删除函数;定义和初始化变量及硬件设备完成该任务的具体功能将自己删除,操作系统将不再管理它→→→FLTCH2、周期执行类任务就绪执行等待↙↙↙voidMyTask(*pdata){while(1){}}进行准备工作的代码;任务实体代码;调用延时函数;FLTCH3、事件触发类任务运行等待就绪运行↓↓↓消息VoidMyTask(void*pdata){while(1){}}进行准备工作的代码;调用获取事件的函数;任务实体代码;FLTCH系统函数概述1、配对性原则对ucos-ii来说,大多数API都是成对的,而且一部分必须成对使用。OSFlagCreat();建立事件标志组OSFlagDel();删除事件标志组OSSemCreat();建立信号量OSSemDel();删除信号量FLTCHFLTCH什么是多任务系统?简单的说,就是能用一个处理器并发(不是同时)地运行多个程序的计算机管理系统。并发:由同一个处理器轮换地运行多个程序。或者说是由多个程序轮班地占用处理器这个资源。且在占用这个资源期间,并不一定能够把程序运行完毕。并发过程示意图处理器如何进行程序的切换?FLTCH程序的切换(两句话)处理器是个傻瓜,PC让它干啥,它就干啥。PC是个指路器,它指向哪儿,处理器就去哪儿。从此可以知道,哪个程序占有了PC,哪个程序就占有了处理器。深刻地理解PC是理解系统进行程序切换动作的关键。FLTCH如何操作PC所谓切换PC←目标地址指令:不同计算机类型的指令是不同的1、数据传输指令2、子程序返回指令(由堆栈弹出)3、中断服务程序返回指令(由堆栈弹出)系统是通过把待运行程序的地址赋予程序计数器PC来实现程序的切换的。FLTCH任务代码任务堆栈内存处理器PCSP处理器通过两个指针寄存器(PC和SP)来与任务代码和任务堆栈建立联系并运行它寄存器组程序运行环境运行环境包括了两部分:处理器中的运行环境和内存中的运行环境程序运行时与处理器之间的关系FLTCH任务代码任务堆栈内存处理器PCSP任务代码任务堆栈内存任务代码任务堆栈内存?当有多个任务时,处理器中的运行环境应该怎么办?寄存器组程序运行环境多任务时的问题FLTCH程序虚拟处理器PCSP虚拟处理器PCSP虚拟处理器PCSP虚拟处理器PCSP调度器程序处理器PCSP在内存中为每个任务创建一个虚拟的处理器(处理器部分的运行环境由操作系统的调度器按某种规则来进行这两个复制工作复制当需要运行某个任务时就把该任务的虚拟处理器复制到实际处理器中复制当需要中止当前任务时,则把任务对应的虚拟处理器复制到内存复制再把另一个需要运行的任务的虚拟处理器复制到实际处理器中寄存器组寄存器组也就是说,任务的切换是任务运行环境的切换多任务时任务与处理器之间关系的处理FLTCH

μC/OS-II中 的任务管理FLTCH任务的状态及其转换正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给别的任务而使任务进入等待状态。任务在没有被配备任务控制块或被剥夺了任务控制块时的状态叫做任务的睡眠状态

系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,这时任务的状态叫做就绪状态。

处于就绪状态的任务如果经调度器判断获得了CPU的使用权,则任务就进入运行状态

一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态

FLTCH前面谈到,一个任务的任务控制块的主要作用就是保存该任务的虚拟处理器的堆栈指针寄存器SP。其实,随着任务管理工作的复杂性的提高,它还应该保存一些其他信息。任务控制块—任务在系统中的身份证

由于系统存在着多个任务,于是系统如何来识别并管理一个任务就是一个需要解决的问题。识别一个任务的最直接的办法是为每一个任务起一个名称。由于μC/OS-II中的任务都有一个惟一的优先级别,因此μC/OS-II是用任务的优先级来作为任务的标识的。所以,任务控制块还要来保存该任务的优先级别。另外,前面也谈到,一个任务在不同的时刻还处于不同的状态,显然,记录了任务状态的数据也应该保存到任务控制块中。基于上述原因,系统必须为每个任务创建一个保存与该任务有关的相关信息的数据结构,这个数据结构就叫做该任务的任务控制块(TCB)。任务控制块结构的主要成员typedefstructos_tcb{

OS_STK*OSTCBStkPtr; //指向任务堆栈栈顶的指针

……

INT8U OSTCBStat; //任务的当前状态标志

INT8U OSTCBPrio; //任务的优先级别

……}OS_TCB;

任务控制块是不是像我们人在一个国家中的身份证?(其实,系统中的所有资源都应该有身份证。)FLTCH一旦任务建立,一个任务控制块OS_TCB就被赋值。任务控制块是一个数据结构,当任务的cpu使用权被剥夺时,ucos-II用它来保存该任务的状态。当任务重新得到cpu使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差的继续执行。OS_TCB全部驻留在RAM中。FLTCH任务在内存中的结构FLTCH用户任务代码的一般结构

voidMyTask(void*pdata){for(;;){

可以被中断的用户代码;

OS_ENTER_CRITICAL();//进入临界段(关中断)

不可以被中断的用户代码;

OS_EXIT_CRITICAL(); //退出临界段(开中断)

可以被中断的用户代码;

}}临界段无限循环于是可以这样说,μC/OS-II任务的代码结构是一个可以带有临界段的无限循环。

FLTCH系统提供的另一个任务

——统计任务μC/OS-II提供的另一个系统任务是统计任务OSTaskStat()。这个统计任务每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUsage中,以便应用程序通过访问它来了解CPU的利用率,所以这个系统任务OSTaskStat()叫做统计任务

FLTCH

任务的优先权及优先级别

μC/OS_II把任务的优先权分为64个优先级别,每一个级别都用一个数字来表示。数字0表示任务的优先级别最高,数字越大则表示任务的优先级别越低

用户可以根据应用程序的需要,在文件OS_CFG.H中通过给表示最低优先级别的常数OS_LOWEST_PRIO赋值的方法,来说明应用程序中任务优先级别的数目。该常数一旦被定义,则意味着系统中可供使用的优先级别为:0,1,2,……,OS_LOWEST_PRIO,共OS_LOWEST_PRIO+1个

固定地,系统总是把最低优先级别OS_LOWEST_PRIO自动赋给空闲任务。如果应用程序中还使用了统计任务,系统则会把优先级别OS_LOWEST_PRIO-1自动赋给统计任务,因此用户任务可以使用的优先级别是:0,1,2…OS_LOWEST_PRIO-2,共OS_LOWEST_PRIO-1个

FLTCH

任务堆栈

保存CPU寄存器中的内容及存储任务私有数据的需要,每个任务都应该配有自己的堆栈,任务堆栈是任务的重要的组成部分在应用程序中定义任务堆栈的栈区非常简单,即定义一个OS_STK类型的一个数组并在创建一个任务时把这个数组的地址赋给该任务就可以了。例如:

//定义堆栈的长度#define TASK_STK_SIZE 512//定义一个数组来作为任务堆栈OS_STKTaskStk[TASK_STK_SIZE]; typedefunsignedintOS_STK;//这是系统定义的一个数据类型voidmain(void){ …… OSTaskCreate( MyTask, //任务的指针

&MyTaskAgu, //传递给任务的参数

&MyTaskStk[MyTaskStkN-1],//任务堆栈栈顶地址

20 //任务的优先级别

); ……}在创建用户任务时,要传递任务的堆栈指针和任务优先级别使用函数OSTaskCreate()创建任务时,一定要注意所使用的处理器对堆栈增长方向的支持是向上的还是向下的

FLTCH任务堆栈的初始化

应用程序在创建一个新任务的时候,必须把在系统启动这个任务时CPU各寄存器所需要的初始数据(任务指针、任务堆栈指针、程序状态字等等),事先存放在任务的堆栈中

μC/OS-II在创建任务函数OSTaskCreate()中通过调用任务堆栈初始化函数OSTaskStkInit()来完成任务堆栈初始化工作的

它的原型如下:

OS_STK*OSTaskStkInit( void(*task)(void*pd), void*pdato, OS_STK*ptos, INT16Uopt );由于各种处理器的寄存器及对堆栈的操作方式不尽相同,因此该函数需要用户在进行μC/OS-II的移植时,按所使用的处理器由用户来编写。实现这个函数的具体细节,将在本书有关μC/OS-II移植的章节中做进一步的介绍

其实,任务堆栈的初始化就是对该任务的虚拟处理器的初始化(复位)。

FLTCH任务控制块 (OS_TCB)

及任务控制块链表

μC/OS-II用来记录任务的堆栈指针、任务的当前状态、任务的优先级别等一些与任务管理有关的属性的表就叫做任务控制块

任务控制块就相当于是一个任务的身份证,没有任务控制块的任务是不能被系统承认和管理的

任务控制块结构的主要成员typedefstructos_tcb{

OS_STK*OSTCBStkPtr;//指向任务堆栈栈顶的指针

……

structos_tcb*OSTCBNext;//指向后一个任务控制块的指针

structos_tcb*OSTCBPrev;

//指向前一个任务控制块的指针

……

INT16U OSTCBDly; //任务等待的时限(节拍数)

INT8U OSTCBStat; //任务的当前状态标志

INT8U OSTCBPrio; //任务的优先级别

……}OS_TCB;任务控制块链表空任务控制块链表当应用程序调用函数OSTaskCreate()创建一个任务时,这个函数会调用系统函数OSTCBInit()来为任务控制块进行初始化。这个函数首先为被创建任务从空任务控制块链表获取一个任务控制块,然后用任务的属性对任务控制块各个成员进行赋值,最后再把这个任务控制块链入到任务控制块链表的头部

当进行系统初始化时,初始化函数会按用户提供的任务数为系统创建具有相应数量的任务控制块并把它们链接为一个链表。 由于这些任务控制块还没有对应的任务,故这个链表叫做空任务块链表。即相当于是一些空白的身份证。

FLTCH 任务就绪表 及 任务调度

多任务操作系统的核心工作就是任务调度。所谓调度,就是通过一个算法在多个任务中确定该运行的任务,做这项工作的函数就叫做调度器。

μC/OS_II进行任务调度的思想是“近似地每时每刻总是让优先级最高

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论