嵌入式軟件工程師_第1頁
嵌入式軟件工程師_第2頁
嵌入式軟件工程師_第3頁
嵌入式軟件工程師_第4頁
嵌入式軟件工程師_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、軟件工程師筆試題(C/C+)2008-03-25 18:19預(yù)處理器(Preprocessor)1. 用預(yù)處理理指令#deefine 聲明一個(gè)常常數(shù),用以表表明1年中有多少少秒(忽略閏閏年問題)#definee SECOONDS_PPER_YEEAR (660 * 660 * 224 * 3365)ULL 我在這想看到幾幾件事情: 1). #deefine 語法的基本本知識(shí)(例如如:不能以分分號(hào)結(jié)束,括括號(hào)的使用,等等等) 2). 懂得預(yù)預(yù)處理器將為為你計(jì)算常數(shù)數(shù)表達(dá)式的值值,因此,直直接寫出你是是如何計(jì)算一一年中有多少少秒而不是計(jì)計(jì)算出實(shí)際的的值,是更清清晰而沒有代代價(jià)的。 3). 意識(shí)到到

2、這個(gè)表達(dá)式式將使一個(gè)116位機(jī)的整整型數(shù)溢出-因此要用到到長整型符號(hào)號(hào)L,告訴編譯譯器這個(gè)常數(shù)數(shù)是的長整型型數(shù)。 4). 如果你你在你的表達(dá)達(dá)式中用到UUL(表示無無符號(hào)長整型型),那么你你有了一個(gè)好好的起點(diǎn)。記記住,第一印印象很重要。2. 寫一個(gè)標(biāo)準(zhǔn)宏MIN,這個(gè)個(gè)宏輸入兩個(gè)個(gè)參數(shù)并返回回較小的一個(gè)個(gè)。#definee MIN(A,B) (A) = (BB) (A) : (BB) 這個(gè)測(cè)試是為下下面的目的而而設(shè)的: 1). 標(biāo)識(shí)#definne在宏中應(yīng)應(yīng)用的基本知知識(shí)。這是很很重要的,因因?yàn)橹钡角度肴?inlinne)操作符符變?yōu)闃?biāo)準(zhǔn)CC的一部分,宏宏是方便產(chǎn)生生嵌入代碼的的唯一方法,對(duì)對(duì)于

3、嵌入式系系統(tǒng)來說,為為了能達(dá)到要要求的性能,嵌嵌入代碼經(jīng)常常是必須的方方法。 2). 三重條條件操作符的的知識(shí)。這個(gè)個(gè)操作符存在在C語言中的原原因是它使得得編譯器能產(chǎn)產(chǎn)生比if-then-else更更優(yōu)化的代碼碼,了解這個(gè)個(gè)用法是很重重要的。 3). 懂得在在宏中小心地地把參數(shù)用括括號(hào)括起來 4). 我也用用這個(gè)問題開開始討論宏的的副作用,例例如:當(dāng)你寫寫下面的代碼碼時(shí)會(huì)發(fā)生什什么事? least = MIN(*p+, b);3. 預(yù)處理器器標(biāo)識(shí)#errror的目目的是什么?如果你不知道答答案,請(qǐng)看參參考文獻(xiàn)1。這問題對(duì)對(duì)區(qū)分一個(gè)正正常的伙計(jì)和和一個(gè)書呆子子是很有用的的。只有書呆呆子才會(huì)讀CC

4、語言課本的的附錄去找出出象這種 問題的答案。當(dāng)當(dāng)然如果你不不是在找一個(gè)個(gè)書呆子,那那么應(yīng)試者最最好希望自己己不要知道答答案。死循環(huán)(Inffinitee loopps)4. 嵌入式系系統(tǒng)中經(jīng)常要要用到無限循循環(huán),你怎么么樣用C編寫死循環(huán)環(huán)呢?這個(gè)問題用幾個(gè)個(gè)解決方案。我我首選的方案案是: while(11) 一些程序員更喜喜歡如下方案案: for(;) 這個(gè)實(shí)現(xiàn)方式讓讓我為難,因因?yàn)檫@個(gè)語法法沒有確切表表達(dá)到底怎么么回事。如果果一個(gè)應(yīng)試者者給出這個(gè)作作為方案,我我將用這個(gè)作作為一個(gè)機(jī)會(huì)會(huì)去探究他們們這樣做的 基本原理。如果果他們的基本本答案是:我被教著這這樣做,但從從沒有想到過過為什么。這會(huì)給

