建筑工程考试嵌入式工程师考试题目_第1页
建筑工程考试嵌入式工程师考试题目_第2页
建筑工程考试嵌入式工程师考试题目_第3页
建筑工程考试嵌入式工程师考试题目_第4页
建筑工程考试嵌入式工程师考试题目_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

【最新卓越管理方案您可自由编辑】

(建筑工程考试)嵌入式工

程师考试题目

20XX年XX月

多年的企业咨询顾问经验,经过实战验证可以落地执行的卓越管理方案,值得您下载拥有

更多电子资料请登录赛微电子网

嵌入式工程师考试题目

作者嵌入式玩耍者

壹、引言

自《嵌入式系统设计师考试复习笔记之存储管理篇》于嵌入式于线的博客出现后,意外

的得到很多朋友的关注和评论,收到不少朋友的邮件,问壹些有关考试的问题,希望得到我

的复习笔记的其他部分。我非常感谢他们,他们的热切关注,使我有了继续往下写的无限动

力,使我萌生了将我以前的复习笔记、考试经验结合大纲教程且重新按《教程》的章节顺序

整理壹份适合考生复习的笔记手册,笔记后面再分析历年的真题,按章节考点找出关联的考

题进行分析,希望能和有兴趣的人们壹起讨论讨论。

嵌入式系统设计师的壹天考试分为上午和下午部分,俩部分的考试方式、试题难度、考

点分布和复习方法均是不同的。这次我们讨论的是嵌入式系统基础知识,我本人觉得,这部

分出下午大题的可能性不大,主要是分布于上午的75道选择题之中。

从历年的真题和考试大纲来见,上午的选择题主要考查壹些基本概念,重要原理的理解,

壹些关键技术和壹些重要的原理引申出来的简单计算。根据这些考试特点,复习的时候能够

采用适当的策略,当然每个人的方法均是不壹样的,适合自己的办法才是最好的办法。方法大

家能够自己慢慢去体会,我的也不多说了,通过笔记和真题分析就能够体现处理。对于很多关

键的知识点和基本概念,除了记住之外仍要彻底理解,否则出题的时候会进行壹些变换,或者引

申壹些计算,那么就算你知道考那个考点,可能你也做不好。

于复习的过程中,你要记住:你不是要考壹个很高的分数,而是要考壹个通过的分数,

于复习过程中能够放弃壹些内容,只要保证于大部分基本概念,关键技术,重要原理和历年

考点上均把握住,能够拿到需要的分数就能够了。

二'复习笔记

1、嵌入式系统的定义

(1)定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、

可靠性、成本、体积、功耗严格要求的专用计算机系统。

(2)嵌入式系统发展的4个阶段:无操作系统阶段、简单操作系统阶段、实时操作系统阶段、

面向Internet阶段。

(3)知识产权核(IP核):具有知识产权的、功能具体、接口规范、可于多个集成电路设

计中重复使用的功能模块,是实现系统芯片(SOC)的基本构件。

(4)IP核模块有行为、结构和物理3级不同程度的设计,对应描述功能行为的不同能够分

为三类:软核、固核、硬核。

2、嵌入式系统的组成:硬件层、中间层、系统软件层和应用软件层

(1)硬件层:嵌入式微处理器、存储器、通用设备接口和I/O接口。

嵌入式核心模块=微处理器+电源电路+时钟电路+存储器

Cache:位于主存和嵌入式微处理器内核之间,存放的是最近壹段时间微处理器使用最多的

程序代码和数据。它的主要目标是减小存储器给微处理器内核造成的存储器访问瓶颈,使处

理速度更快。

(2)中间层(也称为硬件抽象层HAL或者板级支持包BSP):它将系统上层软件和底层硬件

分离开来,使系统上层软件开发人员无需关系底层硬件的具体情况,根据BSP层提供的接口

开发即可。

BSP有俩个特点:硬件关联性和操作系统关联性。

设计壹个完整的BSP需要完成俩部分工作:

A、嵌入式系统的硬件初始化和BSP功能。

片级初始化:纯硬件的初始化过程,把嵌入式微处理器从上电的默认状态逐步设置成系统所

要求的工作状态。

板级初始化:包含软硬件俩部分于内的初始化过程,为随后的系统初始化和应用程序建立硬

