ucos-ii操作系统习题(嵌入式方向).pdf
《ucos-ii操作系统习题(嵌入式方向).pdf》由会员分享,可在线阅读,更多相关《ucos-ii操作系统习题(嵌入式方向).pdf(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 ucos-ii 操作系统习题 一 填空题 1 uC/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、不可重入型函数时,要满足互斥条件,这一点可以用【互斥型信号量】来实现。10【可重入型】函数可以被一个以上的任务调用,而不必担心数据的破坏。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,
7、1);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 Ta
8、sk1(void*data)char txmsg;INT8U err;|txmsg=A;for(;)OSMboxPost(TxMbox,【(void*)&txmsg】);/*Send message to Task2*/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_Y
9、ELLOW+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+DIS
10、P_BGND_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);?25.C/OS-II 操作系统使用 OSSchedLock()函数和 OSSchedUnlock()函数进行锁定(不允许任务级调度)和解锁(重新允许任务级调度)调度器,在用户应用程序中OSSchedLock()和 OSSchedUnlock()是【成
11、对出现的】,否则系统有可能出错。(self)可把正在运行的任务【(_挂起_)】,参数 self 指【(_任务本身_)】。用此函数挂起的任务可通过【(OSTaskResume )】函数唤醒。27.创建信号量 OSSemCreat(0)函数中,参数 0 表示【(信号量的初始值 )】。【二 名词解释 1代码的临界段 代码的临界段也称为临界区,指处理时不可分割的代码。2资源 任何为任务所占用的实体都可称为资源。资源可以是输入输出设备;资源也可以是一个变量,一个结构或一个数组等。】3共享资源 可以被一个以上任务使用的资源叫做共享资源。4任务 一个任务,也称作一个线程,是一个简单的程序,该程序可以认为 C
12、PU 完全只属该程序自己。典型地、每个任务都是一个无限的循环。5任务切换 指 Context Switch,其含义是 CPU 寄存器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Context),即 CPU 寄存器中的全部内容。6内核 多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU 时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。7调度(Scheduler)内核的主要职责之一,就是要决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。8可剥夺型内核 最高优先级的任务一旦就绪,总能得到 CPU 的控制权。当一个运行着的任务使一个比它
13、优先级高的任务进入了就绪态,当前任务的 CPU 使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了 CPU 的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。三简答题 1.举例说明 COS-II 可移植型数据类型的定义方式 答:因为不同的微处理器有不同的字长,C/OS-II 的移植文件包括很多类型定义以确保可移植性。COS-II 不使用 C 语言中的 short,int,long 等数据类型的定义,因为它们与处理器类型有关,隐含着不可移植性。C/OS-II 代之以移植性强的整数数据类型,这样,既直观又可移植(该
14、数据类型不依赖于编译),举例如下: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 语言中 extern 关键字调用的变量。因此,必须在.C 和.H 文件中定义。
15、这种重复的定义很容易导致错误。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;这样编译器就会将这些全局变量分配在内存中。当编译器处理其他.C 文件时,头文件变成了如下的样子,因为OS_GLOBAL 没
16、有定义,所以 OS_EXT 被定义为 extern。extern INT32U OSIdleCtr;|在这种情况下,不产生内存分配,而任何.C 文件都可以使用这些变量。这样的就只需在.H 文件中定义一次就可以了。3.OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()的含义及作用 答:OS_ENTER_CRITICAL():关中断;OS_EXIT_CRITICAL():开中断。关中断和开中断是为了保护临界段代码。用户的应用代码可以使用这两个宏来开中断和关中断。很明显,关中断会影响中断延迟,所以要特别小心。用户还可以用信号量来保护临界段代码。4基于 PC 的服务中如何测
17、量 PC_DisplayChar()的执行时间 答:测量 PC_DisplayChar()的执行时间的代码如下:INT16U time;描述利用 C/OS_ 宏调用关中断和开中断处理共享数据的示意性代码程序。答:OS_ENTER_CRITICAL();/*在这里处理共享数据*/¥OS_EXIT_CRITICAL();8.信号量的典型应用包括哪些 答:信号量(Semaphores)是一种约定机制,在多任务内核中的典型应用包括:(1)控制共享资源的使用权(满足互斥条件);(2)标志某事件的发生(3)使两个任务的行为同步¥9对信号量只能实施哪三种操作 答:一般地说,对信号量只能实施三种操作:(1)初
18、始化(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);11.给出初始化和启动 C/OS-的示意代码。答:void main
19、(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:任务代码的指针;pdata:当任务开始执行时传递给任务的参数的指针;ptos:分
20、配给任务的堆栈的栈顶指针;prio:分配给任务的优先级。!13任务可以是一个无限的循环,也可以是在一次执行完毕后被删除掉。请给出示意代码结构。答:C/OS-描述的任务示意代码必须是以下两种结构之一:void YourTask(void*pdata)for(;)/*用户代码*/.调用 C/OS-的服务例程之一:OSMboxPend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();(/*用户代码*/或 void YourTask(void*
21、pdata)/*用户代码*/OSTaskDel(OS_PRIO_SELF);14C/OS-任务管理提供哪些服务 答:C/OS-任务管理提供的服务包括:(1)建立任务:OSTaskCreate()或 OSTaskCreateExt();(2)删除任务:OSTaskDel();(3)请求删除任务:OSTaskDelReq();(4)改变任务的优先级:OSTaskChangePrio();(5)挂起任务:OSTaskSuspend();(6)恢复任务:OSTaskResume();(7)获得有关任务的信息:OSTaskQuery()。15C/OS-时间任务管理提供哪些服务 答:C/OS-时间任务管理
22、提供的服务包括:(1)任务延时函数:OSTimeDly()(2)按时分秒延时函数:OSTimeDlyHMSM()(3)(4)让处在延时期的任务结束延时:OSTimeDlyResume()(5)设置系统时间:OSTimeGet()(6)获得系统时间:OSTimeSet()16.C/OS-提供的数据共享和任务通讯的方法包括哪些 答:C/OS-提供的数据共享和任务通讯的方法包括五种方法:(1)利用宏 OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()来关闭中断和打开中断。(2)利用函数OSSchedLock()和OSSchekUnlock()对 C/OS-II中的任务调度
23、函数上锁和开锁。(3)!(4)信号量。(5)邮箱。(6)消息队列。17对于事件控制块进行的一些通用包括哪些操作 答:对于事件控制块进行的一些通用操作包括:(1)初始化一个事件控制块:OSEventWaitListInit();(2)使一个任务进入就绪态:OSEventTaskRdy();、(3)使一个任务进入等待该事件的状态:OSEventTaskWait();(4)因为等待超时而使一个任务进入就绪态:OSEventTO()。18C/OS-信号量提供哪些服务 答:C/OS-信号量提供的服务包括:(1)建立一个信号量:OSSemCreate();(2)等待一个信号量:OSSemPend();(3
24、)发送一个信号量:OSSemPost();)(4)无等待地请求一个信号量:OSSemAccept();(5)查询一个信号量的当前状态:OSSemQuery()。19C/OS-邮箱提供哪些服务 答:C/OS-邮箱提供的服务包括:(1)建立一个邮箱:OSMboxCreate();(2)等待一个邮箱中的消息:OSMboxPend();(3)发送一个消息到邮箱中:OSMboxPost();(4)无等待地从邮箱中得到一个消息:OSMboxAccept();(5)查询一个邮箱的状态:OSMboxQuery()20C/OS-消息队列提供哪些服务 答:C/OS-消息队列提供的服务包括:(1)建立一个消息队列:
25、OSQCreate();(2)等待一个消息队列中的消息:OSQPend();(3)向消息队列发送一个消息(FIFO):OSQPost();/(4)向消息队列发送一个消息(LIFO):OSQPostFront();(5)无等待地从一个消息队列中取得消息:OSQAccept();(6)清空一个消息队列:OSQFlush();(7)查询一个消息队列的状态:OSQQuery()。21C/OS-内存管理提供哪些服务 答:C/OS-内存管理提供的服务包括:(1)建立一个内存分区:OSMemCreate();(2)(3)分配一个内存块:OSMemGet();(4)释放一个内存块:OSMemPut();(5)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ucos ii 操作系统 习题 嵌入式 方向
限制150内