5、我留留下一個(gè)壞印印象。 第三個(gè)方案是用用 gotoo Loop: . goto Looop; 應(yīng)試者如給出上上面的方案,這這說明或者他他是一個(gè)匯編編語言程序員員(這也許是是好事)或者者他是一個(gè)想想進(jìn)入新領(lǐng)域域的BASIIC/FORRTRAN程程序員。數(shù)據(jù)聲明(Daata deeclaraationss) 5. 用變量aa給出下面的的定義a) 一個(gè)整型型數(shù)(An integger) b) 一個(gè)指向向整型數(shù)的指指針(A ppointeer to an inntegerr) c) 一個(gè)指向向指針的的指指針,它指向向的指針是指指向一個(gè)整型型數(shù)(A ppointeer to a poiinter to

6、ann inteeger) d) 一個(gè)有110個(gè)整型數(shù)數(shù)的數(shù)組(AAn arrray off 10 iintegeers) e) 一個(gè)有110個(gè)指針的的數(shù)組,該指指針是指向一一個(gè)整型數(shù)的的(An aarray of 100 poinnters to inntegerrs) f) 一個(gè)指向向有10個(gè)整型數(shù)數(shù)數(shù)組的指針針(A poointerr to aan arrray off 10 iintegeers) g) 一個(gè)指向向函數(shù)的指針針,該函數(shù)有有一個(gè)整型參參數(shù)并返回一一個(gè)整型數(shù)(A pointer to a function that takes an integer as an argume

7、nt and returns an integer) h) 一個(gè)有110個(gè)指針的的數(shù)組,該指指針指向一個(gè)個(gè)函數(shù),該函函數(shù)有一個(gè)整整型參數(shù)并返返回一個(gè)整型型數(shù)( Ann arraay of ten ppointeers too funcctionss thatt takee an iintegeer arggumentt and returrn an integger )答案是: a) int a; / An iintegeer b) int *a; / A ppointeer to an inntegerr c) int *a; / A pointter too a poointerr to

8、aan intteger d) int a10; / An arrray oof 10 integgers e) int *a100; / An aarray of 100 poinnters to inntegerrs f) int (*a)10; / A pointter too an aarray of 100 inteegers g) int (*a)(int); / AA poinnter tto a ffunctiion a that takess an iintegeer arggumentt and returrns ann inteeger h) int (*a110)(ii

9、nt); / Ann arraay of 10 poointerrs to functtions that take an inntegerr arguument and rreturnn an iintegeer 人們經(jīng)常聲稱這這里有幾個(gè)問問題是那種要要翻一下書才才能回答的問問題,我同意意這種說法。當(dāng)當(dāng)我寫這篇文文章時(shí),為了了確定語法的的正確性,我我的確查了一一下書。 但是當(dāng)我被面試試的時(shí)候,我我期望被問到到這個(gè)問題(或或者相近的問問題)。因?yàn)闉樵诒幻嬖嚨牡倪@段時(shí)間里里,我確定我我知道這個(gè)問問題的答案。應(yīng)應(yīng)試者如果不不知道 所有的答案(或或至少大部分分答案),那那么也就沒有有為這次面試試做準(zhǔn)

10、備,如如果該面試者者沒有為這次次面試做準(zhǔn)備備,那么他又又能為什么出出準(zhǔn)備呢?Static6. 關(guān)鍵字sstaticc的作用是什什么?這個(gè)簡單的問題題很少有人能能回答完全。在在C語言中,關(guān)關(guān)鍵字staticc有三個(gè)明顯顯的作用: 1). 在函數(shù)數(shù)體,一個(gè)被被聲明為靜態(tài)態(tài)的變量在這這一函數(shù)被調(diào)調(diào)用過程中維維持其值不變變。 2). 在模塊塊內(nèi)(但在函函數(shù)體外),一一個(gè)被聲明為為靜態(tài)的變量量可以被模塊塊內(nèi)所用函數(shù)數(shù)訪問,但不不能被模塊外外其它函數(shù)訪訪問。它是一一個(gè)本地的全全局變量。 3). 在模塊塊內(nèi),一個(gè)被被聲明為靜態(tài)態(tài)的函數(shù)只可可被這一模塊塊內(nèi)的其它函函數(shù)調(diào)用。那那就是,這個(gè)個(gè)函數(shù)被限制制在聲明它