件和软件的运行环境。

系统级初始化:以软件为主的初始化过程,进行操作系统的初始化。

B、设计硬件关联的设备驱动。

(3)系统软件层:由RTOS、文件系统、GUI、网络系统及通用组件模块组成。

RTOS是嵌入式应用软件的基础和开发平台。

(4)应用软件:由基于实时系统开发的应用程序组成。

3、实时系统

(1)定义:能于指定或确定的时间内完成系统功能和对外部或内部、同步或异步时间做出

响应的系统。

(2)区别:通用系统壹般追求的是系统的平均响应时间和用户的使用方便;而实时系统主

要考虑的是于最坏情况下的系统行为。

(3)特点:时间约束性、可预测性、可靠性、和外部环境的交互性。

(4)硬实时(强实时):指应用的时间需求应能够得到完全满足,否则就造成重大安全事

故,甚至造成重大的生命财产损失和生态破坏,如:航天、军事。

(5)软实时(弱实时):指某些应用虽然提出了时间的要求,但实时任务偶尔违反这种需

求对系统运行及环境不会造成严重影响,如:监控系统、实时信息采集系统。

(6)任务的约束包括:时间约束、资源约束、执行顺序约束和性能约束。

4、实时系统的调度

(1)调度:给定壹组实时任务和系统资源,确定每个任务何时何地执行的整个过程。

(2)抢占式调度:通常是优先级驱动的调度,如uCOS。优点是实时性好、反应快,调度算

法相对简单,能够保证高优先级任务的时间约束;缺点是上下文切换多。

(3)非抢占式调度:通常是按时间片分配的调度,不允许任务于执行期间被中断,任务壹

旦占用处理器就必须执行完毕或自愿放弃,如WinCEo优点是上下文切换少;缺点是处理器

有效资源利用率低,可调度性不好。

(4)静态表驱动策略:系统于运行前根据各任务的时间约束及关联关系,采用某种搜索策

略生成壹张运行时刻表,指明各任务的起始运行时刻及运行时间。

(5)优先级驱动策略:按照任务优先级的高低确定任务的执行顺序。

(6)实时任务分类:周期任务、偶发任务、非周期任务。

(7)实时系统的通用结构模型:数据采集任务实现传感器数据的采集,数据处理任务处理

采集的数据、且将加工后的数据送到执行机构管理任务控制机构执行。

5、嵌入式微处理器体系结构

(1)冯诺依曼结构:程序和数据共用壹个存储空间,程序指令存储地址和数据存储地址指

向同壹个存储器的不同物理位置,采用单壹的地址及数据总线,程序和数据的宽度相同。例

如:8086、ARM7、MIPS-

(2)哈佛结构:程序和数据是俩个相互独立的存储器,每个存储器独立编址、独立访问,

是壹种将程序存储和数据存储分开的存储器结构。例如:AVR、ARM9、ARM10-

(3)CISC和RISC的特点比较(参照教程22页)。

计算机执行程序所需要的时间P能够用下面公式计算:

P=IXCPIXT

I:高级语言程序编译后于机器上运行的指令数。

CPI:为执行每条指令所需要的平均周期数。T:

每个机器周期的时间。

(4)流水线的思想:于CPU中把壹条指令的串行执行过程变为若干指令的子过程于CPU中重

叠执行。

(5)流水线的指标:

吞吐率:单位时间里流水线处理机流出的结果数。如果流水线的子过程所用时间不壹样长,

则吞吐率应为最长子过程的倒数。

建立时间:流水线开始工作到达最大吞吐率的时间。若m个子过程所用时间壹样,均为t,

则建立时间T=mt。

(6)信息存储的字节顺序

A、存储器单位:字节(8位)

B、字长决定了微处理器的寻址能力,即虚拟地址空间的大小。

C、32位微处理器的虚拟地址空间位232,即4GB。

D、小端字节顺序:低字节于内存低地址处,高字节于内存高地址处。

E、大端字节顺序:高字节于内存低地址处,低字节于内存高地址处。

F、网络设备的存储顺序问题取决于OSI模型底层中的数据链路层。

6、逻辑电路基础

(1)根据电路是否具有存储功能,将逻辑电路划分为:组合逻辑电路和时序逻辑电路。

