版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、嵌入式軟件工程師面試題預(yù)處理器( Preprocessor)1. 用預(yù)處理指令#define聲明一個(gè)常數(shù),用以表明1 年中有多少秒(忽略閏年問(wèn)題)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在這想看到幾件事情:1). #define語(yǔ)法的基本知識(shí)(例如:不能以分號(hào)結(jié)束,括號(hào)的使用,等等)2). 懂得預(yù)處理器將為你計(jì)算常數(shù)表達(dá)式的值,因此,直接寫(xiě)出你是如何計(jì)算一年中有多少秒而不是計(jì)算出實(shí)際的值,是更清晰而沒(méi)有代價(jià)的。3). 意識(shí)到這個(gè)表達(dá)式將使一個(gè)16 位機(jī)的整型數(shù)溢出-因此要用到長(zhǎng)整型符號(hào)L,告訴編譯器這個(gè)常數(shù)是的長(zhǎng)整型數(shù)。4). 如果你在你
2、的表達(dá)式中用到UL (表示無(wú)符號(hào)長(zhǎng)整型),那么你有了一個(gè)好的起點(diǎn)。記住,第一印象很重要。2. 寫(xiě)一個(gè) “標(biāo)準(zhǔn) ”宏 MIN ,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。#define MIN(A,B) (A) = (B) (A) : )C/C+ 試題集C/C+ Development這個(gè)測(cè)試是為下面的目的而設(shè)的:1). 標(biāo)識(shí) #define在宏中應(yīng)用的基本知識(shí)。這是很重要的,因?yàn)橹钡角度?inline) 操作符變?yōu)闃?biāo)準(zhǔn) C 的一部分,宏是方便產(chǎn)生嵌入代碼的唯一方法,對(duì)于嵌入式系統(tǒng)來(lái)說(shuō),為了能達(dá)到要求的性能,嵌入代碼經(jīng)常是必須的方法。2). 三重條件操作符的知識(shí)。這個(gè)操作符存在C 語(yǔ)言中的原因是它使得
3、編譯器能產(chǎn)生比if-then-else更優(yōu)化的代碼,了解這個(gè)用法是很重要的。3). 懂得在宏中小心地把參數(shù)用括號(hào)括起來(lái)4). 我也用這個(gè)問(wèn)題開(kāi)始討論宏的副作用,例如:當(dāng)你寫(xiě)下面的代碼時(shí)會(huì)發(fā)生什么事?Least = MIN(*p+, b);3. 預(yù)處理器標(biāo)識(shí) #error 的目的是什么?如果你不知道答案, 請(qǐng)看參考文獻(xiàn) 1。這問(wèn)題對(duì)區(qū)分一個(gè)正常的伙計(jì)和一個(gè)書(shū)呆子是很有用的。只有書(shū)呆子才會(huì)讀 C 語(yǔ)言課本的附錄去找出象這種問(wèn)題的答案。當(dāng)然如果你不是在找一個(gè)書(shū)呆子,那么應(yīng)試者最好希望自己不要知道答案。死循環(huán)( Infinite loops )4. 嵌入式系統(tǒng)中經(jīng)常要用到無(wú)限循環(huán),你怎么樣用C 編寫(xiě)死
4、循環(huán)呢?. 個(gè) 用幾個(gè)解決方案。我首 的方案是:while(1) 一些程序 更喜 如下方案:for(;) 個(gè) 方式 我 ,因 個(gè) 法沒(méi)有確切表達(dá)到底怎么回事。如果一個(gè) 者 出 個(gè)作 方案,我將用 個(gè)作 一個(gè)機(jī)會(huì)去探究他 做的基本原理。如果他 的基本答案是:“我被教著 做,但從沒(méi)有想到 什么?!?會(huì) 我留下一個(gè)壞印象。第三個(gè)方案是用gotoLoop:goto Loop; 者如 出上面的方案, 明或者他是一個(gè) 言程序 ( 也 是好事) 或者他是一個(gè)想 入新 域的 BASIC/FORTRAN 程序 。數(shù)據(jù)聲明( Data declarations)5. 用 量 a 出下面的定 a) 一個(gè)整型數(shù)(An
5、 integer )b) 一個(gè)指向整型數(shù)的指 (A pointer to an integer)c) 一個(gè)指向指 的的指 ,它指向的指 是指向一個(gè)整型數(shù)(A pointer to a pointer to aninteger )d) 一個(gè)有 10 個(gè)整型數(shù)的數(shù) (An array of 10 integers)e) 一個(gè)有 10 個(gè)指 的數(shù) , 指 是指向一個(gè)整型數(shù)的(An array of 10 pointers tointegers )f) 一個(gè)指向有10 個(gè)整型數(shù)數(shù) 的指 (A pointer to an array of 10 integers)g) 一個(gè)指向函數(shù)的指 , 函數(shù)有一個(gè)整
6、型參數(shù)并返回一個(gè)整型數(shù)(A pointer to a functionthat takes an integer as an argument and returns an integer)h) 一個(gè)有 10 個(gè)指 的數(shù) , 指 指向一個(gè)函數(shù), 函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)( An array of ten pointers to functions that take an integer argument and return an integer )答案是:a) int a; / An integerb) int *a; / A pointer to an integerc) in
7、t *a; / A pointer to a pointer to an integer.d) int a10; / An array of 10 integerse) int *a10; / An array of 10 pointers to integersf) int (*a)10; / A pointer to an array of 10 integersg) int (*a)(int); / A pointer to a function a that takes an integer argument and returns an integerh) int (*a10)(in
8、t); / An array of 10 pointers to functions that take an integer argument and return an integer人們經(jīng)常聲稱(chēng)這里有幾個(gè)問(wèn)題是那種要翻一下書(shū)才能回答的問(wèn)題,我同意這種說(shuō)法。當(dāng)我寫(xiě)這篇文章時(shí),為了確定語(yǔ)法的正確性,我的確查了一下書(shū)。但是當(dāng)我被面試的時(shí)候,我期望被問(wèn)到這個(gè)問(wèn)題(或者相近的問(wèn)題)。因?yàn)樵诒幻嬖嚨倪@段時(shí)間里,我確定我知道這個(gè)問(wèn)題的答案。應(yīng)試者如果不知道所有的答案 (或至少大部分答案),那么也就沒(méi)有為這次面試做準(zhǔn)備,如果該面試者沒(méi)有為這次面試做準(zhǔn)備,那么他又能為什么出準(zhǔn)備呢?Static6. 關(guān)鍵字
9、 static 的作用是什么?這個(gè)簡(jiǎn)單的問(wèn)題很少有人能回答完全。在C 語(yǔ)言中,關(guān)鍵字static 有三個(gè)明顯的作用:1). 在函數(shù)體,一個(gè)被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過(guò)程中維持其值不變。2). 在模塊內(nèi)(但在函數(shù)體外),一個(gè)被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪(fǎng)問(wèn),但不能被模塊外其它函數(shù)訪(fǎng)問(wèn)。它是一個(gè)本地的全局變量。3). 在模塊內(nèi),一個(gè)被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。大多數(shù)應(yīng)試者能正確回答第一部分, 一部分能正確回答第二部分, 同是很少的人能懂得第三部分。這是一個(gè)應(yīng)試者的嚴(yán)重的缺點(diǎn), 因?yàn)樗@然不懂得本地化數(shù)據(jù)和
10、代碼范圍的好處和重要性。Const7關(guān)鍵字const 是什么含意?我只要一聽(tīng)到被面試者說(shuō):“const意味著常數(shù) ”,我就知道我正在和一個(gè)業(yè)余者打交道。去年 Dan Saks已經(jīng)在他的文章里完全概括了const 的所有用法, 因此 ESP( 譯者:Embedded.Systems Programming)的每一位讀者應(yīng)該非常熟悉const 能做什么和不能做什么.如果你從沒(méi)有讀到那篇文章,只要能說(shuō)出const 意味著 “只讀 ”就可以了。盡管這個(gè)答案不是完全的答案,但我接受它作為一個(gè)正確的答案。(如果你想知道更詳細(xì)的答案,仔細(xì)讀一下Saks 的文章吧。)如果應(yīng)試者能正確回答這個(gè)問(wèn)題,我將問(wèn)他一個(gè)
11、附加的問(wèn)題:下面的聲明都是什么意思?Const int a;int const a;const int *a;int * const a;int const * a const;前兩個(gè)的作用是一樣,a 是一個(gè)常整型數(shù)。第三個(gè)意味著a 是一個(gè)指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個(gè)意思a 是一個(gè)指向整型數(shù)的常指針(也就是說(shuō),指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后一個(gè)意味著a 是一個(gè)指向常整型數(shù)的常指針(也就是說(shuō), 指針指向的整型數(shù)是不可修改的,同時(shí)指針也是不可修改的) 。如果應(yīng)試者能正確回答這些問(wèn)題,那么他就給我留下了一個(gè)好印象。順帶提一句,也許你可
12、能會(huì)問(wèn),即使不用關(guān)鍵字const ,也還是能很容易寫(xiě)出功能正確的程序,那么我為什么還要如此看重關(guān)鍵字const 呢?我也如下的幾下理由:1). 關(guān)鍵字 const 的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實(shí)際上,聲明一個(gè)參數(shù)為常量是為了告訴了用戶(hù)這個(gè)參數(shù)的應(yīng)用目的。如果你曾花很多時(shí)間清理其它人留下的垃圾,你就會(huì)很快學(xué)會(huì)感謝這點(diǎn)多余的信息。(當(dāng)然, 懂得用 const 的程序員很少會(huì)留下的垃圾讓別人來(lái)清理的。)2). 通過(guò)給優(yōu)化器一些附加的信息,使用關(guān)鍵字const 也許能產(chǎn)生更緊湊的代碼。3). 合理地使用關(guān)鍵字const 可以使編譯器很自然地保護(hù)那些不希望被改變的參數(shù),防止其被無(wú)意的代碼
13、修改。簡(jiǎn)而言之,這樣可以減少bug 的出現(xiàn)。Volatile8. 關(guān)鍵字 volatile 有什么含意 并給出三個(gè)不同的例子。一個(gè)定義為 volatile 的變量是說(shuō)這變量可能會(huì)被意想不到地改變,這樣,編譯器就不會(huì)去假設(shè)這個(gè)變量的值了。 精確地說(shuō)就是, 優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份。下面是volatile 變量的幾個(gè)例子:1). 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)2). 一個(gè)中斷服務(wù)子程序中會(huì)訪(fǎng)問(wèn)到的非自動(dòng)變量(Non-automatic variables)3). 多線(xiàn)程應(yīng)用中被幾個(gè)任務(wù)共享的變量.回答不出這個(gè)問(wèn)題的人是不會(huì)被
14、雇傭的。我認(rèn)為這是區(qū)分C 程序員和嵌入式系統(tǒng)程序員的最基本的問(wèn)題。嵌入式系統(tǒng)程序員經(jīng)常同硬件、中斷、 RTOS 等等打交道, 所用這些都要求volatile 變量。不懂得volatile 內(nèi)容將會(huì)帶來(lái)災(zāi)難。假設(shè)被面試者正確地回答了這是問(wèn)題(嗯,懷疑這否會(huì)是這樣),我將稍微深究一下,看一下這家伙是不是直正懂得volatile 完全的重要性。1). 一個(gè)參數(shù)既可以是const 還可以是volatile 嗎?解釋為什么。2). 一個(gè)指針可以是volatile嗎?解釋為什么。3). 下面的函數(shù)有什么錯(cuò)誤:int square(volatile int *ptr)return *ptr * *ptr;下
15、面是答案:1). 是的。一個(gè)例子是只讀的狀態(tài)寄存器。它是volatile 因?yàn)樗赡鼙灰庀氩坏降馗淖?。它?const 因?yàn)槌绦虿粦?yīng)該試圖去修改它。2). 是的。盡管這并不很常見(jiàn)。一個(gè)例子是當(dāng)一個(gè)中服務(wù)子程序修該一個(gè)指向一個(gè)buffer 的指針時(shí)。3). 這段代碼的有個(gè)惡作劇。這段代碼的目的是用來(lái)返指針*ptr 指向值的平方,但是,由于*ptr 指向一個(gè)volatile 型參數(shù),編譯器將產(chǎn)生類(lèi)似下面的代碼:int square(volatile int *ptr)int a,b;a = *ptr;b = *ptr;return a * b;由于 *ptr 的值可能被意想不到地該變,因此 a 和
16、 b 可能是不同的。 結(jié)果, 這段代碼可能返不是你所期望的平方值!正確的代碼如下:long square(volatile int *ptr)int a;a = *ptr;return a * a;位操作( Bit manipulation).9. 嵌入式系統(tǒng)總是要用戶(hù)對(duì)變量或寄存器進(jìn)行位操作。給定一個(gè)整型變量 a ,寫(xiě)兩段代碼,第一個(gè)設(shè)置a 的 bit 3 ,第二個(gè)清除a 的 bit 3 。在以上兩個(gè)操作中,要保持其它位不變。對(duì)這個(gè)問(wèn)題有三種基本的反應(yīng)1). 不知道如何下手。該被面者從沒(méi)做過(guò)任何嵌入式系統(tǒng)的工作。2). 用 bit fields 。Bit fields 是被扔到C 語(yǔ)言死角的
17、東西,它保證你的代碼在不同編譯器之間是不可移植的,同時(shí)也保證了的你的代碼是不可重用的。我最近不幸看到Infineon為其較復(fù)雜的通信芯片寫(xiě)的驅(qū)動(dòng)程序,它用到了bit fields因此完全對(duì)我無(wú)用,因?yàn)槲业木幾g器用其它的方式來(lái)實(shí)現(xiàn)bit fields 的。從道德講:永遠(yuǎn)不要讓一個(gè)非嵌入式的家伙粘實(shí)際硬件的邊。3). 用 #defines和 bit masks操作。這是一個(gè)有極高可移植性的方法,是應(yīng)該被用到的方法。最佳的解決方案如下:#define BIT3 (0x1 6) puts( 6) : puts(6”原因是當(dāng)表達(dá)式中存在有符號(hào) 。型和無(wú)符號(hào) 型 所有的操作數(shù)都自 無(wú)符號(hào) 型。因此 -20
18、 成了一個(gè)非常大的正整數(shù), 所以 表達(dá)式 算出的 果大于 6 。 一點(diǎn) 于 當(dāng) 繁用到無(wú)符號(hào)數(shù)據(jù) 型的嵌入式系 來(lái) 是豐常重要的。如果你答 了 個(gè) ,你也就到了得不到 份工作的 。13. 價(jià)下面的代 片斷:unsigned int zero = 0;unsigned int compzero = 0xFFFF;/*1s complement of zero */ 于一個(gè) int 型不是 16 位的 理器 ,上面的代 是不正確的。 寫(xiě)如下:unsigned int compzero = 0; 一 真正能揭露出 者是否懂得 理器字 的重要性。在我的 里, 好的嵌入式程序 非常準(zhǔn)確地明白硬件的 和它
19、的局限,然而 PC 機(jī)程序往往把硬件作 一個(gè)無(wú)法避免的 。到了 個(gè) 段, 者或者完全垂 氣了或者信心 志在必得。如果 然 者不是很好,那么 個(gè) 就在 里 束了。但如果 然 者做得不 ,那么我就扔出下面的追加 , 些 是比 的,我想 非常 秀的 者能做得不 。提出 些 , 我希望更多看到 者 付 的方法,而不是答案。不管如何,你就當(dāng)是 個(gè) 吧 內(nèi)存分配(Dynamic memory allocation)14. 盡管不像非嵌入式 算機(jī)那么常 ,嵌入式系 是有從堆(heap )中 分配內(nèi)存的 程的。那么嵌入式系 中, 分配內(nèi)存可能 生的 是什么? 里, 我期望 者能提到內(nèi)存碎片,碎片收集的 , 量
20、的持行 等等。 個(gè)主 已 在 ESP 志中被廣泛地 了(主要是P.J. Plauger,他的解 超 我 里能提到的任何解 ) ,所有回 看一下 些 志吧! 者 入一種虛假的安全感 后,我拿出 么一個(gè)小 目:下面的代 片段的 出是什么, 什么?Char *ptr;if (ptr = (char *)malloc(0) = NULL).puts(Got a null pointer);elseputs(Got a valid pointer);這是一個(gè)有趣的問(wèn)題。最近在我的一個(gè)同事不經(jīng)意把0 值傳給了函數(shù)malloc ,得到了一個(gè)合法的指針之后,我才想到這個(gè)問(wèn)題。這就是上面的代碼,該代碼的輸出是“Got a validpointer 。”我用這個(gè)來(lái)開(kāi)始討論這樣的一問(wèn)題,看看被面試者是否想到庫(kù)例程這樣做是正確。得到正確的答案固然重要,但解決問(wèn)題的方法和你
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026北京工業(yè)大學(xué)人才引進(jìn)4人備考題庫(kù)及答案詳解(奪冠系列)
- 2025中國(guó)資源循環(huán)集團(tuán)機(jī)動(dòng)車(chē)有限公司崗位招聘?jìng)淇碱}庫(kù)及答案詳解一套
- 2026四川大學(xué)華西臨床醫(yī)學(xué)院、華西醫(yī)院專(zhuān)職博士后招聘?jìng)淇碱}庫(kù)及完整答案詳解一套
- 2026年1月廣東湛江市坡頭區(qū)人力資源和社會(huì)保障局招聘編外人員2人備考題庫(kù)參考答案詳解
- 2026山東聊城市市屬事業(yè)單位招聘初級(jí)綜合類(lèi)崗位人員備考題庫(kù)及一套答案詳解
- 2025-2030長(zhǎng)江經(jīng)濟(jì)帶高質(zhì)量發(fā)展創(chuàng)新發(fā)展投資機(jī)遇評(píng)估規(guī)劃研究分析報(bào)告
- 2026太平洋財(cái)險(xiǎn)安慶中支招聘信息13人備考題庫(kù)(安徽)(含答案詳解)
- 2025年漯河市城鄉(xiāng)一體化示范區(qū)事業(yè)單位人才引進(jìn)7人備考題庫(kù)及1套完整答案詳解
- 2025-2030造紙行業(yè)市場(chǎng)需求供給調(diào)研及投資收益規(guī)劃深度研究報(bào)告
- 2025-2030造紙行業(yè)市場(chǎng)深度調(diào)研及未來(lái)發(fā)展趨勢(shì)報(bào)告
- 字母認(rèn)主協(xié)議書(shū)(2篇)
- (完整)七年級(jí)生物上冊(cè)思維導(dǎo)圖
- 建筑工程崗前實(shí)踐報(bào)告1500字
- 甲狀腺手術(shù)甲狀旁腺保護(hù)
- HG20202-2014 脫脂工程施工及驗(yàn)收規(guī)范
- 重慶市沙坪壩區(qū)南開(kāi)中學(xué)校2022-2023學(xué)年七年級(jí)上學(xué)期期末地理試題
- 小學(xué)語(yǔ)文五年下冊(cè)《兩莖燈草》說(shuō)課稿(附教學(xué)反思、板書(shū))課件
- 曼娜回憶錄的小說(shuō)全文
- 飲食與心理健康:食物對(duì)情緒的影響
- 父親給孩子的一封信高中生(五篇)
- (完整word版)大一高數(shù)期末考試試題
評(píng)論
0/150
提交評(píng)論