11、的的模塊的本地地范圍內(nèi)使用用。 大多數(shù)應(yīng)試者能能正確回答第第一部分,一一部分能正確確回答第二部部分,同是很很少的人能懂懂得第三部分分。這是一個(gè)個(gè)應(yīng)試者的嚴(yán)嚴(yán)重的缺點(diǎn),因因?yàn)樗@然不不懂得本地化化數(shù)據(jù)和代碼碼范圍的好處處和重要性。Const 7關(guān)鍵字coonst是什什么含意?我只要一聽到被被面試者說:consst意味著常常數(shù),我就知道道我正在和一一個(gè)業(yè)余者打打交道。去年年Dan SSaks已經(jīng)經(jīng)在他的文章章里完全概括括了consst的所有用用法,因此EESP(譯者者:Embeedded Systeems Prrogrammming)的每一位讀讀者應(yīng)該非常常熟悉connst能做什什么和不能做做什么

12、.如果你從沒沒有讀到那篇篇文章,只要要能說出coonst意味味著只讀就可以了。盡盡管這個(gè)答案案不是完全的的答案,但我我接受它作為為一個(gè)正確的的答案。(如如果你想知道道更詳細(xì)的答答案,仔細(xì)讀讀一下Sakks的文章吧吧。)如果應(yīng)應(yīng)試者能正確確回答這個(gè)問問題,我將問問他一個(gè)附加加的問題:下下面的聲明都都是什么意思思?const iint a; int connst a; const iint *aa; int * cconst a; int connst * a connst;前兩個(gè)的作用是是一樣,a是一個(gè)常整整型數(shù)。第三三個(gè)意味著aa是一個(gè)指向向常整型數(shù)的的指針(也就就是,整型數(shù)數(shù)是不可修改改的,

13、但指針針可以)。第第四個(gè)意思aa是一個(gè)指向向整型數(shù)的常常指針(也就就是說,指針針指向的整型型數(shù)是可以修修改的,但指指針是不可修修改的)。最最后一個(gè)意味味著a是一個(gè)指向向常整型數(shù)的的常指針(也也就是說,指指針指向的整整型數(shù)是不可可修改的,同同時(shí)指針也是是不可修改的的)。如果應(yīng)應(yīng)試者能正確確回答這些問問題,那么他他就給我留下下了一個(gè)好印印象。順帶提提一句,也許許你可能會(huì)問問,即使不用用關(guān)鍵字coonst,也也還是能很容容易寫出功能能正確的程序序,那么我為為什么還要如如此看重關(guān)鍵鍵字consst呢?我也也如下的幾下下理由: 1). 關(guān)鍵字字constt的作用是為為給讀你代碼碼的人傳達(dá)非非常有用的信信

14、息,實(shí)際上上,聲明一個(gè)個(gè)參數(shù)為常量量是為了告訴訴了用戶這個(gè)個(gè)參數(shù)的應(yīng)用用目的。如果果你曾花很多多時(shí)間清理其其它人留下的的垃圾,你就就會(huì)很快學(xué)會(huì)會(huì)感謝這點(diǎn)多多余的信息。(當(dāng)當(dāng)然,懂得用用constt的程序員很很少會(huì)留下的的垃圾讓別人人來清理的。) 2). 通過給給優(yōu)化器一些些附加的信息息,使用關(guān)鍵鍵字consst也許能產(chǎn)產(chǎn)生更緊湊的的代碼。 3). 合理地地使用關(guān)鍵字字constt可以使編譯譯器很自然地地保護(hù)那些不不希望被改變變的參數(shù),防防止其被無意意的代碼修改改。簡而言之之,這樣可以以減少bugg的出現(xiàn)。Volatille 8. 關(guān)鍵字vvolatiile有什么么含意 并給出三個(gè)個(gè)不同的例子子