(2)组合逻辑电路:电路于任壹时刻的输出,仅取决于该时刻的输入信号,而和输入信号

作用前电路的状态无关。常用的逻辑电路有译码器和多路选择器等。

(3)时序逻辑电路:电路任壹时刻的输出不仅和该时刻的输入有关,而且仍和该时刻电路

的状态有关。因此,时序电路中必须包含记忆元件。触发器是构成时序逻辑电路的基础。常

用的时序逻辑电路有寄存器和计数器等。

(4)真值表、布尔代数、摩根定律、门电路的概念。(教程28、29页)

(5)NOR(或非)和NAND(和非)的门电路称为全能门电路,能够实现任何壹种逻辑函数。

(6)译码器:多输入多输出的组合逻辑网络。

每输入壹个n位的二进制代码,于m个输出端中最多有壹个有效。

当m=2n是,为全译码;当m<2n时,为部分译码。

(7)由于集成电路的高电平输出电流小,而低电平输出电流相对比较大,采用集成门电路

直接驱动LED时,较多采用低电平驱动方式。液晶七段字符显示器LCD利用液晶有外加电场

和无外加电场时不同的光学特性来显示字符。

(8)时钟信号是时序逻辑的基础,它用于决定逻辑单元中的状态合适更新。同步是时钟控

制系统中的主要制约条件。

(9)于选用触发器的时候,触发方式是必须考虑的因素。触发方式有俩种:

电平触发方式:具有结构简单的有点,常用来组成暂存器。

边沿触发方式:具有很强的抗数据端干扰能力,常用来组成寄存器、计数器等。

7、总线电路及信号驱动

(1)总线是各种信号线的集合,是嵌入式系统中各部件之间传送数据、地址和控制信息的

公共通路。于同壹时刻,每条通路线路上能够传输壹位二进制信号。按照总线所传送的信息

类型,能够分为:数据总线(DB)、地址总线(AB)和控制总线(CB)。

(2)总线的主要参数:

总线带宽:壹定时间内总线上能够传送的数据量,壹般用MByte/s表示。

总线宽度:总线能同时传送的数据位数(bit),即人们常说的32位、64位等总线宽度的概

念,也叫总线位宽。总线的位宽越宽,总线每秒数据传输率越大,也就是总线带宽越宽。总

线频率:工作时钟频率以MHz为单位,工作频率越高,则总线工作速度越快,也即总线带宽越

宽。

总线带宽=总线位宽X总线频率/8,单位是MBpso

常用总线:ISA总线、PCI总线、HC总线、SPI总线、PC104总线和CAN总线等。

(3)只有具有三态输出的设备才能够连接到数据总线上,常用的三态门为输出缓冲器。

(4)当总线上所接的负载超过总线的负载能力时,必须于总线和负载之间加接缓冲器或驱

动器,最常用的是三态缓冲器,其作用是驱动和隔离。

(5)采用总线复用技术能够实现数据总线和地址总线的共用。但会带来俩个问题:

A、需要增加外部电路对总线信号进行复用解耦,例如:地址锁存器。

B、总线速度相对非复用总线系统低。

(6)俩类总线通信协议:同步方式、异步方式。

(7)对总线仲裁问题的解决是以优先级(优先权)的概念为基础。

8、电平转换电路

(1)数字集成电路能够分为俩大类:双极型集成电路(TTL)、金属氧化物半导体(MOS)o

