还剩41页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
嵌入式系统设计师考试复习笔记嵌入式工程师考试题目作者daoshi_000日期2010-2-21:39:00嵌入式系统设计师考试笔记之嵌入式系统基础知识
一、引言自《嵌入式系统设计师考试复习笔记之存储管理篇》在嵌入式在线的博客出现后,意外的得到很多朋友的关注与评论,收到很多朋友的邮件,问一些有关考试的问题,希望得到我的复习笔记的其他部分我非常感谢他们,他们的热切关注,使我有了继续往下写的无限动力,使我萌生了将我往常的复习笔记、考试经验结合大纲教程并重新按《教程》的章节顺序整理一份适合考生复习的笔记手册,笔记后面再分析历年的真题,按章节考点找出有关的考题进行分析,希望能与有兴趣的人们一起讨论讨论嵌入式系统设计师的一天考试分为上午与下午部分,两部分的考试方式、试题难度、考点分布与复习方法都是不一致的这次我们讨论的是嵌入式系统基础知识,我本人觉得,这部分出下午大题的可能性不大,要紧是分布在上午的75道选择题之中从历年的真题与考试大纲来看,上午的选择题要紧考查一些基本概念,重要原理的懂得,一些关键技术与一些重要的原理引申出8时钟信号是时序逻辑的基础,它用于决定逻辑单元中的状态合适更新同步是时钟操纵系统中的要紧制约条件9在选用触发器的时候,触发方式是务必考虑的因素触发方式有两种电平触发方式具有结构简单的有点,常用来构成暂存器边沿触发方式具有很强的抗数据端干扰能力,常用来构成寄存器、计数器等
7、总线电路及信号驱动1总线是各类信号线的集合,是嵌入式系统中各部件之间传送数据、地址与操纵信息的公共通路在同一时刻,每条通路线路上能够传输一位二进制信号按照总线所传送的信息类型,能够分为数据总线DB、地址总线AB与操纵总线CBo2总线的要紧参数总线带宽一定时间内总线上能够传送的数据量,通常用MByte/s表示总线宽度总线能同时传送的数据位数bit即人们常说的32位、64位等总线宽度的概念,也叫总线位宽总线的位宽越宽,总线每秒数据传输率越大,也就是总线带宽越宽总线频率工作时钟频率以MHz为单位,工作频率越高,则总线工作速度越快,也即总线带宽越宽总线带宽=总线位宽义总线频率/8单位是MBps常用总线ISA总线、PCI总线、HC总线、SPI总线、PC用4总线与CAN总线等3只有具有三态输出的设备才能够连接到数据总线上,常用的三态门为输出缓冲器4当总线上所接的负载超过总线的负载能力时,务必在总线与负载之间加接缓冲器或者驱动器,最常用的是三态缓冲器,其作用是驱动与隔离5使用总线复用技术能够实现数据总线与地址总线的共用但会带来两个问题A、需要增加外部电路对总线信号进行复用解耦,比如地址锁存器B、总线速度相对非复用总线系统低
(6)两类总线通信协议同步方式、异步方式
(7)对总线仲裁问题的解决是以优先级(优先权)的概念为基础
8、电平转换电路
(1)数字集成电路能够分为两大类双极型集成电路(TTL)、金属氧化物半导体(MOS)
(2)CMOS电路由于其静态功耗极低,工作速度较高,抗干扰能力较强,被广泛使用
(3)解决TTL与CMOS电路接口困难的办法是在TTL电路输出端与电源之间接一上拉电阻R上拉电阻R的取值由TTL的高电平输出漏电流I0H来决定,不一致系列的TTL应选用不一致的R值
9、可编程逻辑器件基础(具体参见教程51到61页)这方面的内容,从总体上有个概念性的认识应该就能够了
10、嵌入式系统中信息表示与运算基础
(1)进位计数制与转换这样比较简单,也应该掌握怎么样进行换算,有出题的可能
(2)计算机中数的表示源码、反码与补码正数的反码与源码相同,负数的反码为该数的源码除符号位外按位取反正数的补码与源码相同,负数的补码为该数的反码加一比如一98的源码11100010B反码10011101B补码10011110B
(3)定点表示法数的小数点的位置人为约定固定不变浮点表示法数的小数点位置是浮动的,它由尾数部分与阶数部分构成任意一个二进制N总能够写成N=2PXSoS为尾数,P为阶数
(4)汉字表示法(教程
67、68页),搞清晰GB2318-80中国标码与机内码的变换
(5)语音编码中波形量化参数(可能会出简单的计算题目哦)采样频率一秒内采样的次数,反映了采样点之间的间隔大小人耳的听觉上限是20kHz因此40kHz以上的采样频率足以使人满意CD唱片使用的采样频率是
44.Ikllzo测量精度样本的量化等级,目前标准采样量级有8位与16位两种声道数单声道与立体声双道立体声需要两倍的存储空间
11、差错操纵编码
(1)根据码组的功能,能够分为检错码与纠错码两类检错码是指能自动发现差错的码,比如奇偶检验码;纠错码是指不仅能发现差错而且能自动纠正差错的码,比如循环冗余校验码
(2)奇偶检验码、海明码、循环冗余校验码(CRC)(教程70至IJ77页)
12、嵌入式系统的度量项目
(1)性能指标分为部件性能指标与综合性能指标,要紧包含:吞吐率、实时性与各类利用率
(2)可靠性与安全性可靠性是嵌入式系统最重要、最突出的基本要求,是一个嵌入式系统能正常工作的保证,通常用平均故障间隔时间MTBF来度量3可保护性通常用平均修复时间MTTR表示4可用性5功耗6环境习惯性7通用性8安全性9保密性10可扩展性性价比中的价格,除了直接购买嵌入式系统的价格外,还应包含安装费用、若干年的运行维修费用与软件租用费
13、嵌入式系统的评价方法测量法与模型法1测量法是最直接最基本的方法,需要解决两个问题A、根据研究的目的,确定要测量的系统参数B、选择测量的工具与方式
(2)测量的方式有两种采样方式与事件跟踪方式
(3)模型法分为分析模型法与模拟模型法分析模型法是用一些数学方程去刻画系统的模型,而模拟模型法是用模拟程序的运行去动态表达嵌入式系统的状态,而进行系统统计分析,得出性能指标
(4)分析模型法中使用最多的是排队模型,它包含三个部分输入流、排队规则与服务机构
(5)使用模型对系统进行评价需要解决3个问题设计模型、解模型、校准与证实模型
三、真题解析2007年
4、5题若每一条指令都能够分解为取指、分析与执行三步已知取指时间t取指=4ZSt分析时间t分析=34t执行时间t执行=5△t假如按串行方式执行完100条指令需要
(4)△t假如按照流水线方式执行,执行完100条指令需要
(5)AtoA.1190B.1195C.1200D.1205A504B.507C.508D.510〈答案〉C、B考查流水线技术知识点按照串行的方式,执行完一条指令才能执行下一条指令,那么执行完100条指令的时间为4+3+5X100=1200按照流水线的方式,能够同时执行多条指令在第一条指令进行分析的时候,第二条指令已经开始取指;当第一条指令进行执行的时候,第二条指令进行分析,第三条指令取指;当第二条指令进行执行完的时候,第三条指令已经分析完成依此类推,当第一条指令完成之后,每一个执行的周期就能够完成一条指令需要注意的是,假如流水线的子过程所用时间不一样长,则吞吐率应以最长子过程来计算因此,我们能够计算得100条指令的执行时间为4+3+5+100-1X5=507o
2、2007年24题某总线有104根信号线,其中数据总线DB32根,若总线工作频率为33MHz则其理论最大传输率为24o注本题答案中的B表示Byte24A.33MB/sB.64MB/sC.132MB/sD.164MB/s〈答案)c考查总线这个知识点根据上面的笔记,总线带宽=总线位宽X总线频率/8=32X33/8=132MB/so
3、2007年26题某存储器数据总线宽度为32bit存取周期为250ns则该存储器带宽为
(26)o(注本题答案中的B表示Byte)A.8X106B/sB.16X106B/sC.16X108B/sD.32X106B/s〈答案〉B考查总线这个知识点存储器带宽即总线带宽,总线频率为l/250ns=4X106存储器带宽为32X4X106/8=16X106B/s
4、2007年27题处理机要紧由处理器、存储器与总线构成,总线包含
(27)oA.数据总线、串行总线、逻辑总线、物理总线B.并行总线、地址总线、逻辑总线、物理总线C.并行总线、串行总线、全双工总线D.数据总线、地址总线、操纵总线<答案〉:D考查总线这个知识点,基本概念的考查
5、2007年35题三极管是可控的开关器件,其饱与与截止状态分别对应开关的接通与断开状态UBE为基极输入电压,VTH为基极域值电压,假如UBETIL开关应处于35状态A.接通B.三态C.断开D.高阻〈答案〉C考查电路中最基本的基础知识点,我觉得做不对的根本不能算嵌入式系统开发入门
6、2007年36题来的简单计算根据这些考试特点,复习的时候能够使用适当的策略,当然每个人的方法都是不一样的,适合自己的办法才是最好的办法方法大家能够自己慢慢去体会,我的也不多说了,通过笔记与真题分析就能够表达处理关于很多关键的知识点与基本概念,除了记住之外还要完全懂得,否则出题的时候会进行一些变换,或者者引申一些计算,那么就算你明白考那个考点,可能你也做不好在复习的过程中,你要记住你不是要考一个很高的分数,而是要考一个通过的分数,在复习过程中能够放弃一些内容,只要保证在大部分基本概念,关键技术,重要原理与历年考点上都把握住,能够拿到需要的分数就能够了
二、复习笔记
1、嵌入式系统的定义1定义以应用为中心,以计算机技术为基础,软硬件可裁剪,习惯应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统2嵌入式系统进展的4个阶段无操作系统阶段、简单操作系统阶段、实时操作系统阶段、面向Internet阶段如下图所示,若低位地址A0-A11接在内存芯片地址引脚上,高位地址A12-A19进行片选译码其中A14与A16没有参加译码,且片选信号低电平有效,则对下图所示的译码器,不属于此译码空间的地址为36oA.ABOOOH-ABFFFHB.BBOOOH-BBFFFHC.EFOOOH〜EFFFFHD.FEOOOH〜FEFFFH〈答案D考查数字电路中译码知识与存储系统中统一编址的问题,相对来说,这个题目有点难度,但是关于学习过与亲身做过单片机的兄弟来说,最基本只是了
7、2007年46题46完全把系统软件与硬件部分隔离开来,从而大大提高了系统的可移植性A.硬件抽象层B.驱动映射层C.硬件交互层D.中间层〈答案〉A考查嵌入式系统构成中的概念
8、2006年3题设指令由取指、分析、执行3个子部件完成,每个子部件的工作周期为At使用常规标量单流水线处理机若连续执行10条指令,则共需要时间
(3)Ato
(3)A.8B.10C.12D.14〈答案)C考查流水线技术知识点3+(10-1)Xl=
129、2006年
4、5题某计算机的时钟频率为400MHz测试计算机的程序使用4种类型的指令每种指令的数量及所需要的指令时钟数(CPI)如下表所示,则该计算机的指令平均时钟数为
(4);该计算机的运算速度为
(5)MIPSo指令类型指令数目(条)每条指令需要的时钟数11600001230000232400044160008A.
1.85B.
1.93C.
2.36D.
3.75A.
106.7B.
169.5C.
207.3D.
216.2〈答案〉B、C考查指令运行方面的简单计算平均时钟数=160000+2X30000+4X24000+8X16000/160000+30000+24000+16000=
1.93MIPS是指每秒种执行多少百万条指令,即106计算机的运行数度为400/
1.93=
207.25=
207.3MIPS
9、2006年12题计算机要对声音信号进行处理时,务必将它转换为数字声音信号最基本的声音信号数字化方法时取样一量化法若量化后的每个声音样本用2个字节表示,则量化分辨率是12A.1/2B.1/1024C.1/65536D.1/131072〈答案〉C考查声音编码种量化计算的知识点2个字节是16位,其量化分辨率位1/1016=1/
6553610、2006年13题某幅图像具有640X460个象素点,若每个象素具有8位的颜色深度,则可表示13种不一致的颜色,通过51压缩后,其图像数据需要占用14Byte的存储空间A.8B.256C.512D.1024A.61440B.307200C.384000D.3072000<答案:B、A考查图像数据存储计算的知识点8位颜色深度能够表示28=256种颜色深度通过51压缩后的数据大小为640X480X8/8/5=61440o
11、2006年23题若某逻辑门输入A、B与输出F的波形如下图所示,则FAB的表达式为23A.F=ABB.F=A+BC.F=A异或者BD.F=AB的非AIIIIBIIFII〈答案〉C考查数字电路的最基本知识点,我觉得这个都搞不清晰很难通过这个考试
12、2006年24题一个4位的二进制计数器,由0000状态开始,通过25个时钟脉冲后,该计数器的状态为24A.1100B.1000C.1001D.1010〈答案c考查数字电路的最基本知识点,相对上面一题有点难,需要对计数器的工作原理有比较清晰的懂得这个也是搞嵌入式系统的基础中的基础,参考教程38页或者有关的数电书籍4位的计数器,其计数范围是24=160000开始通过16个时钟脉冲之后又回到了开始的状态000025-16=9因此说通过25个时钟之后,其计数器的数值应该是9=
100113、2006年25题稳压二极管构成的稳压电路的接法是25A.稳压管与负载电阻串联B.稳压管与限流电阻并联C.限流电阻与稳压管串联后,在与负载电阻串联D.限流电阻与稳压管串联后,在与负载电阻并联〈答案〉D考查模拟电路的最基本知识点,实在太简单,不明白从那里开始分析了
14、2006年26题下列叙述中,不符合RISC指令系统特点的是26A.指令长度固定,指令种类少B.寻址方式种类丰富,指令功能尽量增强C.设置大量通用寄存器,访问存储器指令简单
0.选取使用频率较高的一些简单指令〈答案〉B考查RISC与CICS的区别,考生应该清晰他们的区别,参加教程22页
15、2006年27题通常所说的32位微处理器是指27A.地址总线的宽度为32位B.处理器数据长度只能为32位C.CPU字长为32位D.通用寄存器数目为32位〈答案〉C考查字长的概念与总线宽度的懂得,参加教程25页
16、2006年28题在32位总线系统中,若时钟频率为500MHz传送一个32位字需要5个时钟周期,则该总线系统的数据传送速率为28MB/SoA.200B.400C.600D.800〈答案〉B考查总线与数据传输方面的知识点5个时钟周期能够传送4个Byteo每秒中能够传送4X500/5=400MB/so
17、2006年30题评价一个计算机系统时,通常要紧使用30来衡量系统的可靠性30A.评价响应时间B.平均无故障时间MTBFC.平均修复时间D.数据处理速率〈答案〉B考查嵌入式系统性能评价中重要知识点看过了就会做,每什么分析的,参见教程77页
四、小结就我个人的意见,从内容来看,嵌入式系统基础知识的范围很广知识点很多,而且没有很强的逻辑性,显得比较凌乱,很难将他们有序的组织在一起但是也不要害怕,内容尽管多而乱,但是考试的题目都比较简单,有些题目几乎是所见即所得只要你做过嵌入式或者者单片机方面的工作,你都能做出来一些计算的题目也是一些基本概念的延伸通过分析历年的真题,一方面能够把握考试的出题方式与考试难度,同时能够把握这部分内容的出题方向与复习的方法从两年的考试题目数量分布来看,06年10道,07年7道,数量有所较少,但是我觉得这不是一个趋势,08年应该不可能少于7道题目的这部分在嵌入式系统设计里面是相当重要的,有一个良好的基础才能做好下面的情况假如复习得好,将这
7、8分题目拿到手,那么你离45分左右的及格线又迈进了一大步了预处理器Preprocessor
1.用预处理指令#define声明一个常数,用以说明1年中有多少秒忽略闰年问题SdefineSECONDS.PER_YEAR60*60*24*365UL我在这想看到几件情况#define语法的基本知识比如:不能以分号结束括号的使用,等等2懂得预处理器将为你计算常数表达式的值,因此直接写出你如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的3意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L告诉编译器这个常数是的长整型数4假如你在你的表达式中用到UL表示无符号长整型,那么你有了一个好的起点记住,第一印象很重要.写一个〃标准〃宏MIN这个宏输入两个参数并返回较小的一个SdefineMINABA=BA:B这个测试是为下面的目的而设的1标识#define在宏中应用的基本知识这是很重要的由于在嵌入inline操作符变为标准C的一部分之前,宏是方便
(3)知识产权核(IP核)具有知识产权的、功能具体、接口规范、可在多个集成电路设计中重复使用的功能模块,是实现系统芯片(SOC)的基本构件
(4)IP核模块有行为、结构与物理3级不一致程度的设计,对应描述功能行为的不一致能够分为三类软核、固核、硬核
2、嵌入式系统的构成硬件层、中间层、系统软件层与应用软件层
(1)硬件层嵌入式微处理器、存储器、通用设备接口与I/O接口嵌入式核心模块=微处理器+电源电路+时钟电路+存储器Cache位于主存与嵌入式微处理器内核之间,存放的是最近一段时间微处理器使用最多的程序代码与数据它的要紧目标是减小存储器给微处理器内核造成的存储器访问瓶颈,使处理速度更快
(2)中间层(也称之硬件抽象层HAL或者者板级支持包BSP)它将系统上层软件与底层硬件分离开来,使系统上层软件开发人员无需关系底层硬件的具体情况,根据BSP层提供的接口开发即可产生嵌入代码的唯一方法,关于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是务必的方法2三重条件操作符的知识这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优的代码,熟悉这个用法是很重要的3懂得在宏中小心地把参数用括号括起来4我也用这个问题开始讨论宏的副作用,比如当你写下面的代码时会发生什么事?least=MIN*p++b;.预处理器标识腕rror的目的是什么?假如你不明白答案,请看参考文献1这问题对区分一个正常的伙计与一个书呆子是很有用的只有书呆子才会读C语言课本的附录去找出象这种问题的答案当然假如你不是在找一个书呆子,那么应试者最好希望自己不要明白答案死循环Infiniteloops.嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?这个问题用几个解决方案我首选的方案是while1一些程序员更喜欢如下方案for;;1这个实现方式让我为难,由于这个语法没有确切表达到底怎么回事假如一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理假如他们的基本答案是〃我被教着这样做,但从没有想到过为什么〃这会给我留下一个坏印象第三个方案是用gotoLoop:•••gotoLoop;应试者如给出上面的方案,这说明或者者他是一个汇编语言程序员这也许是好事或者者他是一个想进入新领域的BASIC/FORTRAN程序员数据声明Datadeclarations
5.用变量a给出下面的定义一个整型数Aninteger一个指向整型数的指针Apointertoanintegerc一个指向指针的的指针,它指向的指针是指向一个整型数Apointertoapointertoanintegerd一个有10个整型数的数组Anarrayof10integers一个有10个指针的数组,该指针是指向一个整型数的Anarrayof10pointerstointegers一个指向有10个整型数数组的指针Apointertoanarrayof10integers一个指向函数的指针,该函数有一个整型参数并返回一个整型数Apointertoathattakesanintegerasanargumentandreturnsaninteger一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数Anarrayoftenpointerstosthattakeanintegerargumentandreturnaninteger答案是inta;//Anintegerint*a;//Apointertoanintegerint**a;//Apointertoapointertoanintegerinta
[10];//Anarrayof10integersint*a
[10];//Anarrayof10pointerstointegersint*a
[10];//Apointertoanarrayof10integersint*aint;//Apointertoaathattakesanintegerargumentandreturnsanintegerint*a
[10]int;//Anarrayof10pointerstosthattakeanintegerargumentandreturnaninteger人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法当我写这篇文章时,为了确定语法的正确性,我的确查了一下书但是当我被面试的时候,我期望被问到这个问题或者者相近的问题由于在被面试的这段时间里,我确定我明白这个问题的答案应试者假如不明白所有的答案或者至少大部分答案,那么也就没有为这次面试做准备,假如该面试者没有为这次面试做准备,那么他又能为什么出准备呢?Static.关键字static的作用是什么?这个简单的问题很少有人能回答完全在C语言中关键字static有三个明显的作用1在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变2)在模块内(但在函数体外),一个被声明为静态的变量能够被模块内所用函数访问,但不能被模块外其它函数访问它是一个本地的全局变量3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用那就是,这个函数被限制在声明它的模块的本地范围内使用大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分这是一个应试者的严重的缺点,由于他显然不懂得本地化数据与代码范围的好处与重要性Const.关键字const有什么含意?我只要一听到被面试者说〃const意味着常数〃,我就明白我正在与一个业余者打交道去年DanSaks已经在他的文章里完全概括了const的所有用法,因此ESP(译者EmbeddedSystemsProgramming)的每一位读者应该非常熟悉const能做什么与不能做什么.假如你从没有读到那篇文章,只要能说出const意味着〃只读〃就能够了尽管这个答案不是完全的答案,但我同意它作为一个正确的答案(假如你想明白更全面的答案,认真读一下Saks的文章吧)假如应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?constinta;intconsta;constint*a;int*consta;intconst*aconst;/******/前两个的作用是一样a是一个常整型数第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针能够)第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是能够修改的,但指针是不可修改的)最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)假如应试者能正确回答这些问题,那么他就给我留下了一个好印象顺带提一句,也许你可能会问,即使不用关键字const也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由1)关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的假如你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的)2)通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码3)合理地使用关键字const能够使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改简而言之,这样能够减少bug的出现Volatile.关键字volatile有什么含意?并给出三个不一致的例子一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不可能去假设这个变量的值了精确地说就是,优化器在用到这个变量时务必每次都小心地重新读取这个变量的值,而不是使用储存在寄存器里的备份下面是volatile变量的几个例子1)并行设备的硬件寄存器(如状态寄存器)2)一个中断服务子程序中会访问到的非自动变量(Non-automaticvariables)3)多线程应用中被几个任务共享的变量回答不出这个问题的人是不可能被雇佣的我认为这是区分C程序员与嵌入式系统程序员的最基本的问题搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,所有这些都要求用到volatile变量不懂得volatile的内容将会带来灾难假设被面试者正确地回答了这是问题(嗯,怀疑是否会是这样),我将略微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性一个参数既能够是const还能够是volatile吗?解释为什么一个指针能够是volatile吗?解释为什么3)下面的函数有什么错误intsquare(volatileint*ptr){return*ptr**ptr;)下面是答案1)是的一个例子是只读的状态寄存器它是volatile由于它可能被意想不到地改变它是const由于程序不应该试图去修改它2)是的尽管这并不很常见一个例子是当一个中服务子程序修该一个指向一个buffer的指针时3)这段代码有点变态这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码intsquarevolatileint*ptrintab;a=*ptr;b=*ptr;returna*b;}由于*ptr的值可能被意想不到地该变,因此a与b可能是不一致的结果,这段代码可能返不是你所期望的平方值!正确的代码如下longsquarevolatileint*ptrIinta;a=*ptr;returna*a;}位操作Bitmanipulation
9.嵌入式系统总是要用户对变量或者寄存器进行位操作给定一个整型变量a写两段代码,第一个设置a的bit3第二个清除a的bit3O在以上两个操作中,耍保持其它位不变对这个问题有三种基本的反应1不明白如何下手该被面者从没做过任何嵌入式系统的工作2用bitfieldsoBitfields是被扔到C语言死角的东西,它保证你的代码在不一致编译器之间是不可移植的,同时也保证了的你的代码是不可重用的我最近不幸看到Infineon为其较复杂的通信芯片写的驱动程序,它用到了bitfields因此完全对我无用,由于我的编译器用其它的方式来实现bitfields的从道德讲永远不要让一个非嵌入式的家伙粘实际硬件的边3用#defines与bitmasks操作这是一个有极高可移植性的方法,是应该被用到的方法最佳的解决方案如下^defineBIT30x1«3staticinta;voidset_bit3void{a|=BIT3;}voidclearbit3voida二〜BIT3;BSP有两个特点硬件有关性与操作系统有关性设计一个完整的BSP需要完成两部分工作A、嵌入式系统的硬件初始化与BSP功能片级初始化纯硬件的初始化过程,把嵌入式微处理器从上电的默认状态逐步设置成系统所要求的工作状态板级初始化包含软硬件两部分在内的初始化过程,为随后的系统初始化与应用程序建立硬件与软件的运行环境系统级初始化以软件为主的初始化过程,进行操作系统的初始化B、设计硬件有关的设备驱动
(3)系统软件层由RTOS、文件系统、GUI、网络系统及通用组件模块构成RTOS是嵌入式应用软件的基础与开发平台
(4)应用软件由基于实时系统开发的应用程序构成
3、实时系统一些人喜欢为设置与清除值而定义一个掩码同时定义一些说明常数,这也是能够同意的我希望看到几个要点说明常数、I二与操作访问固定的内存位置Accessingfixedmemorylocations
10.嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66编译器是一个纯粹的ANSI编译器写代码去完成这一任务这一问题测试你是否明白为了访问一绝对地址把一个整型数强制转换typecast为一指针是合法的这一问题的实现方式随着个人风格不一致而不一致典型的类似代码如下int*ptr;ptr=int*0x67a9;*ptr=0xaa55;Amoreobscureapproachis:一个较晦涩的方法是*int*const0x67a9=0xaa55;即使你的品味更接近第二种方案,但我建议你在面试时使用第一种方案中断Interrupts
11.中断是嵌入式系统中重要的构成部分,这导致了很多编译开发商提供一种扩展一让标准C支持中断具代表事实是,产生了一个新的关键字—interrupto下面的代码就使用了—interruPt关键字去定义了一个中断服务子程序ISR请评论一下这段代码的_interruptdoublecomputeareadoubleradiusdoublearea=PI*radius*radius;printfz/\nArea二%f〃,area;returnarea;这个函数有太多的错误了,以至让人不知从何说起了ISR不能返回一个值假如你不懂这个,那么你不可能被雇用的ISR不能传递参数假如你没有看到这一点,你被雇用的机会等同第一项3在许多的处理器/编译器中,浮点通常都是不可重入的有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不同意在ISR中做浮点运算此外,ISR应该是短而有效率的在ISR中做浮点运算是不明智的4与第三点一脉相承,printfO经常有重入与性能上的问题假如你丢掉了第三与第四点,我不可能太为难你的不用说,假如你能得到后两点,那么你的被雇用前景越来越光明了代码例子Codeexamples.下面的代码输出是什么,为什么?voidfoovoid{unsignedinta=6;intb=-20;a+b6puts/z6〃:puts〈二6〃;这个问题测试你是否懂得C语言中的整数自动转换原则我发现有些开发者懂得极少这些东西不管如何,这无符号整型问题的答案是输出是〃6〃原因是当表达式中存在有符号类型与无符号类型时所有的操作数都自动转换为无符号类型因此-20变成了一个非常大的正整数,因此该表达式计算出的结果大于6这一点关于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的假如你答错了这个问题,你也就到了得不到这份工作的边缘.评价下面的代码片断:unsignedintzero=0;unsignedintcompzero=OxFFFF;/*1scomplementofzero*/关于一个int型不是16位的处理器为说,上面的代码是不正确的应编写如下unsignedintcompzero=0;这一问题真正能揭露出应试者是否懂得处理器字长的重要性在我的经验里,好的嵌入式程序员非常准确地明白硬件的细节与它的局限,然而PC机程序往往把硬件作为一个无法避免的烦恼到了这个阶段,应试者或者者完全垂头丧气了或者者信心满满志在必得假如显然应试者不是很好,那么这个测试就在这里结束了但假如显然应试者做得不错,那么我就扔出下面的追加问题,这些问题是比较难的,我想仅仅非常优秀的应试者能做得不错提出这些问题,我希望更多看到应试者应付问题的方法,而不是答案不管如何,你就当是这个娱乐吧.・•动态内存分配Dynamicmemoryallocation.尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆heap中动态分配内存的过程的那么嵌入式系统中,动态分配内存可能发生的问题是什么?这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等这个主题已经在ESP杂志中被广泛地讨论过了要紧是P.J.Plauger他的解释远远超过我这里能提到的任何解释,所有回过头看一下这些杂志吧!让应试者进入一种虚假的安全感受后,我拿出这么一个小节目下面的代码片段的输出是什么,为什么?char*ptr;ifptr=char*malloc0==NULLputsz,Gotanullpointer;elseputs,zGotavalidpointer;这是一个有趣的问题最近在我的一个同事不经意把0值传给了函数malloc得到了一个合法的指针之后,我才想到这个问题这就是上面的代码,该代码的输出是〃Gotavalidpointer\我用这个来开始讨论这样的一问题,看看被面试者是否想到库例程这样做是正确得到正确的答案固然重要,但解决问题的方法与你做决定的基本原理更重要些Typedef15Typedef在C语言中频繁用以声明一个已经存在的数据类型的同义字也能够用预处理器做类似的事比如,思考一下下面的例子#definedPSstructs*typedefstructs*tPS;以上两种情况的意图都是要定义dPS与tPS作为一个指向结构s指针哪种方法更好呢?(假如有的话)为什么?这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的答案是typedef更好思考下面的例子dPSplp2;tPSp3p4;第一个扩展为structs*plp2;*上面的代码定义pl为一个指向结构的指p2为一个实际的结构这也许不是你想要的第二个例子正确地定义了p3与p4两个指针晦涩的语法
16.C语言同意一些令人震惊的结构,下面的结构是合法的吗假如是它做些什么?inta=5b=7c;c=a+++b;这个问题将做为这个测验的一个愉快的结尾不管你相不相信,上面的例子是完全合乎语法的问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处理原则,编译器应当能处理尽可能所有合法的用法因此,上面的代码被处理成c=a+++b;因此,这段代码持行后a=6b=7c=12o假如你明白答案,或者猜出正确答案,做得好假如你不明白答案,我也不把这个当作问题我发现这个问题的最大好处是这是一个关于代码编写风格,代码的可读性,代码的可修改性的好的话题
(1)定义能在指定或者确定的时间内完成系统功能与对外部或者内部、同步或者异步时间做出响应的系统
(2)区别通用系统通常追求的是系统的平均响应时间与用户的使用方便;而实时系统要紧考虑的是在最坏情况下的系统行为
(3)特点时间约束性、可预测性、可靠性、与外部环境的交互性
(4)硬实时(强实时)指应用的时间需求应能够得到完全满足,否则就造成重大安全事故,甚至造成重大的生命财产缺失与生态破坏,如航天、军事
(5)软实时(弱实时)指某些应用尽管提出了时间的要求,但实时任务偶尔违反这种需求对系统运行及环境不可能造成严重影响,如监控系统、实时信息采集系统
(6)任务的约束包含时间约束、资源约束、执行顺序约束与性能约束
4、实时系统的调度
(1)调度给定一组实时任务与系统资源,确定每个任务何时何地执行的整个过程
(2)抢占式调度通常是优先级驱动的调度,如uCOS优点是实时性好、反应快,调度算法相对简单,能够保证高优先级任务的时间约束;缺点是上下文切换多
(3)非抢占式调度通常是按时间片分配的调度,不同意任务在执行期间被中断,任务一旦占用处理器就务必执行完毕或者自愿放弃,如WinCE优点是上下文切换少;缺点是处理器有效资源利用率低,可调度性不好
(4)静态表驱动策略系统在运行前根据各任务的时间约束及关联关系,使用某种搜索策略生成一张运行时刻表,指明各任务的起始运行时刻及运行时间
(5)优先级驱动策略按照任务优先级的高低确定任务的执行顺序
(6)实时任务分类周期任务、偶发任务、非周期任务
(7)实时系统的通用结构模型数据采集任务实现传感器数据的采集,数据处理任务处理采集的数据、并将加工后的数据送到执行机构管理任务操纵机构执行
5、嵌入式微处理器体系结构1冯诺依曼结构程序与数据共用一个存储空间,程序指令存储地址与数据存储地址指向同一个存储器的不一致物理位置,使用单一的地址及数据总线,程序与数据的宽度相同比如
8086、ARM
7、MIPS-2哈佛结构程序与数据是两个相互独立的存储器,每个存储器独立编址、独立访问,是一种将程序存储与数据存储分开的存储器结构比如:AVR、ARM
9、ARM10-3CISC与RISC的特点比较参照教程22页计算机执行程序所需要的时间P能够用下面公式计算P=IXCPIXTI高级语言程序编译后在机器上运行的指令数CPI为执行每条指令所需要的平均周期数T每个机器周期的时间4流水线的思想在CPU中把一条指令的串行执行过程变为若干指令的子过程在CPU中重叠执行5流水线的指标:吞吐率单位时间里流水线处理机流出的结果数假如流水线的子过程所用时间不一样长,则吞吐率应为最长子过程的倒数建立时间流水线开始工作到达最大吞吐率的时间若m个子过程所用时间一样,均为t则建立时间T=mt
(6)信息存储的字节顺序A、存储器单位字节(8位)B、字长决定了微处理器的寻址能力,即虚拟地址空间的大小C、32位微处理器的虚拟地址空间位232即4GBD、小端字节顺序低字节在内存低地址处,高字节在内存高地址处E、大端字节顺序高字节在内存低地址处,低字节在内存高地址处F、网络设备的存储顺序问题取决于OSI模型底层中的数据链路层
6、逻辑电路基础
(1)根据电路是否具有存储功能,将逻辑电路划分为组合逻辑电路与时序逻辑电路
(2)组合逻辑电路电路在任一时刻的输出,仅取决于该时刻的输入信号,而与输入信号作用前电路的状态无关常用的逻辑电路有译码器与多路选择器等
(3)时序逻辑电路电路任一时刻的输出不仅与该时刻的输入有关,而且还与该时刻电路的状态有关因此,时序电路中务必包含经历元件触发器是构成时序逻辑电路的基础常用的时序逻辑电路有寄存器与计数器等
(4)真值表、布尔代数、摩根定律、门电路的概念(教程
28、29页)
(5)NOR(或者非)与NAND(与非)的门电路称之全能门电路能够实现任何一种逻辑函数
(6)译码器多输入多输出的组合逻辑网络每输入一个n位的二进制代码,在m个输出端中最多有一个有效当m=2n是,为全译码;当m2n时,为部分译码
(7)由于集成电路的高电平输出电流小,而低电平输出电流相对比较大,使用集成门电路直接驱动LED时,较多使用低电平驱动方式液晶七段字符显示器LCD利用液晶有外加电场与无外加电场时不一致的光学特性来显示字符。