嵌入式系统原理及接口技术考试题库汇编Word格式文档下载.docx
《嵌入式系统原理及接口技术考试题库汇编Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《嵌入式系统原理及接口技术考试题库汇编Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
系统接收到中断请求后,如果这是CPU处于中断允许状态,系统会中止正在运行的当前任务,而按照中断向量的指向转而去运行中断服务子程序;
当中断服务子程序的运行结束后,系统会根据情况返回到被中止的任务,或转向更高优先级的任
17全局变量OSIntNesting的作用:
记录中断嵌套的层数。
18操作系统的时钟:
操作系统中特定的周期性中断为系统提供时间依据。
19在UC/OS-II中,时钟节拍服务做了什么工作?
时钟节拍服务做了:
可以使人物延时若干个整数的时钟节拍以及当任务等待事件发生时提供等待超时依据。
20说明延时函数OSTimeDly()与OSTimeDlyHMSM()的区别:
OSTimeDly():
时钟节拍数;
OSTimeDlyHMSM():
按照时分秒的设置延时
21使用信号量可在应用程序中完成哪些工作?
任务间通信完成共享资源的访问任务的同步执行
22什么叫优先级反转?
这种现象什么情况下发生?
有什么危害?
在可剥夺型内核中,当任务以独占方式使用共享资源时,会出现低优先级任务先于高优先级任务而被运行的情况。
称优先级反转。
一个低优先级任务在获得信号量使用共享资源期间,被高优先级任务所打断而不能释放信号量,从而使正在等待该信号量的高优先级任务因得不到信号量而被迫处于等待状态。
在等待期间,就让占据该信号量的低优先级任务先运行
如果这种情况发生较多,则会极大地恶化优先级任务地运行环境。
23互斥型信号量是如何防止优先级反转的?
在低优先级的任务要使用共享资源前将其优先级提升到高于可能使用该共享资源的任务优先级,使用完共享资源后在讲其优先级恢复到原值。
251.UC/OS-II为什么要定义信号量集?
在实际运用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用得结果来决定任务得运行方式。
信号量集就是实现这种功能的数据结构。
26信号量集所管理的是什么信号?
信号量集所管理的信号量都是二值信号。
它实质上是一种可以对多个输入的逻辑信号进行基本逻辑运算(“与”运算(AND),“或”运算(OR))的组合逻辑。
27使用信号量集可以在程序中完成哪些工作?
信号量集用一个双向链表来组织等待任务,每一个等待任务都是该链表中的一个节点
28什么叫内存分区?
什么叫内存块?
内存分区与内存块之间有什么关系?
内存分区与内存块:
操作系统将大片连续的内存分区管理,每个分区内含有整数个大小相同的内存块
29在同一个内存分区中内存块是按什么方式组织起来的?
每个分区又分成若干大小相等的内存块来进行管理
30什么叫内存控制块?
它记录了一些什么信息?
内存控制块是由uC/OS-II为每个内存分区定义的一个数据结构。
系统用它来记录和跟踪每一个内存分区的状态。
嵌入式系统是以应用为中心,以计算机技术为基础,且软硬件可裁减,适应应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
它一般由以下几部分组成:
嵌入式微处理器外围硬件设备嵌入式操作系统特定的应用程序
特点:
应用的特定性和广泛性
技术、知识、资金的密集性
高效性
较长的生命周期
高可靠性
软硬一体,软件为主
无自举开发能力
µ
C/OS-Ⅱ简介
特点之一是:
结构小巧。
包含全部功能的核心部分代码只占用8.3K字节,同时由于µ
C/OS-Ⅱ是可裁剪的,所以用户系统中实际的代码最少可达2.7K字节。
特点之二:
是一个真正的实时操作系统。
实时操作系统一般定义为“一个能够在指定的或者确定的时间内,完成系统功能和对外部或内部、同步或异步事件做出响应的系统”。
特点之三是:
C/OS-Ⅱ实际上是一个实时操作系统内核,只包含了任务调度、任务管理、时间管理、内存管理和任务间的通信与同步等基本功能。
12、简述μC/OS-II的主要特点。
可移植性:
μC/OS-II的源代码绝大部分是使用移植性很强的ANSIC写的,将与微处理器硬件相关的汇编语言使用量压缩到最低的限度,以使μC/OS-II便于移植到其它微处理器上。
可剪裁:
μC/OS-II使用条件编译实现可剪裁。
占先式:
μC/OS-II是占先式实时内核,总是运行就绪条件下优先级最高的任务。
多任务:
μC/OS-II可以管理64个任务,其中8个作为系统保留,所以实际用户可使用的为56个任务。
可确定性:
μC/OS-II的函数调用与系统服务的执行时间是可知的。
任务栈:
μC/OS-II的每个任务都有自己单独的栈。
中断管理:
μC/OS-II允许中断嵌套层数可达255层。
13、简述μC/OS-II实时内核中任务调度器的原理。
μC/OS-II根据组变量、表变量得到优先级最高的任务,通用公式是:
OSUnMapTbl[OSRdyGrp]>
>
3+OSUnMapTbl[OSRdyTbl[OSRdyGrp]]。
这里OSRdyGrp为组变量,OSRdyTbl为表变量。
14、说明函数OSTimeTick()、OSTimeDly()的主要任务。
OSTimeTick()的主要任务就是定期将时间延时项OSTCBDly减1,直至为0。
任务延时函数OSTimeDly(),可置任务控制块OSTCBDly的值为所需要的,一旦对某个任务调用了OSTimeDly()函数,则该任务将被挂起,直到OSTCBDly被减为0。
15、简述解决互斥的3种办法,它们各有何优缺点。
常用的解决互斥的3种办法包括:
关闭中断法,进程在进入临界区后立即关中断,在离开时开中断,这样就可以简单的实现任务互斥。
优点:
这是实现互斥最简单的办法。
缺点:
把禁止中断的权利交给用户进程很危险,若一个进程禁止中断后不再打开中断,整个系统会因此而中止。
锁变量法,对临界资源设置一个锁变量,初值为0。
是忙等待的解决方案,会浪费大量的CPU时间。
信号量法,设置一个初值为1的信号量便能很好的解决互斥问题。
这种方法是迄今最完全的解决方案。
16、信号量是如何实现同步的?
信号量能很好的解决同步问题,为此,必须进行如下设置(这样的安排是保证进程同步的关键):
设置一个初值为0的信号量;
在进程A的同步点X处安排关于信号量的P操作;
在进程B的Y处安排关于信号量的V操作。
中断:
任务在运行过程中,应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要求的任务的过程叫做中断。
中断服务程序:
应中断请求而运行的程序叫中断服务子程序(ISR)。
中断向量:
中断服务子程序的入口地址叫中断向量。
CPU响应中断的条件:
•至少有一个中断源向CPU发出中断信号
•系统允许中断,且对此中断信号未予屏蔽
任务间的同步依赖于任务间的通信。
在uC/OS-II中,使用信号量、邮箱和消息队列这些被称作事件的中间环节来实现任务间的通信。
使用信号量的目的:
为共享资源设立一个表示该共享资源被占用情况的标志。
在实际应用中,任务常常需要于多个事件同步,即根据多个信号量组合作用的结果来决定任务的运行方式。
信号量集所能管理的信号量一般都是二值信号。
请求信号量集的任务得以继续运行的条件与所请求的信号量之间有两种逻辑关系:
AND和OR。
uc/os-ii的任务有5种状态
睡眠态(DORMANT):
任务以代码形式驻留在程序空间,还没有交给uc/os管理,即还没有配备任务控制块,还没有被创建。
就绪态(READY):
系统为任务配备了任务控制块,且在任务就绪表中就行了就绪登记。
运行态(RUNNING):
正在使用CPU的状态称运行态。
等待态(WAITING):
等待一段时间或某事件发生再运行的状态。
中断服务态(ISR):
正在运行的任务被中断时就进入了中断服务态(ISR)。
任务控制块(TaskControlBlocks,OS_TCBs)是ucos-ii用来存储任务堆栈指针、当前状态、优先级及任务链表指针等属性的一个数据结构。
创建任务时,必须创建任务控制块,通过控制块初始化函数OSTCBInit()完成,其做三件事:
从空任务控制块链表获取一个任务控制块;
用任务的属性对任务控制块各个成员进行赋值;
把这个任务控制块链入到任务控制块链表。
1、任务的存储结构主要由哪三部分组成?
答:
任务程序代码,任务堆栈,任务控制块。
uc/os-ii预定义了两个为应用程序服务的系统任务:
空闲任务和统计任务,其中空闲任务是每个程序必须使用的,而统计任务是应用程序可根据实际情况需要选择使用。
任务删除函数:
OSTaskDel()
#ifOS_task_del_en
INT8UOSTaskDel(INT8Uprio);
时钟:
任务操作系统都要提供一个周期性的信号源,以供系统提供处理诸如任务的等待,延时等与时间有关的事件,这个周期性的信号源叫时钟。
最小的的时钟单位就是两次中断之间间隔的时间,这个最小时钟单位叫着时钟节拍(timetick)
事件控制块:
为了把描述的事件的数据结构统一起来,uc/os-ii把事件等待任务表和与事件相关的其他信息组合起来定义了一个叫着事件控制块的ECB的数据结构。
什么是任务切换?
任务切换时主要完成哪些工作?
中止正在运行的任务,转而去运行另外的一个任务的工作。
也就是暂停现行任务,去完成另一个任务。
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)。
(4)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();
//结束计时
5.uC/OS-II的任务框架
voidtask_xxx(void*pData)
{/*该任务的初始化工作*/
……
/*进入该任务的死循环*/
while
(1)
{
}
}
事件驱动模型也涵盖了中断驱动模型,uC/OS-II事件归根结底来自三个方面:
(1)中断服务函数发送的事件
(2)系统延时时间到所引起的(3)其它任务发送的事件。
填空题
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(挂起)相关函数后,将进入等待状态。
【中断状态(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】。
C/OS-II中表示当前内核运行的标记全局变量名为:
【OSRunning】。
二.名词解释
1.代码的临界段代码的临界段也称为临界区,指处理时不可分割的代码。
2.资源任何为任务所占用的实体都可称为资源。
资源可以是输入输出设备;
资源也可以是一个变量,一个结构或一个数组等。
3.共享资源可以被一个以上任务使用的资源叫做共享资源。
4.任务一个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU完全只属该程序自己。
典型地、每个任务都是一个无限的循环。
5.任务切换指ContextSwitch,其含义是CPU寄存器内容切换。
当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Context),即CPU寄存器中的全部内容。
6.内核多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。
内核提供的基本服务是任务切换。
7.调度(Scheduler)内核的主要职责之一,就是要决定该轮到哪个任务运行了。
多数实时内核是基于优先级调度法的。
8.可剥夺型内核最高优先级的任务一旦就绪,总能得到CPU的控制权。
当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。
如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。
OS_TASK_SW()函数需要用户移植实现,主要内容如下:
1.把全部CPU寄存器(包括堆栈指针寄存器和PC寄存器)推入当前任务堆栈;
2.调用OSTaskSwHook()函数;
3.OSPrioCur=OSPrioHighRdy;
4.OSTCBCur=OSTCBHighRdy;
5.设置处理器的堆栈指针寄存器为OSTCBHighRdy->
OSTCBStkPtr;
6.恢复所有处理器的寄存器内容(不包括堆栈指针寄存器和PC寄存器);
7.恢复PC寄存器并开始执行PC指向的指令。
三.简答题
1.举例说明µ
COS-II可移植型数据类型的定义方式
因为不同的微处理器有不同的字长,µ
C/OS-II的移植文件包括很多类型定义以确保可移植性。
COS-II不使用C语言中的short,int,long等数据类型的定义,因为它们与处理器类型有关,隐含着不可移植性。
C/OS-II代之以移植性强的整数数据类型,这样,既直观又可移植(该数据类型不依赖于编译),举例如下:
typedefunsignedcharBOOLEAN;
typedefunsignedcharINT8U;
typedefsignedcharINT8S;
typedefunsignedintINT16U;
typedefsignedintINT16S;
typedefunsignedlongINT32U;
typedefsignedlongINT32S;
2.µ
COS-II如何定义全局变量?
众所周知,全局变量应该是得到内存分配且可以被其他模块通过C语言中extern关键字调用的变量。
因此,必须在.C和.H文件中定义。
这种重复的定义很容易导致错误。
COS-II采用的方法只需用在头文件中定义一次。
uC/OS_II.H头文件中包括以下定义全局宏定义:
#ifdefOS_GLOBALS
#defineOS_EXT
#else
#defineOS_EXTextern
#endif
OS_EXTINT32UOSIdleCtr;
同时,uCOS_II.H有中以下定义:
#defineOS_GLOBALS
#include“includes.h”
当编译器处理uCOS_II.C时,它使得头文件变成如下所示,因为OS_EXT被设置为空。
INT32UOSIdleCtr;
这样编译器就会将这些全局变量分配在内存中。
当编译器处理其他.C文件时,头文件变成了如下的样子,因为OS_GLOBAL没有定义,所以OS_EXT被定义为extern。
externINT32UOSIdleCtr;
在这种情况下,不产生内存分配,而任何.C文件都可以使用这些变量。
这样的就只需在.H文件中定义一次就可以了。
10.给出μC/OS-Ⅱ中如何用信号量处理共享数据的示意代码?
通过获得信号量处理共享数据的示意代码如下:
OS_EVENT*SharedDataSem;
voidFunction(void)
{
INT8Uerr;
OSSemPend(SharedDataSem,0,&
err);
/*共享数据的处理在此进行,(中断是开着的)*/
OSSemPost(SharedDataSem);
}
11.给出初始化和启动μC/OS-Ⅱ的示意代码。
voidmain(void)
{
OSInit();
/*初始化uC/OS-II*/
通过调用OSTaskCr