(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=2PXS«S为尾数,P为阶数。

(4)汉字表示法(教程67、68页),搞清楚GB2318-80中国标码和机内码的变换。

(5)语音编码中波形量化参数(可能会出简单的计算题目哦)

采样频率:壹秒内采样的次数,反映了采样点之间的间隔大小。

人耳的听觉上限是20kHz,因此40kHz之上的采样频率足以使人满意。

CD唱片采用的采样频率是44.1kHzo

测量精度:样本的量化等级,目前标准采样量级有8位和16位俩种。

声道数:单声道和立体声双道。立体声需要俩倍的存储空间。

11、差错控制编码

(1)根据码组的功能,能够分为检错码和纠错码俩类。检错码是指能自动发现差错的码,

例如奇偶检验码;纠错码是指不仅能发现差错而且能自动纠正差错的码,例如循环冗余校验

码。

(2)奇偶检验码、海明码、循环冗余校验码(CRC)o(教程70到77页)

12、嵌入式系统的度量项目

(1)性能指标:分为部件性能指标和综合性能指标,主要包括:吞吐率、实时性和各种利

用率。

(2)可靠性和安全性

可靠性是嵌入式系统最重要、最突出的基本要求,是壹个嵌入式系统能正常工作的保证,壹

般用平均故障间隔时间MTBF来度量。

(3)可维护性:壹般用平均修复时间MTTR表示。

(4)可用性

(5)功耗

(6)环境适应性

(7)通用性

(8)安全性

(9)保密性

(10)可扩展性

性价比中的价格,除了直接购买嵌入式系统的价格外,仍应包含安装费用、若干年的运行维

修费用和软件租用费。

13、嵌入式系统的评价方法:测量法和模型法

(1)测量法是最直接最基本的方法,需要解决俩个问题:

A、根据研究的目的,确定要测量的系统参数。

B、选择测量的工具和方式。

(2)测量的方式有俩种:采样方式和事件跟踪方式。

(3)模型法分为分析模型法和模拟模型法。分析模型法是用壹些数学方程去刻画系统的模型,

而模拟模型法是用模拟程序的运行去动态表达嵌入式系统的状态,而进行系统统计分析,得出性

能指标。

(4)分析模型法中使用最多的是排队模型,它包括三个部分:输入流、排队规则和服务机

构。

(5)使用模型对系统进行评价需要解决3个问题:设计模型、解模型、校准和证实模型。

三'真题解析

1、2007年4、5题

若每壹条指令均能够分解为取指、分析和执行三步。已知取指时间t取指=44t,分析时间

t分析=3Z^t,执行时间t执行=5z\t。如果按串行方式执行完100条指令需要(4)Ato

如果按照流水线方式执行,执行完100条指令需要(5)

(4)A.1190B.1195C.1200D.1205

(5)A.504B.507C.508D.510

〈答案〉:C、B

考查流水线技术知识点。

按照串行的方式,执行完壹条指令才能执行下壹条指令,那么执行完100条指令的时间为:(4

+3+5)X100=1200

按照流水线的方式,能够同时执行多条指令。于第壹条指令进行分析的时候,第二条指令已经

开始取指;当第壹条指令进行执行的时候,第二条指令进行分析,第三条指令取指;当第二条

指令进行执行完的时候,第三条指令已经分析完成。依此类推,当第壹条指令完成之后,每壹

个执行的周期就能够完成壹条指令。需要注意的是,如果流水线的子过程所用时间不壹样长,

则吞吐率应以最长子过程来计算。因此我们能够计算得100条指令的执行时间为:(4

+3+5)+(100-1)X5=507。

2、2007年24题

某总线有104根信号线,其中数据总线(DB)32根,若总线工作频率为33MHz,则其理论最

大传输率为(24)。(注:本题答案中的B表示Byte)

(24)A.33MB/sB.64MB/sC.132MB/sD.164MB/s

〈答案〉:C

考查总线这个知识点。

根据上面的笔记,总线带宽=总线位宽X总线频率/8=32X33/8=132MB/S。

3、2007年26题

某存储器数据总线宽度为32bit,存取周期为250ns,则该存储器带宽为(26)。(注:本题

答案中的B表示Byte)

(26)A.8X106B/sB.16X106B/sC.16X108B/sD.32X106B/s

〈答案〉:B

考查总线这个知识点。

存储器带宽即总线带宽,总线频率为:l/250ns=4X106

存储器带宽为:32X4X106/8=16X106B/s

4、2007年27题

处理机主要由处理器、存储器和总线组成,总线包括(27)。

(27)A.数据总线、串行总线、逻辑总线、物理总线

B.且行总线、地址总线、逻辑总线、物理总线

C.且行总线、串行总线、全双工总线

D.数据总线、地址总线、控制总线

〈答案〉:D

考查总线这个知识点,基本概念的考查。

5、2007年35题

三极管是可控的开关器件,其饱和和截止状态分别对应开关的接通和断开状态。UBE为基极

输入电压,VTH为基极域值电压,如果UBETH,开关应处于(35)状态。

(35)A.接通B.三态C.断开D.高阻

〈答案〉:C

考查电路中最基本的基础知识点,我觉得做不对的根本不能算嵌入式系统开发入门。

6、2007年36题

如下图所示,若低位地址(A0-A11)接于内存芯片地址引脚上,高位地址(A12-A19)进行

片选译码(其中,A14和A16没有参加译码),且片选信号低电平有效,则对下图所示的译码

器,不属于此译码空间的地址为(36)。

(36)A.AB000H-ABFFFHB.BB000H-BBFFFH

C.EF000H-EFFFFHD.FE000H-FEFFFH

<答案》:D

考查数字电路中译码知识和存储系统中统壹编址的问题,相对来说,这个题目有点难度,可

是对于学习过和亲身做过单片机的兄弟来说,最基本不过了。

7、2007年46题

(46)完全把系统软件和硬件部分隔离开来,从而大大提高了系统的可移植性。

(46)A.硬件抽象层B.驱动映射层C.硬件交互层D.中间层

〈答案〉:A

考查嵌入式系统组成中的概念。

8、2006年3题

设指令由取指、分析、执行3个子部件完成,每个子部件的工作周期为At,采用常规标量

单流水线处理机。若连续执行10条指令,则共需要时间(3)At»

(3)A.8B.10C.12D.14

〈答案〉:C

考查流水线技术知识点。

3+(10-1)Xl=12

9、2006年4、5题

某计算机的时钟频率为400MHz,测试计算机的程序使用4种类型的指令。每种指令的数量及

所需要的指令时钟数(CPI)如下表所示,则该计算机的指令平均时钟数为(4);该计算机

的运算速度为(5)MIPSo

指令类型指令数目(条)每条指令需要的时钟数

11600001

2300002

3240004

4160008

(4)A.1.85B.1.93C.2.36D.3.75

(5)A.106.7B.169.5C.207.3D.216.2

〈答案〉:B、C

考查指令运行方面的简单计算。

平均时钟数=(160000+2X30000+4X24000+8X16000)/(160000+30000+24000+16000)

=1.93

MIPS是指每秒种执行多少百万条指令,即106o

计算机的运行数度为:400/1.93=207.25=207.3MIPS

9、2006年12题

计算机要对声音信号进行处理时,必须将它转换为数字声音信号。最基本的声音信号数字化

方法时取样一量化法。若量化后的每个声音样本用2个字节表示,则量化分辨率是(12)

(12)A.1/2B.1/1024C.1/65536D.1/131072

〈答案〉:C

考查声音编码种量化计算的知识点。

2个字节是16位,其量化分辨率位l/1016=l/65536o

10、2006年13题

某幅图像具有640X460个象素点,若每个象素具有8位的颜色深度,则可表示(13)种不同

的颜色,经过5:1压缩后,其图像数据需要占用(14)(Byte)的存储空间。

(13)A.8B,256C.512D.1024

(14)A.61440B.307200C.384000D.3072000

〈答案〉:B、A

考查图像数据存储计算的知识点。

8位颜色深度能够表示28=256种颜色深度。

经过5:1压缩后的数据大小为:640X480X8/8/5=61440o

11、2006年23题

若某逻辑门输入A、B和输出F的波形如下图所示,则F(A,B)的表达式为(23)

(23)A.F=ABB.F=A+B

C.F=A异或BD.F=A(B的非)

AIIII

BI____________

FII

〈答案〉:C

考查数字电路的最基本知识点,我觉得这个均搞不清楚很难通过这个考试。

12、2006年24题

壹个4位的二进制计数器,由0000状态开始,经过25个时钟脉冲后,该计数器的状态为24

(24)A.1100B.1000C.1001D.1010

〈答案〉:C

考查数字电路的最基本知识点,相对上面壹题有点难,需要对计数器的工作原理有比较清楚

的理解。这个也是搞嵌入式系统的基础中的基础,参考教程38页或关联的数电书籍。

4位的计数器,其计数范围是24=16,0000开始经过16个时钟脉冲之后又回到了开始的状

态0000。25—16=9,所以说经过25个时钟之后,其计数器的数值应该是9=1001。

13、2006年25题

稳压二极管构成的稳压电路的接法是(25)

(25)A.稳压管和负载电阻串联。

B.稳压管和限流电阻且联。

C.限流电阻和稳压管串联后,于和负载电阻串联。

D.限流电阻和稳压管串联后,于和负载电阻且联。

〈答案〉:D

考查模拟电路的最基本知识点,实于太简单,不知道从那里开始分析了。

14、2006年26题

以下叙述中,不符合RISC指令系统特点的是(26)

(26)A.指令长度固定,指令种类少。

B.寻址方式种类丰富,指令功能尽量增强。

C.设置大量通用寄存器,访问存储器指令简单。

D.选取使用频率较高的壹些简单指令。

〈答案〉:B

考查RISC和CICS的区别,考生应该清楚他们的区别,参加教程22页。

15、2006年27题

通常所说的32位微处理器是指(27)

(27)A.地址总线的宽度为32位B.处理器数据长度只能为32位

C.CPU字长为32位D.通用寄存器数目为32位

〈答案〉:C

考查字长的概念和总线宽度的理解,参加教程25页。

16、2006年28题

于32位总线系统中,若时钟频率为500MHz,传送壹个32位字需要5个时钟周期,则该总线

系统的数据传送速率为(28)MB/so

(28)A.200B.400C.600D.800

〈答案〉:B

考查总线和数据传输方面的知识点。

5个时钟周期能够传送4个Byte。

每秒中能够传送:4X(500/5)=400MB/so

17、2006年30题

评价壹个计算机系统时,通常主要使用(30)来衡量系统的可靠性。

(30)A.评价响应时间

B.平均无故障时间(MTBF)

C.平均修复时间

D.数据处理速率

〈答案〉:B

考查嵌入式系统性能评价中重要知识点。见过了就会做,每什么分析的,参见教程77页。

四、小结

就我个人的意见,从内容来见,嵌入式系统基础知识的范围很广,知识点很多,而且没有很

强的逻辑性,显得比较凌乱,很难将他们有序的组织于壹起。可是也不要害怕,内容虽然多

而乱,可是考试的题目均比较简单,有些题目几乎是所见即所得。只要你做过嵌入式或者单

片机方面的工作,你均能做出来。壹些计算的题目也是壹些基本概念的延伸。通过分析历年

的真题,壹方面能够把握考试的出题方式和考试难度,同时能够把握这部分内容的出题方向

和复习的方法。从俩年的考试题目数量分布来见,06年10道,07年7道,数量有所较少,

可是我觉得这不是壹个趋势,08年应该不会少于7道题目的。这部分于嵌入式系统设计里面

是相当重要的,有壹个良好的基础才能做好下面的事情。如果复习得好,将这7、8分题目拿到

手,那么你离45分左右的及格线又迈进了壹大步了。

预处理器(Preprocessor)

1.用预处理指令#define声明壹个常数,用以表明1年中有多少秒(忽略闰年问题)

#defineSECONDS_PER_YEAR(60*60*24*365)UL

我于这想见到几件事情:

l)#define语法的基本知识(例如:不能以分号结束,括号的使用,等等)

