一、填空题(请将答案填入题后括号中):共10小题,每小题2分,满分20分。
1、一般而言,嵌入式系统的构架可以分为4个部分:分别是(处理器)、存储器、输入/输出和软件,一般软件亦分为操作系统相关和(应用软件)两个主要部分。
2、根据嵌入式系统使用的微处理器,可以将嵌入式系统分为嵌入式微控制器,
(嵌入式微处理器)(嵌入式DSP处理器)以及片上系统。
3、操作系统是联接硬件与应用程序的系统程序,其基本功能有
(任务管理)、任务间通信、(内存管理)和I/O资源管理。
4.实时系统:指系统能够在限定的(响应)时间内提供所需水平的服务
5.ucos-ii最多管理(64 )个任务
6.ucos-ii中,OS_TaskStat任务的优先级占(62 ),OS_TaskIdle任务的优先级是( 63 )
7 ucos-ii中,OSRdyTbl就绪表的大小是由宏定义:OS_RDY_TBL_SIZE来定义,由全局宏
( OS_LOWEST_PRIO )来决定的,
8. TCB中的四个成员变量:INT8U OSTCBX;INT8U OSTCBY;INT8U OSTCBBitX;
INT8U OSTCBBitY ,用于(加速)任务就绪态的计算过程。
9.TCB内部最重要的元素放在第一个单元叫(OSTCBStkPtr),因此,这个变量是惟一一个能用汇编语言处置的变量,将其放在结构最前面,使得在汇编语言中处理这个变量时较为容易。
10. uC/OS-II是一个简洁、易用的基于优先级的嵌入式(抢占式)多任务实时内核。 11.任务是一个无返回的无穷循环。uc/os-ii总是运行进入就绪状态的(最高优先级)的任务。
12.因为uc/os-ii总是运行进入就绪状态的最高优先级的任务。所以,确定哪个任务优先级最高,下面该哪个任务运行,这个工作就是由调度器(scheduler)来完成的。
13.(不可剥夺型)内核要求每个任务自我放弃CPU的所有权。不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。
14.当系统响应时间很重要时,要使用(可剥夺型)内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。
15.(可重入型)函数是可以被一个以上的任务调用,而不必担心数据的破坏。
16.每个任务都有其优先级。任务越重要,赋予的优先级应(越高)。
17.μC/OSⅡ初始化是通过调用系统函数(OSIint() )实现的,,完成μC/OS-Ⅱ所有的变量和数据结构的初始化。
18.多任务的启动是用户通过调用(OSStart() )实现的。然而,启动μC/OS-Ⅱ之前,用户至少要建立一个(任务)。
19.删除任务,是说任务将返回并处于(休眠状态),并不是说任务的代码被删
除了,只是任务的代码不再被μC/OS-Ⅱ调用。
20.μC/OS-Ⅱ要求用户提供(定时中断)来实现延时与超时控制等功能。
21.μC/OS-Ⅱ中,定时中断也叫做(时钟节拍),在低速系统中,它应该每秒发生10至100次。
22. 时钟节拍的实际频率是由用户的应用程序决定的。时钟节拍的频率越高,系统的负荷就(越重)。
23. μC/OS-II中表示当前已经创建的任务数全局变量名为:( OSTaskCtr)。
24. μC/OS-II中表示当前内核运行的标记全局变量名为:( OSRunning )。
25. μC/OS-II操作系统使用OSSchedLock()函数和OSSchedUnlock()函数进行锁定(不允许任务级调度)和解锁(重新允许任务级调度)调度器,在用户应用程序中,OSSchedLock()和OSSchedUnlock()必须是(成对出现的)。否则,有可能出错。
二、选择题(请将答案填入题后括号中):共10小题,每小题2分,满分20分。
1、要使μC/OS-II能够正常工作,下列哪个条件不是处理器必须满足的。(D )
(A) 处理器的编译器能够产生可重入代码
(B)在程序中可以找开或者关闭中断
(C) 处理器支持中断,并且能产生定时中断
(D)有大量的存储空间
2、下面哪种操作系统最方便移植到嵌入式设备中。(D )
(A) DOS
(B)UNIX
(C) Windows xp
(D)LINUX
3、下面哪个选项不是USB设备的特点。(B )
(A)串行通信方式(B)不可热拨插
(C)分HOST、DEVICE和HUB (D)通信速率比RS232快
4、下面哪种嵌入式操作系统很少用于手机终端设备上。( C )
(A) Symbian (B)WINCE
(C) uc/os (D)LINUX
5、以下哪项关于SRAM和DRAM的区别是不对。( A)
(A)SRAM比DRAM慢(B)SRAM比DRAM耗电多
(C)DRAM存储密度比SRAM高得多(D)DRAM需要周期性刷新
6 、UCOS不包含哪些状态
(A)运行(B)挂起
(C)退出(D)休眠
7、0X07 & 0X11 的运算结果是。(A)
(A)0X01 (B)0X11
(C)0X17 (D)0X07
8、以下哪种方式不是UC/OS操作系统中任务之间通信方式。( C )
(A)信号量(B)消息队列
(C)邮件(D)邮箱
9、以下哪种方式不是文件系统的格式。( B )
(A) F A T(B)DOS
(C) NTFS (D)EXT
10、在将UC/OS操作系统移植到ARM处理器上时,以下哪些文件不需要修改。( A )
(A)OS_CORE.C (B)INCLUDE.H
(C)OS_CPU.H (D)OSTASKINIT
三、简答题:共2小题,每小题10分,满分20分。
1、根据嵌入式系统的特点,写出嵌入式系统的定义。
答:以应用为中心,以计算机技术为基础,软硬件可裁减,功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
2、试分析实时操作系统的工作状态特点及相互之间的转换。
运行:获得CPU控制权
就绪:进入任务等待队列,通过调度中转为运行状态
挂起:任务发生阻塞,出任务等待队列,等待系统实时事件的发生而被唤醒
从而转为就绪或者运行.
休眠:任务完成或者错误等原因被清除的任务,也可以认为是系统中不存在任务
2、试写抢占式和非抢占式的区别。
答:执行的过程中对中断处理方式不一样,抢占式:某一中断执行完成后,如果有更高优先级的任务处于就绪状态,将执行更高优先级任务,而非抢占式不一样,一个任务只有主动放弃CPU的控制权,其它任务才能够获得CPU控制权。
4 、从嵌入式系统底层到上层应用软件,试分析嵌入式计算系统的组成主要分为哪几个部分,并写出各部分所完成的功能。
答:(1)硬件层
(2)中间层(嵌入式系统初始化,硬件相关的驱动程序)
(3)软件层(操作系统。文件系统。GUI,网络及通用组件)
(4)功能层
5、专业名词解释(写出以下英文简写对应的中文名称及解释
(1)RTOS :实时操作系统
(2)CISC :复杂指令集
(3)Kernel :内核
(4)Scheduler :调度
(5)non-preemptive :非抢占式
6.就绪表中完整的数据结构描述
答:就绪表中有2个变量,OSRdyGrp和OSRdyTbl[]。OSRdyGrp中任务按优先级分组,8个任务为一组。OSRdyGrp的每一位表示8组任务中每一组是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl[]中相应的元素的相应位被置1。
7、什么是任务上下文切换时间?任务上下文切换时间受哪些因素的影响?
答:
在多任务操作系统中,任务上下文切换指CPU的控制权由当前运行的任务转移到另外一个就绪任务这一过程。这个阶段所花费的时间中,保存退出运行的任务的上下文所花费的时间与恢复将投入运行的任务的上下文所花费的时间主要取决于处理器的速度和任务上下文的数量。处理器的速度高,任务上下文少,保存和恢复上下文所花费的时间就短,反之保存和恢复上下文所花费的时间就长。选择将投入运行的任务所花费的时间则主要取决于操作系统的调度程序所采用的任务选择算法。
3.描述建立任务OSTaskCreate()的函数原型。
答:建立任务OSTaskCreate()的函数原型为:
I N T8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)
其中, task: 任务代码的指针;
pdata: 当任务开始执行时传递给任务的参数的指针;
p t o s:分配给任务的堆栈的栈顶指针;
p r i o:分配给任务的优先级。
2.简述uC/OS-II的任务框架
答:
void task_xxx(void *pData)
{
/* 该任务的初始化工作 */
……
/*进入该任务的死循环 */
while(1)
{
……
}
}
四、编程题
1.举例说明μC O S-I I可移植型数据类型的定义方式
答:因为不同的微处理器有不同的字长,μC/O S-I I的移植文件包括很多类型定义以确保可移植性。μC O S-I I不使用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 IN T16S;
typedef unsigned long INT32U;
typedef signed long INT32S;
2. 试写出OSStartHighRdy( )函数的示意代码
void OSStartHighRdy()
{
调用用户定义的OSTaskSwHook();
OSRuning = TRUE;
得到将要恢复运行任务的堆栈指针:
Stack pointer = OSTCBHighRdy->OSTCBStkPtr;
从新任务堆栈中恢复处理器的所有寄存器;
执行中断返回指令;
}
2. 试写出函数 OSCtxSw( )的示意性代码:
void OSCtxSw()
{
保存处理器寄存器;
在当前任务的任务控制块中保存当前任务的堆栈指针: OSTCBCur->OSTCBStkPtr = stack pointer;
OSTaskSwHook();
OSTCBCur=OSTCBHighRdy;
OSPrioCur=OSPrioHighRdy;
得到将要开始运行的任务的堆栈指针:
Stack pointer = OSTCBHighRdy->OSTCBStkPtr;
从新任务的任务堆栈中恢复处理器所有寄存器的值;
执行中断返回指令;
}
3、试写出函数OSIntCtxSw()函数的示意性代码:
void OSIntCtxSw()
{
调用用户定义的
OSTackSwHook();
OSTCBCur=OSTCBHighRdy;
OSPrioCur=OSPrioHighRdy;
得到将要重新执行的任务的堆栈指针:
Stack pointer = OSTCBHighRdy->OSTCBStkPtr;
从新任务堆栈中恢复所有寄存器;
执行中断返回指令;
}
4、试写出函数 OSTickISR()函数的示意性代码:
void OSTickISR()
{
保存处理器寄存器;
调用OSInitEnter( )或者OSInitNesting加1;
if(OSInitNesting ==1)
{
OSTCBCur->OSTCBStkPtr=stack pointer;
}
给产生中断的设备清中断;
重新允许中断;
OSTimeTick();
OSInitExit();
恢复处理器寄存器;
执行中断返回指令;
}
5、编写使任务进入就绪态代码:
OSRdyGrp |=OSMapTbl[prio>>3];
OSRdyTbl[prio>>3] |=OSMapTbl[prio&0x07];
6、编写使任务脱离就绪态代码:
if((OSRdyTbl[prio>>3] &= ~OSMapTbl[prio &0x07])==0)
OSRdyGrp &= ~OSMapTbl[prio>>3];
7、编写找到进入就绪态的优先级最高的任务,并计算其优先级值的代码:
y = OSUnMapTbl[OSRdyGrp];
x = OSUnMapTbl[OSRdyTbl[y]];
prio = y<<3+x;