当前位置:文档之家› 嵌入式操作系统复习资料

嵌入式操作系统复习资料

嵌入式操作系统课程复习(嵌入式操作系统原理)一、真空题1.根据系统中的任务获得使用CPU的权力的方式,多任务实时操作系统的内核分为可剥夺型和不可剥夺型两种类型。

2.实时操作系统需要满足的条件包括多任务、可剥夺型内核、任务切换时间固定、中断延时尽量短。

3.目前比较常见的操作系统有_WinCE_、_uCLinux_、_Uc/OC-II_等。

4.在ucos-ii中任务的状态包括_睡眠状态_、就绪状态_、运行状态、中断服务状态_等。

5.在ucos-ii中任务由_任务的代码_、任务控制块_、_任务堆栈_三个部分组成。

6.在ucos-ii中提供的空闲任务OSTaskIdle()的作用是完成_对OSdleCtr计数器加1_。

7.在ucos-ii中提供的统计任务OSTaskStat()的作用是完成_CPU利用率OSCPUUsage统计。

8.在ucos-ii中任务的调度主要完成_在任务就绪表中查找具有最高优先级别的就绪任务_、实现任务的切换两件事。

二、简答题1.代码的临界段?在ucos-ii中通过哪几种方式实现?在应用程序中,能够不受任何干扰而运行的代码段,称做临界段。

它主要通过开关中断技术实现。

用户可通过定义移植文件OS_CPU.H中的常数OS_CRITICAL_METHOD 来实现选择开关中断的实现方法分三种:1)直接用处理器指令2)在堆栈中保存中断的开关状态,然后再关中断。

3)通过编译器提供的c函数来保存处理器状态字的值。

#if OS_CRITICAL_METHOD == 1#define OS_ENTE R_CRITICAL() asm ("DI") //关中断#define OS_EXIT_CRITICAL() asm ("EI") //开中断#endif#if OS_CRITICAL_METHOD == 2#define OS_ENTER_CRITICAL() asm ("PUSH PSW,DI") //保存CPU状态,关中断#define OS_EXIT_CRITICAL() asm ("POP psw) //恢复中断允许标志#endif#if OS_CRITICAL_METHOD == 3#define OS_ENTER_CRITICAL() ("cpu_sr = get_processor_psw(),DI") //保存CPU状态,关中断#define OS_EXIT_CRITICAL() ("Set_processor_psw(cpu_sr)) //恢复中断允许标志#endif2.调度?在ucos-ii中其调度算法是什么?在多任务系统中,令CPU中止当前正在运行的任务转而去运行另一个任务的工作叫任务切换,而按某种规则进行任务切换的工作叫做任务的调度。

uCOS II总是运行进入就绪态任务中优先级最高的那一个。

3.可剥夺型内核?在可剥夺型内核中,CPU总是运行多个任务中优先级别最高的那个任务,即使CPU正在运行某个低优先级别的任务,当有高优先级别的任务准备就绪时,该高级别的任务就会剥夺正在运行任务的CPU的使用权,而使自己获得CPU的使用权。

4.时钟节拍的作用及实现方式?任何计算机系统都应该有一系统时钟,UCOS的系统时钟是通过硬件定时器产生中断来实现的,这个中断会产生一个时钟中断服务程序,时钟中断服务程序也叫做节拍服务。

各个任务运行都需要一个周期性的信号指示,即每一个任务允许运行的时间片是多少,必须规定好。

这个时间片就是系统时钟节拍。

5.什么是嵌入式操作系统?其特征是?运行在嵌入式硬件平台上,对整个系统及其所操作的部件、装置等资源进行统一协调、指挥和控制的系统软件就叫做嵌入式操作系统。

其特征包括:微型化、可裁剪性、实时性、高可靠性、易移植性。

6.解释构成uc0s-ii操作系统的16个文件的所属种类及用途?(1)移植时需要修改的与处理器相关的代码1)OS_CPU.HOS_CPU.H包括了用#defines定义的与处理器相关的常量,宏和类型定义。