2)懂得预处理器将为你计算常数表达式的值,因此直接写出你如何计算壹年中有多少秒而不

是计算出实际的值,是更清晰而没有代价的。

3)意识到这个表达式将使壹个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这

个常数是的长整型数。

4)如果你于你的表达式中用到UL(表示无符号长整型),那么你有了壹个好的起点。记住,

第壹印象很重要。

2.写壹个"标准”宏MIN,这个宏输入俩个参数且返回较小的壹个。

#defineMIN(A,B)((A)<=(B)?(A):(B))

这个测试是为下面的目的而设的:

1)标识#define于宏中应用的基本知识。这是很重要的。因为于嵌入(inline)操作符变为标

准C的壹部分之前,宏是方便产生嵌入代码的唯壹方法,对于嵌入式系统来说,为了能达到要

求的性能,嵌入代码经常是必须的方法。

2)三重条件操作符的知识。这个操作符存于C语言中的原因是它使得编译器能产生比

if-then-else更优的代码,了解这个用法是很重要的。

3)懂得于宏中小心地把参数用括号括起来

4)我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?

least=MIN(*p++,b);

3.预处理器标识#error的目的是什么?

如果你不知道答案,请见参考文献lo这问题对区分壹个正常的伙计和壹个书呆子是很有用

的。只有书呆子才会读C语言课本的附录去找出象这种问题的答案。当然如果你不是于找壹

