嵌入式工程師考試題目_第1頁
嵌入式工程師考試題目_第2頁
嵌入式工程師考試題目_第3頁
嵌入式工程師考試題目_第4頁
嵌入式工程師考試題目_第5頁
已閱讀5頁,還剩23頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

嵌入式工程師考試題目

嵌入式系統設計師考試筆記之嵌入式系統基礎知識

一、引言

自《嵌入式系統設計師考試復習筆記之儲備治理篇》在嵌入式在線的

博客顯現后,意外的得到專門多朋友的關注和評論,收到許多朋友的郵件,

咨詢一些有關考試的咨詢題,期望得到我的復習筆記的其他部分。我專門

感謝他們,他們的熱切關注,使我有了連續往下寫的無限動力,使我萌生

了將我往常的復習筆記、考試體會結合大綱教程并重新按《教程》的章節

順序整理一份適合考生復習的筆記手冊,筆記后面再分析歷年的真題,按

章節考點找出有關的考題進行分析,期望能和有愛好的人們一起討論討論。

嵌入式系統設計師的一天考試分為上午和下午部分,兩部分的考試方

式、試題難度、考點分布和復習方法差不多上不同的。這次我們討論的是

嵌入式系統基礎知識,我本人覺得,這部分出下午大題的可能性不大,要

緊是分布在上午的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)非搶占式調度:通常是按時刻片分配的調度,不承諾任務在執行

期間被中斷,任務一旦占用處理器就必須執行完畢或自愿舍棄,如WinCE。

優點是上下文切換少;缺點是處理器有效資源利用率低,可調度性不行。

(4)靜態表驅動策略:系統在運行前按照各任務的時刻約束及關聯關

系,采納某種搜索策略生成一張運行時刻表,指明各任務的起始運行時刻

及運行時刻。

(5)優先級驅動策略:按照任務優先級的高低確定任務的執行順序。

(6)實時任務分類:周期任務、偶發任務、非周期任務。

(7)實時系統的通用結構模型:數據采集任務實現傳感器數據的采集,

數據處理任務處理采集的數據、并將加工后的數據送到執行機構治理任務

操縱機構執行。

5、嵌入式微處理器體系結構

(1)馮諾依曼結構:程序和數據共用一個儲備空間,程序指令儲備地

址和數據儲備地址指向同一個儲備器的不同物理位置,采納單一的地址及

數據總線,程序和數據的寬度相同。例如:8086、ARM7、MIPS-

(2)哈佛結構:程序和數據是兩個相互獨立的儲備器,每個儲備器獨

立編址、獨立訪咨詢,是一種將程序儲備和數據儲備分開的儲備器結構。

例如:AVR、ARM9、ARMIO-

CS)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)o

(2)總線的要緊參數:

總線帶寬:一定時刻內總線上能夠傳送的數據量,一樣用MByte/s表

不O

總線寬度:總線能同時傳送的數據位數(bit),即人們常講的32位、6

4位等總線寬度的概念,也叫總線位寬。總線的位寬越寬,總線每秒數據傳

輸率越大,也確實是總線帶寬越寬。

總線頻率:工作時鐘頻率以MHz為單位,工作頻率越高,則總線工作

速度越快,也即總線帶寬越寬。

總線帶寬=總線位寬X總線頻率/8,單位是MBps。

常用總線:ISA總線、PCI總線、HC總線、SPI總線、PC104總線和C

AN總線等。

(3)只有具有三態輸出的設備才能夠連接到數據總線上,常用的三態

門為輸出緩沖器。

(4)當總線上所接的負載超過總線的負載能力時,必須在總線和負載

之間加接緩沖器或驅動器,最常用的是三態緩沖器,其作用是驅動和隔離。

(5)采納總線復用技術能夠實現數據總線和地址總線的共用。但會帶

來兩個咨詢題:

A、需要增加外部電路對總線信號進行復用解耦,例如:地址鎖存器。

B、總線速度相對非復用總線系統低。

(6)兩類總線通信協議:同步方式、異步方式。

(7)對總線仲裁咨詢題的解決是以優先級(優先權)的概念為基礎。

8、電平轉換電路

(1)數字集成電路能夠分為兩大類:雙極型集成電路(TTL)、金屬氧

化物半導體(MOS)。

(2)CMOS電路由于其靜態功耗極低,工作速度較高,抗干擾能力較

強,被廣泛使用。

