嵌入式系统编程+嵌入式OS考前复习资料_第1页
嵌入式系统编程+嵌入式OS考前复习资料_第2页
嵌入式系统编程+嵌入式OS考前复习资料_第3页
嵌入式系统编程+嵌入式OS考前复习资料_第4页
嵌入式系统编程+嵌入式OS考前复习资料_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统编程复习重点试卷题型:填空(20X1分)判断(10X1分)名词解释(3X3分)程序填空(14X2)简答(3X5分)程序设计(2X9分)名词解释:前后台系统前后台系统又叫超循环系统,是不复杂系统常采用的设计方案。该系统由应用程序和中断服务程序组成。应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作。中断服务程序处理异步事件,时间相关性很强的关键操作靠中断服务来保证。应用程序称为后台,中断服务程序称为前台,故有前后台系统之称。时钟节拍时钟节拍是特定的周期性中断。这个中断可以看作是系统心脏的脉动。中断之间的时间间隔取决于不同的应用,一般在10mS到200mS之间。时钟的节拍式中断使得内核可以将任务延时若干个整数时钟节拍,以及当任务等待事件发生时,提供等待超时的依据。时钟节拍率越快,系统的额外开销就越大。异步串行通信的波特率异步串行通信的波特率是指数据信号传送速率,即单位时间内传输的二进制数的位数。它的单位是bit/s或bps任务调度任务调度是内核的主要职责之一,就是通过某种规则确定该哪个任务运行了。ADC量化将连续模拟信号转换为一串数字代码的过程称之为量化。程序填空题:时间戳(出题方向:将给定的时间转换成时间戳或将时间戳转换成确切时间,时间戳格式题目中会给出)一个时间戳(数据类型为TS)将一个日期和时间包装为一个32位的变量。在某些事件发生时可使用时间戳。不要在应用程序中直接操作时间戳,应使用本模块提供的函数或将函数添加到本模块中。主要是为了增强代码的复用性。时间戳的格式如下所示:B25--B22 B16 B12 B5 B0B31 B26 B21 B17 B11 B6年(6位)月(4位)日(5位) 时(5位)分(6位) 秒(6位)>—0.59——0„59——0..23——L31I——1.J20..63(实际的年份-CLK_TS_EASE_YKAR)将时间戳转换为ASCII字符串的格式。将时间戳转换为ASCII字符串的格式。voidClkFormatTS(INT8Un,TSts,char*s){INT16Uyr;INT8Umonth;INT8Uday;INT8Uhr;INT8Umin;INT8Usec;yr=CLK_TS_BASE_YEAR+(ts>>26);month=(ts>>22)&0x0F;day=(ts>>17)&0x1F;hr=(ts>>12)&0x1F;min=(ts>>6)&0x3F;sec=(ts&0x3F);}将日期和时间转化为时间戳的格式TSClkMakeTS(INT8Umonth,INT8Uday,INT16UyrINT8Uhr,INT8Umin,INT8Usec){TSts;yr-=CLK_TS_BASE_YEAR;ts=((INT32U)yr<<26)|((INT32U)month<<22)|((INT32U)day<<17);ts|=((INT32U)hr<<12)|((INT32U)min<<6)|(INT32U)sec;return(ts);}异步串行通信发送缓冲区和接收缓冲区图(PPT构件/第9章异步串行通信/20-31页)下图列出了使用环状缓冲区的输入缓冲。在接收字节时,ISR从串行端口读入字节(①),将其放入环状缓冲区(②);应用程序(后台)监测环状缓冲区是否收到了字节(③)。如果环状缓冲区不是空的,就从环状缓冲区中取出最“旧”的字节(最早收到的)。环形

缓冲区环形

缓冲区中断将会停止。如果应用程序不及时取出环状缓冲区中当应用程序从ISR或接口函数以独占方式访问环状缓冲区时,中断将会停止。如果应用程序不及时取出环状缓冲区中的字节,环状缓冲区将会被填满而导致接收字节丢失。处理输人数据的速度就与ISR处理输人数据的速度就与ISR只接收数据(不处理)的速度差不多一样快。为此,环状缓冲区的管理中加入了一个信号量,见下图。应用程序在信号量处等待①);收到一个字节后,ISR从串行端口读人字节(②),将其存入环状缓冲区(③)。然后ISR通知信号量,等待任务已收到一个字节(④)。信号发送给信号量,等待任务就准备运行。ISR完成后,内核决定等待任务是否成为占有CPU的最优先任务。如果是的话,并且内核为占先内核,则ISR恢复等待字节的任务。应用程序从环状缓冲区中取出字节,执行所要求的进程。注意:RxSem被初始化为注意:RxSem被初始化为0环状