个书呆子,那么应试者最好希望自己不要知道答案。

死循环(Infiniteloops)

4.嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?

这个问题用几个解决方案。我首选的方案是:

while(1)

壹些程序员更喜欢如下方案:

for(;;)

这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果壹个应试者给出这

个作为方案,我将用这个作为壹个机会去探究他们这样做的基本原理。如果他们的基本答案

是:〃我被教着这样做,但从没有想到过为什么。〃这会给我留下壹个坏印象。

第三个方案是用goto

Loop:

gotoLoop;

应试者如给出上面的方案,这说明或者他是壹个汇编语言程序员(这也许是好事)或者他是

壹个想进入新领域的BASIC/FORTRAN程序员。

数据声明(Datadeclarations)

5.用变量a给出下面的定义a)

壹个整型数(Aninteger)

b)壹个指向整型数的指针(Apointertoaninteger)

c)壹个指向指针的的指针,它指向的指针是指向壹个整型数

(Apointertoapointertoanintege)r

d)壹个有10个整型数的数组(AnarrayoflOintegers)

e)壹个有10个指针的数组,该指针是指向壹个整型数的。(AnarrayoflOpointerstointegers)

f)壹个指向有10个整型数数组的指针(ApointertoanarrayoflOintegers)

g)壹个指向函数的指针,该函数有壹个整型参数且返回壹个整型数

