ucos-ii操作系统复习大纲

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1ucos-ii操作系统复习大纲一.填空题1.uC/OS-II是一个简洁、易用的基于优先级的嵌入式【抢占式】多任务实时内核。2.任务是一个无返回的无穷循环。uc/os-ii总是运行进入就绪状态的【最高优先级】的任务。3.因为uc/os-ii总是运行进入就绪状态的最高优先级的任务。所以,确定哪个任务优先级最高,下面该哪个任务运行,这个工作就是由【调度器(scheduler)】来完成的。4.【任务级】的调度是由函数OSSched()完成的,而【中断级】的调度是由函数OSIntExt()完成。对于OSSched(),它内部调用的是【OS_TASK_SW()】完成实际的调度;OSIntExt()内部调用的是【OSCtxSw()】实现调度。5.任务切换其实很简单,由如下2步完成:(1)将被挂起任务的处理器寄存器推入自己的【任务堆栈】。(2)然后将进入就绪状态的最高优先级的任务的寄存器值从堆栈中恢复到【寄存器】中。6.任务的5种状态。【睡眠态(taskdormat)】:任务驻留于程序空间(rom或ram)中,暂时没交给ucos-ii处理。【就绪态(taskready)】:任务一旦建立,这个任务就进入了就绪态。【运行态(taskrunning)】:调用OSStart()可以启动多任务。OSStart()函数只能调用一次,一旦调用,系统将运行进入就绪态并且优先级最高的任务。【等待状态(taskwaiting)】:正在运行的任务,通过延迟函数或pend(挂起)相关函数后,将进入等待状态。2【中断状态(ISRrunning)】:正在运行的任务是可以被中断的,除非该任务将中断关闭或者ucos-ii将中断关闭。7.【不可剥夺型】内核要求每个任务自我放弃CPU的所有权。不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。8.当系统响应时间很重要时,要使用【可剥夺型】内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。9.使用可剥夺型内核时,应用程序不应直接使用不可重入型函数。调用不可重入型函数时,要满足互斥条件,这一点可以用【互斥型信号量】来实现。10.【可重入型】函数可以被一个以上的任务调用,而不必担心数据的破坏。11.可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数或者只使用【局部变量】,即变量保存在CPU寄存器中或堆栈中。如果使用全局变量,则要对全局变量予以【保护】。12.每个任务都有其优先级。任务越重要,赋予的优先级应【越高】。13.μC/OS-Ⅱ初始化是通过调用系统函数【OSIint()】实现的,完成μC/OS-Ⅱ所有的变量和数据结构的初始化。14.多任务的启动是用户通过调用【OSStart()】实现的。然而,启动μC/OS-Ⅱ之前,用户至少要建立一个应用【任务】。15.μC/OS-Ⅱ的参数配置文件名为【OS_CFG.H】。16.删除任务,是说任务将返回并处于【休眠状态】,并不是说任务的代码被删除了,只是任务的代码不再被µC/OS-Ⅱ调用。17.µC/OS-Ⅱ要求用户提供【定时中断】来实现延时与超时控制等功能。18.定时中断也叫做【时钟节拍】,它应该每秒发生10至100次。19.时钟节拍的实际频率是由用户的应用程序决定的。时钟节拍的频率越高,系统的负荷就【越重】。20.µC/OS-II中的信号量由两部分组成:一个是信号量的【计数值】,它是一个16位的无符号整数(0到65,535之间);另一个是由等待该信号量的任务组成的【等待任务表】。用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成【1】,这样µC/OS-II才能支持信号量。21.µC/OS-II中表示当前已经创建的任务数全局变量名为:【OSTaskCtr】。321.µC/OS-II中表示当前内核运行的标记全局变量名为:【OSRunning】。22.在使用OSTaskCreate创建任务时,若需要TaskData作伪参数传递给任务Task,并从任务Task中获得传入的字符参数值,请在下面【】填上合适的代码。charTaskData=’A’;OSTaskCreate(Task,【(void*)&TaskData】,&TaskStk[0][TASK_STK_SIZE-1],1);voidTask(void*pdata){charvalue=【*(char*)pdata】;for(;;){OSSemPend(RandomSem,0,&err);y=(int)(*(char*)pdata-'A');OSSemPost(RandomSem);PC_DispChar(10,25,value,DISP_FGND_WHITE+DISP_BGND_BLUE);OSTimeDly(1);}}23.在µC/OS-II在任务Task1中使用邮箱函数OSMboxPost()发送字符;而在Task2中接收OSMboxPost()字符,请在下面【】填上合适的代码。voidTask1(void*data){chartxmsg;INT8Uerr;…txmsg='A';for(;;){OSMboxPost(TxMbox,【(void*)&txmsg】);/*SendmessagetoTask2*/OSMboxPend(AckMbox,0,&err);txmsg++;if(txmsg=='Z'){txmsg='A';}}}voidTask5(void*data){4char*rxmsg;INT8Uerr;data=data;for(;;){rxmsg=【(char*)】OSMboxPend(TxMbox,0,&err);PC_DispChar(70,18,*rxmsg,DISP_FGND_YELLOW+DISP_BGND_BLUE);OSMboxPost(AckMbox,(void*)1);}}24.在Task1中使用消息队列OSQPend()函数接收消息“HelloWorld!”,而在Task2中使用消息队列OSQPost()函数发送消息“HelloWorld!”,请在下面【】填上合适的代码.voidTask1(void*pdata){char*msg;INT8Uerr;pdata=pdata;for(;;){msg=【(char*)】OSQPend(MsgQueue,0,&err);PC_DispStr(70,13,msg,DISP_FGND_YELLOW+DISP_BGND_BLUE);OSTimeDlyHMSM(0,0,0,100);}}voidTask2(void*pdata){charmsg[20];pdata=pdata;strcpy(&msg[0],HelloWorld!);for(;;){OSQPost(MsgQueue,【(void*)】&msg[0]);OSTimeDlyHMSM(0,0,0,500);}}二.名词解释1.代码的临界段代码的临界段也称为临界区,指处理时不可分割的代码。2.资源任何为任务所占用的实体都可称为资源。资源可以是输入输出设备;资源也5可以是一个变量,一个结构或一个数组等。3.共享资源可以被一个以上任务使用的资源叫做共享资源。4.任务一个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU完全只属该程序自己。典型地、每个任务都是一个无限的循环。5.任务切换指ContextSwitch,其含义是CPU寄存器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Context),即CPU寄存器中的全部内容。6.内核多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。7.调度(Scheduler)内核的主要职责之一,就是要决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。8.可剥夺型内核最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。三.简答题1.举例说明µCOS-II可移植型数据类型的定义方式答:因为不同的微处理器有不同的字长,µC/OS-II的移植文件包括很多类型定义以确保可移植性。µCOS-II不使用C语言中的short,int,long等数据类型的定义,因为它们与处理器类型有关,隐含着不可移植性。µC/OS-II代之以移植性强的整数数据类型,这样,既直观又可移植(该数据类型不依赖于编译),举例如下:typedefunsignedcharBOOLEAN;typedefunsignedcharINT8U;typedefsignedcharINT8S;typedefunsignedintINT16U;typedefsignedintINT16S;typedefunsignedlongINT32U;6typedefsignedlongINT32S;2.µCOS-II如何定义全局变量?答:众所周知,全局变量应该是得到内存分配且可以被其他模块通过C语言中extern关键字调用的变量。因此,必须在.C和.H文件中定义。这种重复的定义很容易导致错误。µCOS-II采用的方法只需用在头文件中定义一次。uC/OS_II.H头文件中包括以下定义全局宏定义:#ifdefOS_GLOBALS#defineOS_EXT#else#defineOS_EXTextern#endifOS_EXTINT32UOSIdleCtr;同时,uCOS_II.H有中以下定义:#defineOS_GLOBALS#include“includes.h”当编译器处理uCOS_II.C时,它使得头文件变成如下所示,因为OS_EXT被设置为空。INT32UOSIdleCtr;这样编译器就会将这些全局变量分配在内存中。当编译器处理其他.C文件时,头文件变成了如下的样子,因为OS_GLOBAL没有定义,所以OS_EXT被定义为extern。externINT32UOSIdleCtr;在这种情况下,不产生内存分配,而任何.C文件都可以使用这些变量。这样的就只需在.H文件中定义一次就可以了。3.OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()的含义及作用?答:OS_ENTER_CRITICAL():关中断;OS_EXIT_CRITICAL():开中断。关中断和开中断是为了保护临界段代码。用户的应用代码可以使用这两个宏来开中断和关中断。很明显,关中断会影响中断延迟,所以要特别小心。用户还可以用信号量来保护临界段代码。4.基于PC的服务中如何测量PC_DisplayChar()的执行时间?答:测量PC_DisplayChar()的执行时间的代码如下:INT16Utime;//定义时间变量PC_ElapsedInit();//时钟初始化PC_ElapsedStart();//开始计时PC_DispChar(40,24,‘A’,DISP_FGND_WHITE);//执行代码time=PC_ElapsedStop();//结束计时75.uC/OS-II的任务框架答:voidtask_xxx(void*pData){/*该任务的初始化工作*/……/*进入该任务的死循环*/while(1){……}}每个用户的任务都必须符合事件驱动的编程模型,即uC/OS-II的应用程序都必须是“事件驱动的编程模型”。一个任务首先等待一个事件的发生,事件可以是系统中断发出的,也可以是其它任务发出的,又可以是任务自身等待的时间片。当一个事件发生了,任务再作相应处理,处理结束后又开始等待下一个事件的发生。如此周而复始的任务处理模型就是“事件驱动的编程模型”。事件驱动模型也涵盖了中断驱动模型,uC/OS-II事件归根结底来自三个方面:(1)中断服务函数发送的事件(2)系统延时时间到所引起的(3)其它任务

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功