缓冲区传输字节有时类似于接收字节。后台进程将字节存储于输出缓冲区中。当UART的发送端准备发送字节时,产生一个中断,字节从缓冲区中取出,并由ISR输出。在串行端口传输大量数据时,数据的缓冲有着重要意义,如对于磁盘文件的内容。下图列出了使用环状缓冲区的输出缓冲。发送一个或多个字节时,字节置于环状缓冲凶①)。在字节送人缓冲区后传输中断开始启动(②)。当UART发送字节准备就绪后,产生中断,ISR将最旧的字节(最远期的)从环状缓冲区取出(③)。字节向串行端口输出(④)。如果环状缓冲区已清空,则禁止传输中断。下图展示了怎样利用实时内核的机制。当缓冲区已满时,信号量作为交通信号灯暂停发送任务。为发送数据,任务等待信号量(①)。如果环状缓冲区未满,则任务继续向环状缓冲区存储数揪②)。如果存储的字节是环状缓冲区的第一个字节,则传输中断开始启动(③)。传输中断ISR从环状缓冲区中取出最旧的字节(④),同时通知信号量(⑤),表明环状缓冲区有空间接收另外的字符。接着ISR将字节输出给UART。

TxSem需要作为一个计数信号量,信号量需要初始化为环状缓冲区的大小。缓冲区注意:TxSem初始化为Tx环形缓冲区的大小TxSemTxSem需要作为一个计数信号量,信号量需要初始化为环状缓冲区的大小。缓冲区3.键盘状态机(PPT构件/第三章键盘/17页)用来扫描键盘及实现以前描述过的所有特征最简单的方法就是建立一个简单的状态机,如下图所示。该状态机在每次去除回弹周期内就执行一次。键按下:键按下计时器清零键没有按卜健仍然按卜-且超过未|可弹时间:找出按下哪一个健,将健代码放入缓冲区,V键按下:键按下计时器清零键没有按卜健仍然按卜-且超过未|可弹时间:找出按下哪一个健,将健代码放入缓冲区,V键按下计时器加1-~~健仍然按卜-且延时到未超过自自动重复/劝重矍,健按卜计时器加1等待下一

次重复健仍然按下IL延退到超过白动重复:找出哪个他被按下并将键代码放入缓冲区.也按下计时器加1等待下一

次重复键按下:如果(是重复之间的延退的结尾),找出嗤个键被按卜-并将键代码放入缓冲X,健按下计时器加I4.模拟输入/输出中ADC读取方法3(PPT26页)和读取方法1(PPT构件/第十二章模拟输入/输出/17-1924-26)下图'中假设ADC转换时间较慢(大于5ms)。在这里驱动程序(函数)读取一个模拟输入信道,并将转换结果返回到应用程序。应用程序调用下图所示的驱动程序,并传递给所希望的信道来读。驱动程序选择(通过多路复用器)所想要的模拟信道(①)开始读。开始转换前,或许需等待几微秒以便使信号通过多路复用器传播并使之稳定下来。如果不等多路复用