(3)解決TTL與CMOS電路接口困難的方法是在TTL電路輸出端與

電源之間接一上拉電阻R,上拉電阻R的取值由TTL的高電平輸出漏電流

IOH來決定,不同系列的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.1kHz。

測量精度:樣本的量化等級,目前標準采樣量級有8位和16位兩種。

聲道數:單聲道和立體聲雙道。立體聲需要兩倍的儲備空間。

11、差錯操縱編碼

(1)按照碼組的功能,能夠分為檢錯碼和糾錯碼兩類。檢錯碼是指能

自動發覺差錯的碼,例如奇偶檢驗碼;糾錯碼是指不僅能發覺差錯而且能

自動糾正差錯的碼,例如循環冗余校驗碼。

(2)奇偶檢驗碼、海明碼、循環冗余校驗碼(CRC)。(教程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分析=34t,執行時刻t執行=5Z\t。如果按串行方

式執行完100條指令需要(4)△t。如果按照流水線方式執行,執行完1

00條指令需要(5)Ato

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

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

〈答案〉:C、B

考查流水線技術知識點。

按照串行的方式,執行完一條指令才能執行下一條指令,那么執行完1

00條指令的時刻為:(4+3+5)X100=1200

按照流水線的方式,能夠同時執行多條指令。在第一條指令進行分析

的時候,第二條指令差不多開始取指;當第一條指令進行執行的時候,第

二條指令進行分析,第三條指令取指;當第二條指令進行執行完的時候,

第三條指令差不多分析完成。依此類推,當第一條指令完成之后,每一個

執行的周期就能夠完成一條指令。需要注意的是,如果流水線的子過程所

用時刻不一樣長,則吞吐率應以最長子過程來運算。因此,我們能夠運算

得100條指令的執行時刻為:(4+3+5)+(100-1)X5=507o

2、2007年24題

某總線有104根信號線,其中數據總線(DB)32根,若總線工作頻率

為33MHz,則其理論最大傳輸率為(24)o(注:本題答案中的B表示B

yte)

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

〈答案〉:C

考查總線那個知識點。

按照上面的筆記,總線帶寬=總線位寬義總線頻率/8=32X33/8=132

MB/So

3、2007年26題

某儲備器數據總線寬度為32bit,存取周期為250ns,則該儲備器帶寬

為(26)o(注:本題答案中的B表示Byte)

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

〈答案〉:B

考查總線那個知識點。

儲備器帶寬即總線帶寬,總線頻率為:l/250ns=4X106

儲備器帶寬為:32X4X106/8=16X106B/s

4、2007年27題

處理機要緊由處理器、儲備器和總線組成,總線包括(27)o

(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)o

(36)A.ABOOOH-ABFFFHB.BBOOOH-BBFFFH

C.EFOOOH-EFFFFHD.FEOOOH-FEFFFH

〈答案〉:D

考查數字電路中譯碼知識和儲備系統中統一編址的咨詢題,相對來講,

那個題目有點難度,然而關于學習過和親身做過單片機的兄弟來講,最差

不多只是了。

7、2007年46題

(46)完全把系統軟件和硬件部分隔離開來,從而大大提升了系統的

可移植性。

(46)A.硬件抽象層B.驅動映射層C.硬件交互層D.中間層

〈答案〉:A

考查嵌入式系統組成中的概念。

8、2006年3題

設指令由取指、分析、執行3個子部件完成,每個子部件的工作周期

為采納常規標量單流水線處理機。若連續執行10條指令,則共需要時

刻(3)Ato

(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是指每秒種執行多少百萬條指令,即106。

運算機的運行數度為:400/1.93=207.25=207.3MIPS

9、2006年12題

運算機要對聲音信號進行處理時,必須將它轉換為數字聲音信號。最

差不多的聲音信號數字化方法時取樣一量化法。若量化后的每個聲音樣本

用2個字節表示,則量化辨論率是(12)

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

〈答案〉:C

考查聲音編碼種量化運算的知識點。

2個字節是16位,其量化辨論率位1/1016=l/65536o

10、2006年13題

某幅圖像具有640X460個象素點,若每個象素具有8位的顏色深度,

則可表示(13)種不同的顏色,通過5:1壓縮后,其圖像數據需要占用(1

4)(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的非)

AII_II

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

我在這想看到幾件情況:

1)#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的目的是什么?

如果你不明白答案,請看參考文獻1。這咨詢題對區分一個正

常的伙計和一個書呆子是專門有用的。只有書呆子才會讀C語言課本的附

錄去找出象這種咨詢題的答案。所以如果你不是在找一個書呆子,那么應

試者最好期望自己不要明白答案。

死循環(Infiniteloops)

4.嵌入式系統中經常要用到無限循環,你如何樣用C編寫死循環呢?

那個咨詢題用幾個解決方案。我首選的方案是:

while(l)

(

}

一些程序員更喜愛如下方案:

for(;;)

(

}

那個實現方式讓我為難,因為那個語法沒有確切表達到底

如何回事。如果一個應試者給出那個作為方案,我將用那個作為一個機會

去探究他們如此做的差不多原理。如果他們的差不多答案是:“我被教著如

此做,但從沒有想到過什么原因。"這會給我留下一個壞印象。

第三個方案是用goto

Loop:

gotoLoop;

應試者如給出上面的方案,這講明或者他是一個匯編語言程序員(這也許

是好事)或者他是一個想進入新領域的BASIC/FORTRAN程序員。

數據聲明(Datadeclarations)

5.用變量a給出下面的定義

a)一個整型數(Aninteger)