2)OS_CPU_A.ASMOSStartHighRdy() //启动最高优先级就绪任务运行OSCtxSw() //任务切换OSIntCtxSw() //中断级任务切换OSTickISR() //时钟节拍服务3)OS_CPU_C.C主要完成任务堆栈初始化功能OSTaskStkInit()(1)与应用程序相关代码OS_CFG.H,INCLUDES.H(3)与处理器无关的代码OS_CORE.C;OS_Q.C;OS_FLAG.C;OS_SEM.C;OS_MBOX.C;OS_TASK.C;OS_MEM.C;OS_TIME.C;OS_MUTEX.C;uCOS_II.C;uCOS_II.H三、分析程序1.完成ucos-ii主函数注释。

void main (void){OSInit(); //___初始化ucos-ii_____PC_DOSSaveReturn(); //__保存DOS环境________PC_VectSet(uCOS, OSCtxSw); //_安装任务切换中断向量____OSTaskCreate(MyTask, //__创建任务MyTask______(void*)0, //__给任务传递参数______&TaskStartStk[TASK_STK_SIZE - 1],//__设置任务堆栈栈顶指针___0); //____MyTask任务的优先级别为0_OSStart(); //___启动多任务管理_____}2.完成ucos-ii启动多任务函数OSStart()注释。

void OSStart (void){INT8U y;INT8U x;if (OSRunning == FALSE) {_ //如果操作系统未运行,则进行一次调度,既运行优先级最高的任务y = OSUnMapTbl[OSRdyGrp]; //取出优先级最高的任务所在的任务组(行)_x = OSUnMapTbl[OSRdyTbl[y]]; //取出优先级最高的任务所在任务组(行)对应的列OSPrioHighRdy = (INT8U)((y << 3) + x); //__取得就绪态的最高优先级任务的优先权_ OSPrioCur = OSPrioHighRdy; //__将OSPrioHighRdy 指向当前运行任务优先级_ OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; //_最高优先级任务所对应的任务控制块OSTCBCur = OSTCBHighRdy; //_将OSTCBHighRdy赋予当前运行的任务控制块__ OSStartHighRdy(); //__启动最高优先级任务运行____}}3.完成ucos-ii时钟节拍中断服务程序OSTickISR()示意性代码的注释。

V oid OSTickISR(void){保存CPU寄存器;调用OSIntEnter(); //进入中断函数,实现OSIntNesting加1,用于记录中断嵌套层数If(OSIntNesting==1){ OSTCBCur->OSTCBStkPtr=SP;} //在任务控制块中保存堆栈指针调用OSTimeTick(); //节拍处理,完成OSTime+1、OSTCBDly-1,使到了延时时限的非挂起//任务进入就绪状态_清除中断;开中断;调用OSIntExit(); //_退出中断函数,实现OSIntNesting-1,并进行中断级任务切换_恢复CPU寄存器;中断返回;}四、计算题(共10分)已知某一已经就绪任务的优先级prio=30,试计算应该在就绪表的哪一位上置1。

答:30的二进制形式为0001.1110,低6位为011,110,于是可知应该在OSRdyTbl[3]的D6位上置1,同时把变量OSRdyGrp的D3位置1。

五、编程题写出任务级调度器OSSched()的核心代码,其中包括任务级切换OSCtxSw()的示意性代码。

(1)任务级调度器OSSched()主要代码如下:void OSSched(void){ INT8U y;OS_ENTER_CRITICAL();if ((OSLookNesting|OSIntNesting)==0){ y=OSUnMapTbl[OSRdyGrp];OSPrioHighRdy=(INT8U)((y<<3)+UnMapTbl[OSRdyTbl[y]]);//获取最高优先级任务if (OSPrioHighRdy!=OSPrioCur){ OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];//获得任务控制块指针OSCtxSwCtr++; //统计任务切换次数计数器加1OS_TASK_SW(); //执行任务切换宏}}}(2)任务级切换OSCtxSw()的示意性代码void OSCtxSw(void){用压栈指令把CPU通用寄存器R1、R2、……压入堆栈;OSTCBCur->OSTCBStkPtr=SP;在中止任务控制块中保存SPOSTCBCur=OSTCBHighRdy; //任务控制块切换OSPrioCur=OSPrioHighRdy; //任务优先权切换SP=OSTCBHighRdy->OSTCBStkPtr; //使SP指向待运行任务堆栈用出栈指令把R1、R2….弹入CPU通用寄存器RETI; //中断返回,使PC指向待运行任务}。

相关主题