《ucos-ii操作系统复习大纲.pdf》由会员分享,可在线阅读,更多相关《ucos-ii操作系统复习大纲.pdf(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、ucos-ii 操作系统复习大纲一一 填空题填空题1uC/OS-II 是一个简洁、易用的 基于优先级的嵌入式【抢占式】多任务实时内核。2任务是一个无返回的无穷循环。uc/os-ii 总是运行进入就绪状态的【最高优先级】的任务。3因为 uc/os-ii 总是运行进入就绪状态的最高优先级的任务。所以,确定哪个任务优先级最高,下面该哪个任务运行,这个工作就是由【调度器(scheduler)】来完成的。(4【任务级】的调度是由函数 OSSched()完成的,而【中断级】的调度是 由 函 数 OSIntExt()完 成。对 于 OSSched(),它 内 部 调 用 的 是【OS_TASK_SW()】完
2、 成 实 际 的 调 度;OSIntExt()内 部 调 用 的 是【OSCtxSw()】实现调度。5任务切换其实很简单,由如下 2 步完成:(1)将被挂起任务的处理器寄存器推入自己的【任务堆栈】。(2)然后将进入就绪状态的最高优先级的任务的寄存器值从堆栈中恢复到【寄存器】中。6 任务的 5 种状态。【睡眠态(task dormat)】:任务驻留于程序空间(rom 或 ram)中,暂时没交给 ucos-ii 处理。【就绪态(task ready)】:任务一旦建立,这个任务就进入了就绪态。【运行态(task running)】:调用 OSStart()可以启动多任务。OSStart()函数只能调
3、用一次,一旦调用,系统将运行进入就绪态并且优先级最高的任务。【等待状态(task waiting)】:正在运行的任务,通过延迟函数或 pend(挂起)相关函数后,将进入等待状态。(【中断状态(ISR running)】:正在运行的任务是可以被中断的,除非该任务将中断关闭或者 ucos-ii 将中断关闭。7【不可剥夺型】内核要求每个任务自我放弃 CPU 的所有权。不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个 CPU。8当系统响应时间很重要时,要使用【可剥夺型】内核。最高优先级的任务一旦就绪,总能得到 CPU 的控制权。9使用可剥夺型内核时,应用程序不应直接使用不可重入型函数。调用
4、不可重入型函数时,要满足互斥条件,这一点可以用【互斥型信号量】来实现。1010【可重入型】函数可以被一个以上的任务调用,而不必担心数据的破坏。11可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数或者只使用【局部变量】,即变量保存在CPU 寄存器中或堆栈中。如果使用全局变量,则要对全局变量予以【保护】。12每个任务都有其优先级。任务越重要,赋予的优先级应【越高】。13C/OS-初始化是通过调用系统函数【OSIint()】实现的,完成 C/OS-所有的变量和数据结构的初始化。14多任务的启动是用户通过调用【OSStart()】实现的。然而,启动 C/OS-
5、之前,用户至少要建立一个应用【任务】。$15.C/OS-的参数配置文件名为【】。16 删除任务,是说任务将返回并处于【休眠状态】,并不是说任务的代码被删除了,只是任务的代码不再被 C/OS-调用。17 C/OS-要求用户提供【定时中断】来实现延时与超时控制等功能。18定时中断也叫做【时钟节拍】,它应该每秒发生 10 至 100 次。19.时钟节拍的实际频率是由用户的应用程序决定的。时钟节拍的频率越高,系统的负荷就【越重】。20 C/OS-II 中的信号量由两部分组成:一个是信号量的【计数值】,它是一个16 位的无符号整数(0 到 65,535 之间);另一个是由等待该信号量的任务组成的【等待任
6、务表】。用户要在中将OS_SEM_EN开关量常数置成【1】,这样 C/OS-II才能支持信号量。21.C/OS-II 中表示当前已经创建的任务数全局变量名为:【OSTaskCtr】。21.C/OS-II 中表示当前内核运行的标记全局变量名为:【OSRunning】。22在使用 OSTaskCreate 创建任务时,若需要 TaskData 作伪参数传递给任务Task,并从任务 Task 中获得传入的字符参数值,请在下面【】填上合适的代码。char TaskData=A;OSTaskCreate(Task,【(void*)&TaskData】,&TaskStk0TASK_STK_SIZE-1,1
7、);void Task(void*pdata)char value=【*(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()字符,请在下面【】填上合适的代码。void Task1(
8、void*data)char txmsg;INT8U err;txmsg=A;for(;)OSMboxPost(TxMbox,【(void*)&txmsg】);/*Send message toTask2*/OSMboxPend(AckMbox,0,&err);txmsg+;if(txmsg=Z)txmsg=A;)void Task5(void*data)char *rxmsg;INT8U err;data=data;for(;)rxmsg=【(char*)】OSMboxPend(TxMbox,0,&err);PC_DispChar(70,18,*rxmsg,DISP_FGND_YELLOW+
9、DISP_BGND_BLUE);OSMboxPost(AckMbox,(void*)1);24.在 Task1 中使用消息队列 OSQPend()函数接收消息“Hello World!”,而在 Task2 中使用消息队列 OSQPost()函数发送消息“Hello World!”,请在下面【】填上合适的代码.void Task1(void*pdata)char *msg;INT8U err;pdata=pdata;for(;)-msg=【(char*)】OSQPend(MsgQueue,0,&err);PC_DispStr(70,13,msg,DISP_FGND_YELLOW+DISP_BGN
10、D_BLUE);OSTimeDlyHMSM(0,0,0,100);void Task2(void*pdata)char msg20;pdata=pdata;strcpy(&msg0,Hello World!);for(;)OSQPost(MsgQueue,【(void*)】&msg0);OSTimeDlyHMSM(0,0,0,500);)二二 名词解释名词解释1 1代码的临界段代码的临界段也称为临界区,指处理时不可分割的代码。2资源任何为任务所占用的实体都可称为资源。资源可以是输入输出设备;资源也可以是一个变量,一个结构或一个数组等。3共享资源可以被一个以上任务使用的资源叫做共享资源。4任务一
11、个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU 完全只属该程序自己。典型地、每个任务都是一个无限的循环。5 5任务切换(指指 Context Switch,其含义是CPU 寄存器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Context),即 CPU 寄存器中的全部内容。6 6内核多任务系统中,内核负责管理各个任务,或者说为每个任务分配 CPU 时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。7调度(Scheduler)内核的主要职责之一,就是要决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。8可剥夺型内核最高优先级的任务一
12、旦就绪,总能得到CPU 的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的 CPU 使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了 CPU 的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。三简答题三简答题1.举例说明 COS-II 可移植型数据类型的定义方式答:因为不同的微处理器有不同的字长,C/OS-II 的移植文件包括很多类型定义以确保可移植性。COS-II 不使用 C 语言中的 short,int,long 等数据类型的定义,因为它们与处理器类型有关,隐含着不可移植性。C/
13、OS-II 代之以移植性强的整数数据类型,这样,既直观又可移植(该数据类型不依赖于编译),举例如下:3.typedef unsigned char BOOLEAN;typedef unsigned char INT8U;typedef signed char INT8S;typedef unsigned int INT16U;typedef signed int INT16S;typedef unsigned long INT32U;typedef signed long INT32S;2.|COS-II如何定义全局变量答:众所周知,全局变量应该是得到内存分配且可以被其他模块通过C 语言中 e
14、xtern 关键字调用的变量。因此,必须在.C 和.H 文件中定义。这种重复的定义很容易导致错误。COS-II 采用的方法只需用在头文件中定义一次。uC/头文件中包括以下定义全局宏定义:#ifdef OS_GLOBALS#define OS_EXT#else#define OS_EXT extern#endif(OS_EXT INT32U OSIdleCtr;同时,有中以下定义:#define OS_GLOBALS#include“”当编译器处理时,它使得头文件变成如下所示,因为 OS_EXT 被设置为空。INT32U OSIdleCtr;这样编译器就会将这些全局变量分配在内存中。当编译器处理
15、其他.C 文件时,头文件变成了如下的样子,因为 OS_GLOBAL 没有定义,所以 OS_EXT 被定义为 extern。)extern INT32U OSIdleCtr;在这种情况下,不产生内存分配,而任何.C 文件都可以使用这些变量。这样的就只需在.H 文件中定义一次就可以了。4.OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()的含义及作用答:答:OS_ENTER_CRITICAL():关中断;OS_EXIT_CRITICAL():开中断。关中断和开中断是为了保护临界段代码。用户的应用代码可以使用这两个宏来开中断和关中断。很明显,关中断会影响中断延迟,所以要特
16、别小心。用户还可以用信号量来保护临界段代码。4基于 PC 的服务中如何测量 PC_DisplayChar()的执行时间答:测量 PC_DisplayChar()的执行时间的代码如下:INT16U time;描述利用 C/OS_ 宏调用关中断和开中断处理共享数据的示意性代码程序。答:OS_ENTER_CRITICAL();/*在这里处理共享数据*/OS_EXIT_CRITICAL();8.信号量的典型应用包括哪些答:信号量(Semaphores)是一种约定机制,在多任务内核中的典型应用包括:(1)控制共享资源的使用权(满足互斥条件);(2)标志某事件的发生(3)。(4)使两个任务的行为同步9对信
17、号量只能实施哪三种操作答:一般地说,对信号量只能实施三种操作:(1)初始化(INITIALIZE),也可称作建立(CREATE);(2)等信号(WAIT)也可称作挂起(PEND);(3)给信号(SIGNAL)或发信号(POST)。/10.给出 C/OS-中如何用信号量处理共享数据的示意代码答:通过获得信号量处理共享数据的示意代码如下:OS_EVENT*SharedDataSem;void Function(void)。INT8U err;OSSemPend(SharedDataSem,0,&err);/*共享数据的处理在此进行,(中断是开着的)*/OSSemPost(SharedDataSem
18、);11.给出初始化和启动 C/OS-的示意代码。答:void main(void)OSInit();/*初始化 uC/OS-II */.通过调用 OSTaskCreate()或 OSTaskCreateExt()创建至少一个任务;.OSStart();/*开始多任务调度!OSStart()永远不会返回*/12 描述建立任务 OSTaskCreate()的函数原型。答:建立任务 OSTaskCreate()的函数原型为:INT8U OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8U prio)其中,task:任务代码的指
19、针;pdata:当任务开始执行时传递给任务的参数的指针;ptos:分配给任务的堆栈的栈顶指针;=2)|OS_MBOX_EN|OS_SEM_EN OS_EVENT *OSTCBEventPtr;#endif#if(OS_Q_EN&(OS_MAX_QS=2)|OS_MBOX_EN void *OSTCBMsg;#endif INT16U OSTCBDly;INT8U OSTCBStat;INT8U OSTCBPrio;INT8U OSTCBX;INT8U OSTCBY;INT8U OSTCBBitX;INT8U OSTCBBitY;:#if OS_TASK_DEL_EN BOOLEAN OSTCB
20、DelReq;#endif OS_TCB;其中:OSTCBStkPtrOSTCBStkPtr 是指向当前任务栈顶的指针。OSTCBExtPtrOSTCBExtPtr 指向用户定义的任务控制块扩展。OSTCBStkBottomOSTCBStkBottom 是指向任务栈底的指针。OSTCBStkSizeOSTCBStkSize 存有栈中可容纳的指针元数目而不是用字节(Byte)表示的栈容量总数。OSTCBIdOSTCBId 用于存储任务的识别码。OSTCBNextOSTCBNext 和 OSTCBPrevOSTCBPrev 用于任务控制块 OS_TCBs 的双重链接。OSTCBEventPtrOS
21、TCBEventPtr 是指向事件控制块的指针。OSTCBMsgOSTCBMsg 是指向传给任务的消息的指针。OSTCBStatOSTCBStat 是任务的状态字。OSTCBPrioOSTCBPrio 是任务优先级。OSTCBDelReqOSTCBDelReq 是一个布尔量,用于表示该任务是否需要删除。OSTCBX,OSTCBX,OSTCBY,OSTCBY,OSTCBBitXOSTCBBitX 和和 OSTCBBitY OSTCBBitY 用于加速任务进入就绪态的过程或进入等待事件发生状态的过程。3论述事件控制块 ECB 数据结构答:C/OS-II 通过 中定义的 OS_EVENT 数据结构来
22、维护一个事件控制块的所有信息。该事件控制块 ECB 数据结构的定义如下:typedef struct void *OSEventPtr;/*指向消息或者消息队列的指针*/INT8U OSEventTblOS_EVENT_TBL_SIZE;/*等待任务列表 */INT16U OSEventCnt;/*计数器(当事件是信号量时)*/INT8U OSEventType;/*时间类型 */INT8U OSEventGrp;/*等待任务所在的组 */OS_EVENT;其中:OSEventPtrOSEventPtr 指针:只有在所定义的事件是邮箱或者消息队列时才使用。当所定义的事件是邮箱时,它指向一个消息
23、,而当所定义的事件是消息队列时,它指向一个数据结构.OSEventTblOSEventTbl 和 OSEventGrp:OSEventGrp:两者包含的是系统中处于就绪状态的任务。OSEventCntOSEventCnt:当事件是一个信号量时,用于信号量的计数器。OSEventTypeOSEventType:定义了事件的具体类型。4论述 C/OS-II 内存的管理的内存控制块数据结构答:为了便于内存的管理,在C/OS-II 中使用内存控制块(memory controlblocks)的数据结构来跟踪每一个内存分区,系统中的每个内存分区都有它自己的内存控制块。内存控制块的数据结构定义如下:typ
24、edef struct void *OSMemAddr;void *OSMemFreeList;INT32U OSMemBlkSize;INT32U OSMemNBlks;INT32U OSMemNFree;OS_MEM;其中:OSMemAddrOSMemAddr 是指向内存分区起始地址的指针。OSMemFreeListOSMemFreeList 是指向下一个空闲内存控制块或者下一个空闲的内存块的指针。OSMemBlkSizeOSMemBlkSize 是内存分区中内存块的大小,是用户建立该内存分区时指定的。OSMemNBlksOSMemNBlks 是内存分区中总的内存块数量,也是用户建立该内存分区时指定的。OSMemNFreeOSMemNFree 是内存分区中当前可以得空闲内存块数量。