b)一個指向整型數的指針(Apointertoaninteger)

c)一個指向指針的的指針,它指向的指針是指向一個整型數(Apointert

oapointertoanintege)r

d)一個有10個整型數的數組(Anarrayof10integers)

e)一個有10個指針的數組,該指針是指向一個整型數的。(Anarrayof1

0pointerstointegers)

f)一個指向有10個整型數數組的指針(Apointertoanarrayof10inte

gers)

g)一個指向函數的指針,該函數有一個整型參數并返回一個整型數(Apo

intertoathattakesanintegerasanargumentandreturnsaninteger)

h)一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數

并返回一個整型數(Anarrayoftenpointerstosthattakeanintegerar

gumentandreturnaninteger)

答案是:

a)inta;//Aninteger

b)int*a;//Apointertoaninteger

c)int**a;//Apointertoapointertoaninteger

d)inta[10];//Anarrayof10integers

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

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

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

urnsaninteger

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

gumentandreturnaninteger

人們經常聲稱那個地點有幾個咨詢題是那種要翻一下書

才能回答的咨詢題,我同意這種講法。當我寫這篇文章時,為了確定語法

的正確性,我的確查了一下書。然而當我被面試的時候,我期望被咨詢到

那個咨詢題(或者相近的咨詢題)。因為在被面試的這段時刻里,我確定我

明白那個咨詢題的答案。應試者如果不明白所有的答案(或至少大部分答

案),那么也就沒有為這次面試做預備,如果該面試者沒有為這次面試做預

備,那么他又能什么原因出預備呢?

Static

6.關鍵字static的作用是什么?

那個簡單的咨詢題專門少有人能回答完全。在C語言中,關鍵

字static有三個明顯的作用:

1)在函數體,一個被聲明為靜態的變量在這一函數被調用過程中堅持其值

不變。

2)在模塊內(但在函數體外),一個被聲明為靜態的變量能夠被模塊內所用

函數訪咨詢,但不能被模塊外其它函數訪咨詢。它是一個本地的全局變量。

3)在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。

那確實是,那個函數被限制在聲明它的模塊的本地范疇內使用。

大多數應試者能正確回答第一部分,一部分能正確回答第

二部分,同是專門少的人能懂得第三部分。這是一個應試者的嚴峻的缺點,

因為他明顯不懂得本地化數據和代碼范疇的好處和重要性。

Const

constinta;

intconsta;

constint*a;

int*consta;

intconst*aconst;

/******/

前兩個的作用是一樣,a是一個常整型數。第三個意味著a是

一個指向常整型數的指針(也確實是,整型數是不可修改的,但指針能夠)。

第四個意思a是一個指向整型數的常指針(也確實是講,指針指向的整型

數是能夠修改的,但指針是不可修改的)。最后一個意味著a是一個指向常

整型數的常指針(也確實是講,指針指向的整型數是不可修改的,同時指

針也是不可修改的)。如果應試者能正確回答這些咨詢題,那么他就給我留

下了一個好印象。順帶提一句,也許你可能會咨詢,即使不用關鍵字cons

t,也依舊能專門容易寫出功能正確的程序,那么我什么原因還要如此看重

關鍵字const呢?我也如下的幾下理由:

1)關鍵字const的作用是為給讀你代碼的人傳達專門有用的信息,實際上,