15、。一個(gè)定義為voolatille的變量是是說這變量可可能會(huì)被意想想不到地改變變,這樣,編編譯器就不會(huì)會(huì)去假設(shè)這個(gè)個(gè)變量的值了了。精確地說說就是,優(yōu)化化器在用到這這個(gè)變量時(shí)必必須每次都小小心地重新讀讀取這個(gè)變量量的值,而不不是使用保存存在寄存器里里的備份。下下面是vollatilee變量的幾個(gè)個(gè)例子: 1). 并行設(shè)設(shè)備的硬件寄寄存器(如:狀態(tài)寄存器器) 2). 一個(gè)中中斷服務(wù)子程程序中會(huì)訪問問到的非自動(dòng)動(dòng)變量(Noon-auttomatiic varriablees) 3). 多線程程應(yīng)用中被幾幾個(gè)任務(wù)共享享的變量 回答不出這個(gè)問問題的人是不不會(huì)被雇傭的的。我認(rèn)為這這是區(qū)分C程序員和嵌嵌入式系

16、統(tǒng)程程序員的最基基本的問題。嵌嵌入式系統(tǒng)程程序員經(jīng)常同同硬件、中斷斷、RTOSS等等打交道道,所用這些些都要求voolatille變量。不不懂得vollatilee內(nèi)容將會(huì)帶帶來災(zāi)難。 假設(shè)被面試者正正確地回答了了這是問題(嗯嗯,懷疑這否否會(huì)是這樣),我我將稍微深究究一下,看一一下這家伙是是不是直正懂懂得volaatile完完全的重要性性。 1). 一個(gè)參參數(shù)既可以是是constt還可以是voolatille嗎?解釋釋為什么。 2). 一個(gè)指指針可以是vvolatiile 嗎?解釋為什么么。 3). 下面的的函數(shù)有什么么錯(cuò)誤: int squuare(vvolatiile innt *pttr

17、) return *ptr * *pttr; 下面是答案: 1). 是的。一一個(gè)例子是只只讀的狀態(tài)寄寄存器。它是是volattile因?yàn)闉樗赡鼙灰庖庀氩坏降馗母淖?。它是cconst因因?yàn)槌绦虿粦?yīng)應(yīng)該試圖去修修改它。 2). 是的。盡盡管這并不很很常見。一個(gè)個(gè)例子是當(dāng)一一個(gè)中服務(wù)子子程序修該一一個(gè)指向一個(gè)個(gè)buffeer的指針時(shí)時(shí)。 3). 這段代代碼的有個(gè)惡惡作劇。這段段代碼的目的的是用來返指指針*ptrr指向值的平平方,但是,由由于*ptrr指向一個(gè)voolatille型參數(shù),編編譯器將產(chǎn)生生類似下面的的代碼: int squuare(vvolatiile innt *pttr) int

18、a,bb; a = *pttr; b = *pttr; return a * bb; 由于*ptr的的值可能被意意想不到地該該變,因此aa和b可能是不同同的。結(jié)果,這這段代碼可能能返不是你所所期望的平方方值!正確的的代碼如下: long sqquare(volattile iint *pptr) int a; a = *pttr; return a * aa; 位操作(Bitt maniipulattion)9. 嵌入式系系統(tǒng)總是要用用戶對(duì)變量或或寄存器進(jìn)行行位操作。給給定一個(gè)整型型變量a,寫兩段代代碼,第一個(gè)個(gè)設(shè)置a的bit 33,第二個(gè)清清除a 的bit 33。在以上兩兩個(gè)操作中,要要保持

19、其它位位不變。對(duì)這個(gè)問題有三三種基本的反反應(yīng) 1). 不知道道如何下手。該該被面者從沒沒做過任何嵌嵌入式系統(tǒng)的的工作。 2). 用biit fieelds。Bit ffieldss是被扔到C語言死角的的東西,它保保證你的代碼碼在不同編譯譯器之間是不不可移植的,同同時(shí)也保證了了的你的代碼碼是不可重用用的。我最近近不幸看到IInfineeon為其較較復(fù)雜的通信信芯片寫的驅(qū)驅(qū)動(dòng)程序,它它用到了biit fieelds因此此完全對(duì)我無無用,因?yàn)槲椅业木幾g器用用其它的方式式來實(shí)現(xiàn)biit fieelds的。從從道德講:永永遠(yuǎn)不要讓一一個(gè)非嵌入式式的家伙粘實(shí)實(shí)際硬件的邊邊。 3). 用 #definnes