(Apointertoathattakesanintegerasanargumentandreturnsaninteger)

h)壹个有10个指针的数组,该指针指向壹个函数,该函数有壹个整型参数且返回壹个整型数

(Anarrayoftenpointerstosthattakeanintegerargumentandreturnaninteger)

答案是:

a)inta;//Aninteger

b)int*a;//Apointertoaninteger

c)int**a;//Apointertoapointertoaninteger

d)inta[10];//AnarrayoflOintegers

e)int*a[10];//AnarrayoflOpointerstointegers

f)int(*a)[10];//ApointertoanarrayoflOintegers

g)int(*a)(int);//Apointertoaathattakesanintegerargumentandreturnsaninteger

h)int(*a[10])(int);//AnarrayoflOpointerstosthattakeanintegerargumentandreturnan

integer

人们经常声称这里有几个问题是那种要翻壹下书才能回答的问题,我同意这种说法。当我写

这篇文章时,为了确定语法的正确性,我的确查了壹下书。可是当我被面试的时候,我期望

被问到这个问题(或者相近的问题)。因为于被面试的这段时间里,我确定我知道这个问题

的答案。应试者如果不知道所有的答案(或至少大部分答案),那么也就没有为这次面试做

准备,如果该面试者没有为这次面试做准备,那么他又能为什么出准备呢?

Static

6.关键字static的作用是什么?

这个简单的问题很少有人能回答完全。于C语言中,关键字static有三个明显的作用:

1)于函数体,壹个被声明为静态的变量于这壹函数被调用过程中维持其值不变。

2)于模块内(但于函数体外),壹个被声明为静态的变量能够被模块内所用函数访问,但不

能被模块外其它函数访问。它是壹个本地的全局变量。

3)于模块内,壹个被声明为静态的函数只可被这壹模块内的其它函数调用。那就是,这个函

数被限制于声明它的模块的本地范围内使用。

大多数应试者能正确回答第壹部分,壹部分能正确回答第二部分,同是很少的人能懂得第三

部分。这是壹个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重

要性。

Const

7.关键字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

8.关键字volatile有什么含意?且给出三个不同的例子。

壹个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假

设这个变量的值了。精确地说就是,优化器于用到这个变量时必须每次均小心地重新读取这个

变量的值,而不是使用保存于寄存器里的备份。下面是volatile变量的几个例子:1)且

行设备的硬件寄存器(如:状态寄存器)

2)壹个中断服务子程序中会访问到的非自动变量(Non-automaticvariables)

3)多线程应用中被几个任务共享的变量

回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最

