嵌入式实时操作系统试题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、目前使用的嵌入式操作系统主要有那些?请举出六种常用的。
Windwos CE、Windows Mobile、VxWork、Linux、uCos、Symbian、QNX
2、一般而言,嵌入式系统的架构可以分为4个部分,分别是(处理器)、存储器、输入输出和软件,一般软件分为(操作系统)和应用软件两个主要部分。
3、从嵌入式操作系统特点可以将嵌入式操作系统分为(实时操作系统)和分时操作系统,其中实时系统可分为(硬实时系统)和软实时系统
4、uc/os操作系统不包括以下哪集中状态
A、运行
B、挂起
C、退出
D、休眠
5、0x70&0x11的运算结果是
A、0x1
B、0x11
C、0x17
D、0x7
6、下列哪种方式不是ucos操作系统中任务之间的通信方式
A、信号量
B、消息队列
C、邮件
D、邮箱
7、在将ucos操作系统移植到ARM处理器上时,以下那些文件不需要修改
A、OS_CORE.C
B、include.h
C、OS_CPU.H
D、OSTaskInit
设计实时操作系统时,首先应该考虑系统的()。
A.可靠性和灵活性
B.实时性和可靠性
C.分配性和可靠性
D.灵活性和实时性
2. 大多数嵌入式实时操作系统中,为了让操作系统能够在有突发状态时迅速取得控制权,以作出反映,大都采用()的功能。
A:抢占式任务调度B:时间片轮转调度C:单调速率调度D:FIFO调度
8、所有的电子设备都属于嵌入式设备
简单题:
1、根据嵌入式系统的特点、写出嵌入式系统的定义
答:以应用为中心,以计算机技术为基础,软硬件可裁剪、功能、可靠性、成本、体积、功耗严格要求的专用计算机系统
2、试分析实时操作系统的工作特点及相互之间的转换
运行:获得CPU的控制权
就绪:进入任务等待队列,通过调度中转为运行状态
挂起:由于系统函数调用而被设置成挂起状态,任务发生阻塞,等待系统实时事件的发生而被唤醒,从而转为就绪或运行。
休眠:任务完成或者错误被清除的任务,该任务此时不具有任务控制块。
3、分析抢占式和非抢占式的区别
执行的过程中对中断的处理方式不一样。
抢占式:某一中断执行完成后,如果有更高优先级的任务处于就绪状态,将执行更高优先级的任务,而非抢占式不一样,一个任务只有主动放弃CPU控制权,其他任务才能够获得CPU的控制权。
名词解释:
RTOS(实时操作系统)scheduler(调度)
3. 什么是优先级反转?(6分)
一、判断题(共15分,共15题,每题1分,正确用“T”表示,错误用“F”表示)
1.优先级位图法是通过牺牲空间赢得时间。
( )
2.EDF调度策略可用于调度周期性任务( )
3.在嵌入式操作系统中一般不使用虚拟存储技术,避免页面置换的开销所引起的不确定性。
( )
4.自陷、异常和中断基本上具有相同的中断服务程序结构。
( )
5. 嵌入式多任务系统中,任务间的耦合程度越高,它们之间的通信越少。
( )
6.存储器映射编址是指I/O端口的地址与内存地址统一编址,即I/O单元与内存单元在同一地址空间。
其优点是可采用丰富的内存操作指令访问I/O单元、无需单独的I/O地址译码电路、无需专用的I/O指令。
( )
7.嵌入式系统中,优先级抢占调度可以在任意位置、任意时刻发生。
( )
8.当二值信号量用于任务之间同步时,其初始值为1。
( )
9.如果一个实时调度算法使得任务充分利用了CPU,则CPU的利用率为100%。
( )
10.RISC处理器常用高效流水线技术提高处理器的并行性。
( )
11.弱实时对系统响应时间有要求,但是如果系统响应时间不能满足,不会导致系统出现致命的错误或崩溃。
( )
12.循环轮询系统适合于慢速和非常快速的简单系统。
( )
13.单处理器多任务系统无需嵌入式操作系统的支持。
( )
14.任务控制块的内容在任务创建时进行初始化,在系统运行过程中不会发生变化。
( )
15.支持实时特性的DARTS设计方法也采用了面向对象技术。
( )
二、单项选择题(共20分,共10题,每题2 分)
1、以下描述中,哪一项不适用于前后台系统:( )
(A)是中断驱动系统的一种(B)后台是一个循环轮询系统一直在运行
(C)前台由一些中断处理过程组成(D)具有多任务
2、以下哪项不能降低嵌入式系统处理器的功耗( )
(A)降低工作电压;
(B)提供不同的时钟频率;
(C)关闭暂时不使用的功能块;
(D)提升工作的时钟频率。
3、以下关于同步、互斥与通信机制的描述中,错误的是( )
(A)间接通信指通信双方不需要指出消息的来源或去向,而通过中间机制来通信。
(B)在消息队列通信中,将数据从发送任务的空间完全拷贝到接收任务的空间,具有较好的时间及空间性能;
(C)操作系统可以环形缓冲的形式管理消息队列;
(D)事件无队列,即多次发送同一事件,在未经过任何处理的情况下,其效果等同于只发送一次。
4、以下哪一项不属于处理器存储器子系统的范畴( )。
(A)MMU/MPU (B)Cache (C)write buffer (D)external memory
5、多任务系统的优点很多,但( )不是其优点。
(A)将复杂的系统分解成相对独立的多个任务,达到分而制之的目的,从而降低系统的复杂性;
(B)便于保证系统的实时性;
(C)需要增加功能:任务间的协调,同步和通信功能;
(D)系统的模块化好,提高系统的可维护性。
6、以下关于任务分类的描述,不正确的是( )
(A)按照到达情况的可预测性,任务可划分为周期任务和非周期任务;
(B)按照重要程度,任务可分为关键任务和非关键任务;
(C)非关键任务如果没有得到及时执行,将会产生严重后果;
(D)周期任务每隔一个固定的时间间隔就会执行一次。
7、运行任务被抢占的原因不包括( )
(A) 它唤醒了高优先级的任务(B) 将自己挂起
(C) 有多个同优先级的就绪任务,运行的时间片到(D) 优先级较低的中断产生并处理中断
8. ARM处理器在哪种模式下,具有最多的影子寄存器( )
(A)USER (B)SYSTEM (C)FIQ (D)IRQ (E)ABORT
9. 以下关于ARM处理器的分类,哪项描述不正确( )
(A)应用处理器具有最快频率、最高性能以及合理的功耗
(B)实时控制处理器具有实时响应、合理性能、较低功耗
(C)微控制器具有一般性能、最低成本和极低的功耗
(D)微控制器也可以具有存储器子系统
10. 关于中断服务程序的编写原则,以下哪个是不正确的:( )
(A)中断服务程序要尽量地简短,只完成必要的处理工作;
(B)中断服务程序中可以调用操作系统提供的一些服务;
(C)中断服务程序中可以与任务相同的方式使用操作系统的服务;
(D)中断服务程序中可以打开系统的中断响应,以支持中断嵌套。
三、填空题(共20分,共20空,每空1 分)
1. 嵌入式微处理器的指令集一般要针对特定领域的应用进行剪裁和扩展,常用的扩展指令类型包
括:、、、。
2. 在多任务系统中,任务具有等特点。
3. ARM9系列的处理器具有5级流水线,分为、器访问和等5个阶段。
4. 导致ARM处理器工作模式转变的原因有:软件控制、异常和。
5. ARM处理器的自陷指令是,X86处理器的自陷指令是
6. 内存保护主要包含两各方面的内容:和。
7. I/O端口的编址方法,即I/O
8. 嵌入式微处理器有两种体系结构,其中将指令和数据存放于同一存储空间,而的特点是指令和数据分别使用相互独立的存储空间。
1. 在嵌入式实时系统中,什么是任务?有哪些主要特性?简述任务、进程之间的主要区别。
(
5分)
2.ARM处理器的程序状态寄存器第28到31位分别代表什么意义?请分析右边的代码是如何利用这些位的信息。
四、简答题( 共30分,共5题,第4题为9分,第5题6分,其余每题5分)
3. 交叉调试与普通软件调试有哪些异同?(5分)
4. 嵌入式实时操作系统采用了那些机制提高系统的实时性与确定性?并简要说明。
(9分)
5. 么是优先级反转?有哪些方法可以避免优先级反转?请简要对它们进行说明。
(6分)
五、综合题(共15分,共2题,第1题为8分,第2题为7分)
1 (8分)在嵌入式实时操作系统中,对于时间等待的任务,可以组织为差分链表的方式进行管理。
假设某个时刻,有一组任务T1、T2、T3、T4、T5,分别等待10、5、7、15、12个tick。
(1)画出由五个任务形成的差分链表;
(2)经过8个tick后,T6进入时间等待状态,等待时间为5个tick。
请画出该时刻的差分链表;
(3)说明采用差分链管理时间等待任务的好处;
(4)时间等待任务,通常由定时器触发的中断服务程序进行处理。
说明中断服务程序的主要性能指标及其基本含义。
另外,通常要求中断服务程序的执行时间比较短,说明相应的处理措施。
2 (7分)在ucOS的优先级位图算法中,处于就绪状态任务的优先级,通过优先级就绪组OSRdyGrp和优先级就绪表OSRdyTbl进行管理:
(1)基于C语言,给出OSRdyGrp和OSRdyTbl的变量定义;
(2)从进入就绪态、退出就绪态和获取当前处于就绪态的最高优先级等三个方面,描述优先级位图算法管理就绪任务的基本方法;
(3)对于优先级分别为7、20和18的三个任务,分别描述三个任务依次进入就绪态时的OSRdyGrp及OSRdyTbl[]的值(假设初始OSRdyGrp=0b00000001,OSRdyTbl[0]=0b00010000,OSRdyTbl[1-7]=
0b00000000);
(4)当这三个任务都处于就绪状态时,判断出当前处于就绪态的最高优先级。
一.填空题
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种状态。
【睡眠态(task dormat) 】:任务驻留于程序空间(rom或ram)中,暂时没交给ucos-ii处理。
【就绪态(task ready)】:任务一旦建立,这个任务就进入了就绪态。
【运行态(task running)】:调用OSStart()可以启动多任务。
OSStart()函数只能调用一次,一旦调用,系统将运行进入就绪态并且优先级最高的任务。
【等待状态(task waiting)】:正在运行的任务,通过延迟函数或pend(挂起)相关函数后,将进入等待状态。
【中断状态(ISR running)】:正在运行的任务是可以被中断的,除非该任务将中断关闭或者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 】。
21. µC/OS-II中表示当前内核运行的标记全局变量名为:【OSRunning 】。
22.在使用OSTaskCreate创建任务时,若需要TaskData作伪参数传递给任务Task,并从任务Task中获得传入的字符参数值,请在下面【】填上合适的代码。
char TaskData=‟A‟; OSTaskCreate(Task, 【(void *)& TaskData 】, &TaskStk[0][TASK_STK_SIZE - 1], 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 Task1 (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_YELLOW + 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_BGND_BLUE);
OSTimeDlyHMSM(0, 0, 0, 100); } }
void Task2 (void *pdata) {
char msg[20]; pdata = pdata;
strcpy(&msg[0], " Hello World!"); for (;;) {
OSQPost(MsgQueue, 【(void *)】&msg[0]); OSTimeDlyHMSM(0, 0, 0, 500); } }
二.名词解释
1.代码的临界段
代码的临界段也称为临界区,指处理时不可分割的代码。
2.资源
任何为任务所占用的实体都可称为资源。
资源可以是输入输出设备;资源也
可以是一个变量,一个结构或一个数组等。
3.共享资源
可以被一个以上任务使用的资源叫做共享资源。
4.任务
一个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU完全只属该程序自己。
典型地、每个任务都是一个无限的循环。
5.任务切换
指Context Switch,其含义是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代之以移植性强的整数数据类型,这样,既直观又可移植(该数据类型不依赖于编译),举例如下:
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 文件中定义。
这种重复的定义很容易导致错误。
µCOS-II采用的方法只需用在头文件中定义一次。
uC/OS_II.H 头文件中包括以下定义全局宏定义:
#ifdef OS_GLOBALS
#define OS_EXT #else
#define OS_EXT extern
#endif
OS_EXT INT32U OSIdleCtr;
同时,uCOS_II.H有中以下定义:
#define OS_GLOBALS
#include “includes.h”
当编译器处理uCOS_II.C时,它使得头文件变成如下所示,因为OS_EXT被设置为空。
INT32U OSIdleCtr;
这样编译器就会将这些全局变量分配在内存中。
当编译器处理其他.C文件时,头文件变成了如下的样子,因为OS_GLOBAL没有定义,所以OS_EXT被定义为extern。
extern INT32U OSIdleCtr;
在这种情况下,不产生内存分配,而任何.C文件都可以使用这些变量。
这样的就只需在.H 文件中定义一次就可以了。
3. OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL()的含义及作用?
答:OS_ENTER_CRITICAL() :关中断;OS_EXIT_CRITICAL():开中断。
关中断和开中断是为了保护临界段代码。
用户的应用代码可以使用这两个宏来开中断和关中断。
很明显,关中断会影响中断延迟,所以要特别小心。
用户还可以用信号量来保护临界段代码。
4.基于PC的服务中如何测量PC_DisplayChar()的执行时间?答:
测量PC_DisplayChar()的执行时间的代码如下:
INT16U time; //定义时间变量
PC_ElapsedInit(); //时钟初始化
PC_ElapsedStart(); //开始计时
PC_DispChar(40, 24, …A‟, DISP_FGND_WHITE); //执行代码
time = PC_ElapsedStop(); //结束计时
5.uC/OS-II的任务框架答:
void task_xxx(void *pData) { /* 该任务的初始化工作*/ ……
/* 进入该任务的死循环*/ while(1) { ……} }
每个用户的任务都必须符合事件驱动的编程模型,即uC/OS-II的应用程序都必须是“事件驱动的编程模型”。
一个任务首先等待一个事件的发生,事件可以是系统中断发出的,也可以是其它任务发出的,又可以是任务自身等待的时间片。
当一个事件发生了,任务再作相应处理,处理结束后又开始等待下一个事件的发生。
如此周而复始的任务处理模型就是“事件驱动的编程模型”。
事件驱动模型也涵盖了中断驱动模型,uC/OS-II事件归根结底来自三个方面:
(1)中断服务函数发送的事件(2)系统延时时间到所引起的(3)其它任务发送的事件。
6.与共享资源打交道时,使之满足互斥条件最一般的方法包括哪些?答:
包括:关中断、使用测试并置位指令、禁止做任务切换、利用信号量等。
7. 描述利用μC/OS_Ⅱ宏调用关中断和开中断处理共享数据的示意性代码程序。
答:
OS_ENTER_CRITICAL(); /*在这里处理共享数据*/ OS_EXIT_CRITICAL();
8. 信号量的典型应用包括哪些?答:
信号量(Semaphores) 是一种约定机制,在多任务内核中的典型应用包括:
(1)控制共享资源的使用权(满足互斥条件);(2)标志某事件的发生(3)使两个
任务的行为同步
9.对信号量只能实施哪三种操作?答:
一般地说,对信号量只能实施三种操作:
(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);
}
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: 任务代码的指针;
pdata: 当任务开始执行时传递给任务的参数的指针; ptos: 分配给任务的堆栈的栈顶指针; 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 *pdata) {
/* 用户代码*/
OSTaskDel(OS_PRIO_SELF); }
14.μC/OS-Ⅱ任务管理提供哪些服务?答:μC/OS-Ⅱ任务管理提供的服务包括:
(1)建立任务:OSTaskCreate()或OSTaskCreateExt();(2)删除任务:OSTaskDel();(3)请求删除任务:OSTaskDelReq();
(4)改变任务的优先级:OSTaskChangePrio();(5)挂起任务:OSTaskSuspend();(6)恢复任务:OSTaskResume();
(7)获得有关任务的信息:OSTaskQuery()。
15.μC/OS-Ⅱ时间任务管理提供哪些服务?答:μC/OS-Ⅱ时间任务管理提供的服务包括:(1)任务延时函数:OSTimeDly()
(2)按时分秒延时函数:OSTimeDlyHMSM()
(3)让处在延时期的任务结束延时:OSTimeDlyResume() (4)设置系统时间:OSTimeGet() (5)获得系统时间:OSTimeSet()
16. μC/OS-Ⅱ提供的数据共享和任务通讯的方法包括哪些?
答:μC/OS-Ⅱ提供的数据共享和任务通讯的方法包括五种方法:
(1) 利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和
打开中断。
(2) 利用函数OSSchedLock()和OSSchekUnlock()对µC/OS-II中的任务调度函
数上锁和开锁。
(3) 信号量。
(4) 邮箱。
(5) 消息队列。
17.对于事件控制块进行的一些通用包括哪些操作?答:对于事件控制块进行的一些通用操作包括:
(1)初始化一个事件控制块: OSEventWaitListInit(); (2)使一个任务进入就绪态:OSEventTaskRdy();
(3)使一个任务进入等待该事件的状态:OSEventTaskWait();(4)因为等待超时而使一个任务进入就绪态:OSEventTO()。
18.μC/OS-Ⅱ信号量提供哪些服务?答:μC/OS-Ⅱ信号量提供的服务包括:
(1)建立一个信号量:OSSemCreate();(2)等待一个信号量:OSSemPend();(3)发送一个信号量:OSSemPost();
(4)无等待地请求一个信号量:OSSemAccept();(5)查询一个信号量的当前状态:OSSemQuery()。
19.μC/OS-Ⅱ邮箱提供哪些服务?答:μC/OS-Ⅱ邮箱提供的服务包括:
(1)建立一个邮箱:OSMboxCreate();
(2)等待一个邮箱中的消息:OSMboxPend();(3)发送一个消息到邮箱中:OSMboxPost();(4)无等待地从邮箱中得到一个消息:OSMboxAccept();(5)查询一个邮箱的状态:OSMboxQuery()
20.μC/OS-Ⅱ消息队列提供哪些服务?答:μC/OS-Ⅱ消息队列提供的服务包括:(1)建立一个消息队列:OSQCreate();
(2)等待一个消息队列中的消息:OSQPend();(3)向消息队列发送一个消息(FIFO):OSQPost();(4)向消息队列发送一个消息(LIFO):OSQPostFront();(5)无等待地从一个消息队列中取得消息:OSQAccept();(6)清空一个消息队列:OSQFlush();
(7)查询一个消息队列的状态:OSQQuery()。
21.μC/OS-Ⅱ内存管理提供哪些服务?答:μC/OS-Ⅱ内存管理提供的服务包括:
(1)建立一个内存分区:OSMemCreate();(2)分配一个内存块:OSMemGet();(3)释放一个内存块:OSMemPut();
(4)查询一个内存分区的状态:OSMemQuery()。
22.移植µC/OS-Ⅱ时,要使µC/OS-Ⅱ正常运行,处理器必须满足哪些基本要求?答:要使µC/OS-Ⅱ正常运行,处理器必须满足以下要求:
(1) 处理器的C编译器能产生可重入代码。
(2) 用C语言就可以打开和关闭中断。
(3) 处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。
(4) 处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。
(5) 处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的
指令。
四.论述题
1. 论述μC/OS-Ⅱ控制下的任务状态转换图答:μC/OS-Ⅱ控制下的任务状态转换图如下图所示。
在任一给定的时刻,任务的状态一定是在这五种状态之一。
(1) 睡眠态(DORMANT):指任务驻留在程序空间之中,还没有交给μC/OS-Ⅱ
管理。
一个任务可以通过调用OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。
(2) 就绪态(READY):当任务一旦建立,这个任务就进入就绪态准备运行。
把
任务交给μC/OS-Ⅱ是通过调用下述两个函数之一:OSTaskCreate()或OSTaskCreateExt()。
(3) 运行态(RUN): 调用OSStart()可以启动多任务。
OSStart()函数运行进入就
绪态的优先级最高的任务。
(4) 等待状态(WAITING): 正在运行的任务可以通过调用两个函数之一将自
身延迟一段时间,这两个函数是OSTimeDly()或OSTimeDlyHMSM()。
这个任务于是进入等待状态,等待这段时间过去,下一个优先级最高的、并进入了就绪态的任务立刻被赋予了CPU 的控制权。
正在运行的任务期待某一事件的发生时也要等待,手段是调用以下3个函数之一:OSSemPend(),OSMboxPend(),或OSQPend()。
调用后任务进入了等待状态(WAITING)。
(5) 中断状态(ISR): 正在运行的任务是可以被中断的,除非该任务将中断关
了,或者μC/OS-Ⅱ将中断关了。
被中断了的任务就进入了中断服务态
(ISR)。
2. 论述μC/OS-Ⅱ的核心数据结构任务控制块(OS_TCBs) 答:
任务控制块(OS_TCBs)是μC/OS-Ⅱ的核心数据结构,当任务的CPU使用权被剥夺时,μC/OS-Ⅱ用它来保存该任务的状态。
当任务重新得到CPU使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差地继续执行。
OS_TCBs全部驻留在RAM中。
一旦任务建立了,。