20、 和 bit maskss 操作。這這是一個(gè)有極極高可移植性性的方法,是是應(yīng)該被用到到的方法。最最佳的解決方方案如下: #definee BIT33 (0 x11 6) puuts( 6) : putts(6。原原因是當(dāng)表達(dá)達(dá)式中存在有有符號(hào)類型和和無符號(hào)類型型時(shí)所有的操操作數(shù)都自動(dòng)動(dòng)轉(zhuǎn)換為無符符號(hào)類型。 因此-20變成了了一個(gè)非常大大的正整數(shù),所所以該表達(dá)式式計(jì)算出的結(jié)結(jié)果大于6。這一點(diǎn)對(duì)對(duì)于應(yīng)當(dāng)頻繁繁用到無符號(hào)號(hào)數(shù)據(jù)類型的的嵌入式系統(tǒng)統(tǒng)來說是豐常常重要的。如如果你答錯(cuò)了了這個(gè)問題,你你也就到了得得不到這份工工作的邊緣。13. 評(píng)價(jià)下下面的代碼片片斷:unsigneed intt zeroo

21、 = 0; unsigneed intt comppzero = 0 xFFFFF; /*1s ccompleement of zeero */對(duì)于一個(gè)intt型不是16位的處理理器為說,上上面的代碼是是不正確的。應(yīng)應(yīng)編寫如下:unsigneed intt comppzero = 0;這一問題真正能能揭露出應(yīng)試試者是否懂得得處理器字長長的重要性。在在我的經(jīng)驗(yàn)里里,好的嵌入入式程序員非非常準(zhǔn)確地明明白硬件的細(xì)細(xì)節(jié)和它的局局限,然而PPC機(jī)程序往往往把硬件作作為一個(gè)無法法避免的煩惱惱。 到了這個(gè)階段,應(yīng)應(yīng)試者或者完完全垂頭喪氣氣了或者信心心滿滿志在必必得。如果顯顯然應(yīng)試者不不是很好,那那么這個(gè)測(cè)試

22、試就在這里結(jié)結(jié)束了。但如如果顯然應(yīng)試試者做得不錯(cuò)錯(cuò),那么我就就扔出下面的的追加問題,這這些問題是比比較難的,我我想僅僅非常常優(yōu)秀的應(yīng)試試者能做得不不錯(cuò)。提出這這些問題,我我希望更多看看到應(yīng)試者應(yīng)應(yīng)付問題的方方法,而不是是答案。不管管如何,你就就當(dāng)是這個(gè)娛娛樂吧動(dòng)態(tài)內(nèi)存分配(Dynamic memory allocation)14. 盡管不不像非嵌入式式計(jì)算機(jī)那么么常見,嵌入入式系統(tǒng)還是是有從堆(hheap)中中動(dòng)態(tài)分配內(nèi)內(nèi)存的過程的的。那么嵌入入式系統(tǒng)中,動(dòng)動(dòng)態(tài)分配內(nèi)存存可能發(fā)生的的問題是什么么?這里,我期望應(yīng)應(yīng)試者能提到到內(nèi)存碎片,碎碎片收集的問問題,變量的的持行時(shí)間等等等。這個(gè)主主題已經(jīng)在

23、EESP雜志中中被廣泛地討討論過了(主主要是 P.J. Pllaugerr, 他的解解釋遠(yuǎn)遠(yuǎn)超過過我這里能提提到的任何解解釋),所有有回過頭看一一下這些雜志志吧!讓應(yīng)試試者進(jìn)入一種種虛假的安全全感覺后,我我拿出這么一一個(gè)小節(jié)目:下面的代碼碼片段的輸出出是什么,為為什么?char *pptr; if (pttr = (char *)mallloc(00) = NULLL) puts(GGot a null pointter); else puts(GGot a validd poinnter); 這是一個(gè)有趣的的問題。最近近在我的一個(gè)個(gè)同事不經(jīng)意意把0值傳給了函函數(shù)mallloc,得到到了一個(gè)合法法的指針之后后,我才想到到這個(gè)問題。這這就是上面的的代碼

溫馨提示

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

評(píng)論

0/150

提交評(píng)論