器的输出稳定下来,则读取的数也可能不稳定。下一步,ADC被触发以开始转换(②)。然后驱动程序延迟一段时间以完成转换(③)。请注意,延迟时间必须比ADC转换时间更长。延迟之后,驱动程序假设转换已完成并读取ADC(④)。然后将二进制结果返回到应用程序(⑤)。伪代码如下:ReadAnalogInputChannel(Channel#){Selectthedesiredanaloginputchannel;WaitforMUXoutputtostabilize;StartADCconversion;Delay'x'mStoallowforconversiontocomplete;ReadADCandreturnresulttothecaller;}这种方法简单,可用于变化慢的模拟信号。例如,可以用这种方法测量室温(变化不很快)。①模拟

专俞入MUXADC模拟

专俞入MUXADC模拟输入的二进制值返回到应用程序模拟输入的二进制值返回到应用程序驱动程序选择要读的模拟输入触发ADC进行转换驱动程序延时超过转换时间如果ADC的转换时间小于处理中断和等待信号量所需要的时间,则可用第三种方法。例如,根据微处理器的不同,转换时间小于25us的ADC不能提供需用时超过50us的中断信号和信号量的开销。换句话说,处理中断的时间和发信号并等待信号量的执行时间要超过25us。大多数8位和一些16位微处理器都是这样。应用程序调用如下图所示的驱动程序,并传递给所希望的模拟输入信道进行读。驱动器选择(通过多路复用器)这个信道开始读(①)。同样,在开始转换前,你可能要等待几微秒,以便使信号通过多路复用器传播并使之稳定下来。然后ADC检触发以便开始进行转换(②)。驱动程序接着在一个软件循环中等待(③)ADC直到完成转换。在循环等待时,驱动程序监视ADC的状态(EOC)或者BUSY信号。如果硬件有缺陷,则需要保证有一种办法能阻止无限循环。通过使用一个逐次递减的软件计数器来避免无限循环(请看本节后面的伪代码)。计数器的初值由逐次迭代的执行时间来决定。例如,如果你有一个ADC,它完成一次转换需时50us,并且每次轮流检测循环的迭代需用时5us,则你需要调用一个最小值为10的计数器。你要用这个循环计数器来显示硬件故障,但不会在ADC正在转换时显示。根据经验,当循环检测时间超过ADC转换时间大约25〜50%时,就应该调用循环计数器,以便产生一个超时。或者说,在例子中你要调用一个值为13〜15的计数器。最后,当ADC发出转换结束的信号时,驱动程序读取ADC(④)并返回二进制结果到应用程序(⑤)。

模拟£俞入①模拟£俞入①③驱动程序等待ADC完成转换(用超时)驱动程序读ADC模拟输入的二进制值返回到应用程序简答:矩阵键盘的行列扫描算法答:①所有的行(输出端口)被强行设置为低电平;②扫描每一列,若全为高电平,则没有键按下;否则,找到为低电平的列;③锁定该低电平的列,行逐次送低电平0;④若锁定的列为低电平,则按下的键必在此行。负载较重的系统解决日历时钟不准确的方法答:有两种方式解决这个间题,第一种也是最简单的一种是使时钟模块任务成为更高优先级的任务,这意味着在执行时钟任务时,低优先级的任务将不会得到服务。一般来说,应将最高优先级设置给最重要的任务面不是时钟任务,因为时钟任务需要大量的处理时间。解决该问题的第二种方法需要使用计数信号,信号会“记住”时钟脉冲数,因此在处理器的负载减少时,时钟任务最终会追上来。每个时钟脉冲或一整秒过去后,时钟脉冲ISR给计数信号发送一个信号。定时器/计数器核心数据结构(PPT4页)typedefstructtmr(BOOLEANTmrEn; //TmrEn用于启动或禁止倒计数过程INT16U TmrCtr; 〃计数器INT16U TmrInit; 〃计数器初值void (*TmrFnct)(void*); 〃指向用户定义的函数的指针void *TmrFnctArg; 〃传递给被调用函数的参数指针}TMR;4.uCOS-II任务状态图转换

OSQPendOOSTaskDelOOSQPosL()OSQPostFront()OSSemPost()OSTaskResumeOOSTimeD1yResume()OSTitneTickOOSSemPendOOSTaskSuspendOOSTiuieDlyOOSQPendOOSTaskDelOOSQPosL()OSQPostFront()OSSemPost()OSTaskResumeOOSTimeD1yResume()OSTitneTickOOSSemPendOOSTaskSuspendOOSTiuieDlyOOSTimcDlyHMSMOOSTaskCreate()5.事件控制块、任务控制块(PPTucos-II/第1章嵌入式实时操作系统uCOS-II的基本原理概述/27页ucos-D/第6章uCOS-II任务之间的通信与同步/7页)服程断子序1务任务控制块结构的主要成员OS_STK*Q^IGBStKEtr 〃指向任务堆栈栈顶的指针^trwot 〃指向后一个任务控制块的指针strwot 〃指向目〔一■个任务控制块的指针INT16UINT8UINT8U//任务等待的时限(节拍数)〃任务的当前状态标志INT16UINT8UINT8U//任务等待的时限(节拍数)〃任务的当前状态标志//任务豹优先级别)OS_TCB;程序清单L6.1ECB数据结构void/*指向消息或者消息队列的指针*/INT8U;E等待任务列表时INT16U/*计数器(当事件是信号量时)*/INTSU/*事件类型*/INT8U}0S_EVENT;QSEywtJto;/*等待任务所在的组*/程序设计题:uCOS-II中断服务程序设计(重点:中断服务流程)(PPTucos-II/第3章uCOS-II内核结构/71页)以C/OS-II中的中断服务子程(用户中断服务子程序)序流程:保存全部CPU寄存器;调用OSIntEnter或OSIntNesting直接加1;执行用户代码做中断服务;调用OSIntExit();恢复所有CPU寄存器;执行中断返回指令;用户级任务切换函数OSCtxSw()(PPTucos-II/第3章uCOS-II内核结构/45-51)就续表相关操作(就续表PPTucos-II/第3章uCOS-II内核结构/16-37页)在程序中,可以用类似下面的代码把优先级别为prio的任务置为就绪状态:OSRdyGrp|=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];如果要使一个优先级别为prio的任务脱离就绪状态则可使用如下类似代码:if((OSRdyTbl[prio>>3]&=〜OSMapTbl[prio&0x07])==0)OSRdyGrp&=〜OSMapTbl[prio>>3];从任务就绪表中获取优先级别最高的就绪任务可用如下类似的代码:y=OSUnMapTal[OSRdyGrp]; //D5、D4、D3位x=OSUnMapTal[OSRdyTbl[y]];//D2、D1、D0位prio=(y<<3)+x; 〃优先级别或y=OSUnMapTbl[OSRdyGrp];prio=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]]);嵌入式操作系统复习重点题型:填空20X1分 选择题15X1分判断5X2分简答4X4分 名词解释3X4分 程序设计2X6分名词解释:JTAGJTAG既是联合测试行为组织的英文简称,也是一种编程方式是在线编程的国际标准测试协议, JTAG还是一种所谓的边界扫描技术,在嵌入式系统设计中,一些高档的微处理器都带有 JTAG接口,方便多目标系统进行测试,同时还可以实现flash编程。ARMARM既是一家专门从事生产和授权微处理器知识产权(IP)核的知名公司的名称,也是一种32位高性能、廉价、耗能低的RISC(精简指令集)处理器的简称。流水线技术流水线技术是指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术。交叉编译嵌入式软件开发所采用的是编译为交叉编译。所谓的交叉编译就是在一个平台上生成可以在另一个平台上执行的代码。嵌入式操作系统嵌入式操作系统是应用于嵌入式系统的操作系统,大多嵌入式操作系统具有微型化、可裁剪性、实时性、高可靠性、易移植性等特点。简答:ARM处理器的工作模式,并做简单描述用户模式(usr):ARM处理器正常的程序执行状态快速中断模式(fiq):用于快速的数据传输或通道处理外部中断(irq):用于通用的中断处理。管理模式(svc):操作系统使用的保护模式。数据访问中止模式(abt):当数据或指令预取终止时进入该模式,用于虚拟存储及存储保护。系统模式(sys):运行具有特权的操作系统任务。嵌入式Linux的优势(写出4点)代码开源②可应用于多种硬件平台。③可定制的内核④性能优异⑤良好的网络支持ARM指令集和Thumb指令集各有什么优缺点ARM指令集支持ARM核所有的特性,具有高效、快速的特点。Thumb指令集具有灵活、小巧的特点。ARM指令集效率高,但是代码密度低;而Thumb指令集具有较高的代码密度,却仍然保持ARM的大多数性能上的优势,它是ARM指令集的子集。所有的ARM指令都是可以有条件执行的,而Thumb指令仅有一条指令具备条件执行功能。Linux文件的属性(权限判断)文件访问权限可表示为:-rwxrwxrwx,在此设为三种不同的访问权限:读(r),写(w),运行(x)。三个不同的用户级别:文件拥有者(u)、所属的用户组(g)和系统中其他的用户(o)。ARM指令的寻址方式ARM处理器具有9种基本寻址方式:①寄存器寻址;②立即寻址;③寄存器移位寻址;④寄存器间接寻址;⑤基址寻址(变址);⑥.多寄存器寻址;⑦堆栈寻址;⑧块拷贝寻址;⑨相对寻址。BX和BL有什么区别什么是Bootloader,它有什么作用简单的说,Bootloader就是在操作系统内核运行之前的一段程序,它类似于PC机中的BIOS程序,经过这段代码,可以完成硬件设备的初始化,并建立内存空间的映射图的功能,从而将系统的软硬件环境带到一个合适的状态,为最终调用系统内核做好准备。GNU的GCC编译器编译程序的各个流程分别是什么作用Gcc的编译流程可分为4个步骤:预处理(Pre-Processing),在该阶段中,编译器将代码中的stdio.h编译进来,并且用户可以使用Gcc的选项“-E”进行查看,该选项的作用是让Gcc在预处理结束后停止编译过程。编译(Compiling)在这个阶段,Gcc首先要检查代码的规范性、是否有语法错误等,以确保代码的实际要做的工作,在校验无误后,Gcc把代码翻译

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论