聲明一個參數為常量是為了告訴了用戶那個參數的應用目的。如果你曾花

專門多時刻清理其它人留下的垃圾,你就會專門快學會感謝這點余外的信

息。(所以,懂得用const的程序員專門少會留下的垃圾讓別人來清理的。)

2)通過給優化器一些附加的信息,使用關鍵字const也許能產生更緊湊的

代碼。

3)合理地使用關鍵字const能夠使編譯器專門自然地愛護那些不期望被改

變的參數,防止其被無意的代碼修改。簡而言之,如此能夠減少bug的顯

現。

Volatile

8.關鍵字volatile有什么含意?并給出三個不同的例子。

一個定義為volatile的變量是講這變量可能會被意想不到地改

變,如此,編譯器就可不能去假設那個變量的值了。精確地講確實是,優

化器在用到那個變量時必須每次都小心地重新讀取那個變量的值,而不是

使用儲存在寄存器里的備份。下面是volatile變量的幾個例子:

1)并行設備的硬件寄存器(如:狀態寄存器)

2)一個中斷服務子程序中會訪咨詢到的非自動變量(Non-automaticvariable

s)

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為其較復雜的通信芯片寫的驅動程序,它用到了b

itfields因此完全對我無用,因為我的編譯器用其它的方式來實現bitfields

的。從道德講:永久不要讓一個非嵌入式的家伙粘實際硬件的邊。

3)用#defines和bitmasks操作。這是一個有極高可移植性的方法,是應

該被用到的方法。最佳的解決方案如下:

#defineBIT3(0x1?3)

staticinta;

voidset_bit3(void)

(

a|=BIT3;

)

voidclear_bit3(void)

(

a&=-BIT3;

)

一些人喜愛為設置和清除值而定義一個掩碼同時定義一

些講明常數,這也是能夠同意的。我期望看到幾個要點:講明常數、|=和&

=~操作。

訪咨詢固定的內存位置(Accessingfixedmemorylocations)

10.嵌入式系統經常具有要求程序員去訪咨詢某特定的內存位置的特

點。在某工程中,要求設置一絕對地址為0x67a9的整型變量的值為0xaa66。

編譯器是一個純粹的ANSI編譯器。寫代碼去完成這一任務。

這一咨詢題測試你是否明白為了訪咨詢一絕對地址把一個整

型數強制轉換(typecast)為一指針是合法的。這一咨詢題的實現方式隨著

個人風格不同而不同。典型的類似代碼如下:

int*ptr;

ptr=(int*)0x67a9;

*ptr=Oxaa55;

Amoreobscureapproachis:

一個較晦澀的方法是:

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

即使你的品味更接近第二種方案,但我建議你在面試時使用第一種方

案。

中斷(Interrupts)

11.中斷是嵌入式系統中重要的組成部分,這導致了專門多編譯開發商

提供一種擴展一讓標準C支持中斷。具代表事實是,產生了一個新的關鍵

字—interrupto下面的代碼就使用了—interrupt關鍵字去定義了一個中斷服

務子程序(ISR),請評論一下這段代碼的。

—interruptdoublecompute_area(doubleradius)

(

doublearea=PI*radius*radius;

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

returnarea;

)

那個函數有太多的錯誤了,以至讓人不知從何講起了:

1)ISR不能返回一個值。如果你不懂那個,那么你可不能被雇用的。

2)ISR不能傳遞參數。如果你沒有看到這一點,你被雇用的機會等同第一

項。

3)在許多的處理器/編譯器中,浮點一樣差不多上不可重入的。有些處理器

/編譯器需要讓額處的寄存器入棧,有些處理器/編譯器確實是不承諾在ISR

中做浮點運算。此外,ISR應該是短而有效率的,在ISR中做浮點運確實是

不明智的。

4)與第三點一脈相承,printf()經常有重入和性能上的咨詢題。如果你丟掉

了第三和第四點,我可不能太為難你的。不用講,如果你能得到后兩點,

那么你的被雇用前景越來越光明了。

代碼例子(Codeexamples)

12.下面的代碼輸出是什么,什么原因?

voidfoo(void)

(

unsignedinta=6;

intb=-20;

(a+b>6)?puts(">6"):puts("<=6");

)

那個咨詢題測試你是否懂得C語言中的整數自動轉換原則,我

發覺有些開發者懂得極少這些東西。不管如何

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論