基本的问题。搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,所有这些均要求用到

volatile变量。不懂得volatile的内容将会带来灾难。

假设被面试者正确地回答了这是问题(嗯,怀疑是否会是这样),我将稍微深究壹下,见壹

下这家伙是不是直正懂得volatile完全的重要性。

1)壹个参数既能够是const仍育的多是volatile吗?解释为什么。

2)壹个指针能够是volatile吗?解释为什么。

3)下面的函数有什么错误:

intsquare(volatileint*ptr)

(

return*ptr**ptr;

)

下面是答案:

1)是的。壹个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它

是const因为程序不应该试图去修改它。

2)是的。尽管这且不很常见。壹个例子是当壹个中服务子程序修该壹个指向壹个buffer的

指针时。

3)这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方,可是,由于*ptr

指向壹个volatile型参数,编译器将产生类似下面的代码:

intsquare(volatileint*ptr)

(

inta,b;

a=*ptr;

b=*ptr;

returna*b;

)

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不

是你所期望的平方值!正确的代码如下:

longsquare(volatileint*ptr)

(

inta;

a=*ptr;

returna*a;

位操作(Bitmanipulation)

9.嵌入式系统总是要用户对变量或寄存器进行位操作。给定壹个整型变量a,写俩段代码,

第壹个设置a的bit3,第二个清除a的bit3。于之上俩个操作中,要保持其它位不变。

对这个问题有三种基本的反应

1)不知道如何下手。该被面者从没做过任何嵌入式系统的工作。

2)用bitfieldsoBitfields是被扔到C语言死角的东西,它保证你的代码于不同编译器之

间是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸见到Infineon为其较

复杂的通信芯片写的驱动程序,它用到了bitfields因此完全对我无用,因为我的编译器用其

它的方式来实现bitfields的。从道德讲:永远不要让壹个非嵌入式的家伙粘实际硬件的边。

3)用#defines和bitmasks操作。这是壹个有极高可移植性的方法,是应该被用到的方法。

最佳的解决方案如下:

#defineBIT3(0xl«3)

staticinta;

voidset_bit3(void)

{a|=BIT

3;

)

voidclear_bit3(void)

(

a&=~BIT3;

)

壹些人喜欢为设置和清除值而定义壹个掩码同时定义壹些说明常数,这也是能够接受的。我

希望见到几个要点:说明常数、|=和&=~操作。

访问固定的内存位置(Accessingfixedmemorylocations)

10.嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。于某工程中,要求设

置壹绝对地址为0x67a9的整型变量的值为0xaa66。编译器是壹个纯粹的ANSI编译器。写代

码去完成这壹任务。

这壹问题测试你是否知道为了访问壹绝对地址把壹个整型数强制转换(typecast)为壹指针

是合法的。这壹问题的实现方式随着个人风格不同而不同。典型的类似代码如下:int*ptr;

ptr=(int*)0x67a9;

*ptr=0xaa55;

Amoreobscureapproachis:

壹个较晦涩的方法是:

*(int*const)(0x67a9)=0xaa55;

即使你的品味更接近第二种方案,但我建议你于面试时使用第壹种方案。

中断(Interrupts)

11.中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供壹种扩展一让标准C

支持中断。具代表事实是,产生了壹个新的关键字.interrupt。下面的代码就使用了

_interrupt关键字去定义了壹个中断服务子程序(ISR),请评论壹下这段代码的。

—interruptdoublecomputearea(doubleradius)

doublearea=PI*radius*radius;

printf("\nArea=%f”,area);

returnarea;

这个函数有太多的错误了,以至让人不知从何说起了:

1)ISR不能返回壹个值。如果你不懂这个,那么你不会被雇用的。

2)ISR不能传递参数。如果你没有见到这壹点,你被雇用的机会等同第壹项。

3)于许多的处理器/编译器中,浮点壹般均是不可重入的。有些处理器/编译器需要让额处的

寄存器入栈,有些处理器/编译器就是不允许于ISR中做浮点运算。止匕外,ISR应该是短而有

效率的,于ISR中做浮点运算是不明智的。

4)和第三点壹脉相承,printfO经常有重入和性能上的问题。如果你丢掉了第三和第

温馨提示

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

评论

0/150

提交评论