久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > IT培訓問題庫 > 嵌入式工程(cheng)師找工作必備的(de)面試問題(ti),你(ni)都(dou)了解(jie)嗎

嵌入式工程師找工作必備的面試(shi)問題,你都(dou)了解(jie)嗎 時間:2018-06-25      來(lai)源:未知

話不(bu)多說直(zhi)接開門見山,現在(zai)(zai)學嵌(qian)入式(shi)的(de)(de)人也慢(man)慢(man)變多了,那么找嵌(qian)入式(shi)這方面(mian)(mian)的(de)(de)技術人才也在(zai)(zai)增(zeng)多,一般在(zai)(zai)去企業應(ying)聘時,總會有很(hen)多面(mian)(mian)試題(ti)(ti)來考你,在(zai)(zai)這里總結了一些特(te)別經典的(de)(de)嵌(qian)入式(shi)工程師面(mian)(mian)試題(ti)(ti),很(hen)多時候都會在(zai)(zai)面(mian)(mian)試的(de)(de)時候碰到,一起來看(kan):

1 . 用(yong)預處(chu)理指令(ling)#define 聲明一個常數,用(yong)以表明1年中有(you)多少秒(忽略閏年問題)

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

我在這(zhe)想看到幾(ji)件事情:

1) #define 語法的基本知(zhi)識(例如:不(bu)能以分號(hao)結束(shu),括號(hao)的使用,等等)

2) 懂得預處理(li)器(qi)將為(wei)你計算常數(shu)表達式(shi)的(de)(de)值(zhi),因此直接寫(xie)出(chu)你如何計算一年中(zhong)有(you)多少秒而不是(shi)計算出(chu)實(shi)際的(de)(de)值(zhi),是(shi)更清晰而沒有(you)代價(jia)的(de)(de)。

3) 意識到(dao)這個表達式將使(shi)一(yi)個16位機的整(zheng)(zheng)(zheng)型數溢(yi)出-因此要用到(dao)長整(zheng)(zheng)(zheng)型符號L,告訴編譯器這個常數是的長整(zheng)(zheng)(zheng)型數。

4) 如(ru)果你在(zai)你的表達式中(zhong)用到(dao)UL(表示無符號長整型(xing)),那么你有了(le)一個好的起(qi)點(dian)。記(ji)住(zhu),第一印象很重要。

2 . 寫一個"標準(zhun)"宏MIN ,這個宏輸入(ru)兩個參數并返回較小的一個。

#define MIN(A,B) ((A) <= (B) ? (A) : (B))

這個測(ce)試是為下(xia)面的目的而(er)設的:

1) 標識(shi)#define在宏(hong)中(zhong)應用的(de)(de)基本知識(shi)。這(zhe)是(shi)(shi)很(hen)重要(yao)的(de)(de)。因為(wei)在 嵌(qian)入(inline)操(cao)作符(fu) 變為(wei)標準C的(de)(de)一(yi)部分之前,宏(hong)是(shi)(shi)方便(bian)產(chan)生嵌(qian)入代碼的(de)(de)唯一(yi)方法(fa),對于嵌(qian)入式系統來說,為(wei)了能(neng)達到要(yao)求的(de)(de)性能(neng),嵌(qian)入代碼經(jing)常(chang)是(shi)(shi)必須的(de)(de)方法(fa)。

2) 三重條(tiao)件操(cao)作符的(de)(de)(de)知(zhi)識。這個操(cao)作符存在C語言中的(de)(de)(de)原因是它使(shi)得編譯器能(neng)產生比if-then-else更(geng)優的(de)(de)(de)代碼(ma),了解這個用法是很重要(yao)的(de)(de)(de)。

3) 懂(dong)得在宏中小心地把參數用括號括起來。

4) 我也用這個(ge)問題開(kai)始討論(lun)宏的副作用,例如(ru):當你(ni)寫(xie)下面的代碼(ma)時會(hui)發生什么(me)事?

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

3. 預(yu)處理器(qi)標識#error的目的是什么?

如果(guo)你(ni)不(bu)知道(dao)答(da)案,請看參考文獻1。這(zhe)問(wen)題對(dui)區(qu)分一個(ge)正常(chang)的伙(huo)計和一個(ge)書呆(dai)子是很有(you)用的。只有(you)書呆(dai)子才會讀C語言課本的附(fu)錄去找出(chu)象這(zhe)種問(wen)題的答(da)案。當(dang)然(ran)如果(guo)你(ni)不(bu)是在(zai)找一個(ge)書呆(dai)子,那么應試者最好希望自己不(bu)要知道(dao)答(da)案。

4. 嵌(qian)入式系統中經常(chang)要用到無(wu)限循環(huan),你怎么樣用C編(bian)寫(xie)死循環(huan)呢?

這個(ge)問(wen)題用幾個(ge)解(jie)決(jue)方(fang)案。我首選(xuan)的方(fang)案是:

while(1)

{

}

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

for(;;)

{

}

這個(ge)(ge)實現方(fang)(fang)式讓我為(wei)(wei)難(nan),因為(wei)(wei)這個(ge)(ge)語(yu)法沒有確切表達到底怎么(me)回事。如果一(yi)(yi)個(ge)(ge)應試者給出(chu)這個(ge)(ge)作(zuo)為(wei)(wei)方(fang)(fang)案,我將用這個(ge)(ge)作(zuo)為(wei)(wei)一(yi)(yi)個(ge)(ge)機會去探究他們這樣做的基本原理。

如果(guo)他們的基本答案是:"我被教著這樣做,但從沒有想到過為(wei)什么。"這會給我留下一個(ge)壞印(yin)象。

第三個方案(an)是用 goto

Loop:

...

goto Loop;

應試者(zhe)如給(gei)出上面(mian)的方案,這(zhe)說明或者(zhe)他是(shi)一(yi)個匯編語言程序員(這(zhe)也(ye)許是(shi)好事)或者(zhe)他是(shi)一(yi)個想(xiang)進入新領域的BASIC/FORTRAN程序員。

5. 用(yong)變量(liang)a給出(chu)下面的(de)定義?

a) 一個整(zheng)型(xing)數(shu)(An integer)

b)一個指向整型數的指針(zhen)( A pointer to an integer)

c)一(yi)個指向(xiang)(xiang)指針的(de)(de)的(de)(de)指針,它指向(xiang)(xiang)的(de)(de)指針是指向(xiang)(xiang)一(yi)個整型數( A pointer to a pointer to an intege)r

d)一(yi)個有(you)10個整型數(shu)的(de)數(shu)組( An array of 10 integers)

e) 一個有10個指(zhi)針的(de)(de)數組,該指(zhi)針是指(zhi)向(xiang)一個整型數的(de)(de)。(An array of 10 pointers to integers)

f) 一個指(zhi)向有10個整型(xing)數數組的指(zhi)針(zhen)( A pointer to an array of 10 integers)

g) 一個指(zhi)向函(han)數(shu)(shu)的指(zhi)針,該函(han)數(shu)(shu)有一個整型(xing)參數(shu)(shu)并返回一個整型(xing)數(shu)(shu)(A pointer to a function that takes an integer as an argument and returns an integer)

h) 一(yi)個(ge)有10個(ge)指針的數組,該指針指向一(yi)個(ge)函(han)數,該函(han)數有一(yi)個(ge)整(zheng)型(xing)參數并返(fan)回一(yi)個(ge)整(zheng)型(xing)數( An array of ten pointers to functions that take an integer argument and return an integer )

答案是:

a) int a; // An integer

b) int *a; // A pointer to an integer

c) int **a; // A pointer to a pointer to an integer

d) int a[10]; // An array of 10 integers

e) int *a[10]; // An array of 10 pointers to integers

f) int (*a)[10]; // A pointer to an array of 10 integers

g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer

h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

6. 關鍵字static的(de)作用是(shi)什么?

這個簡單的(de)問題很少(shao)有人能(neng)回答完全。在(zai)C語言中,關鍵(jian)字(zi)static有三個明顯(xian)的(de)作用:

1) 在函(han)數體,一個被聲明(ming)為靜態的變量在這一函(han)數被調用過程中維(wei)持(chi)其值(zhi)不變。

2) 在(zai)模(mo)塊(kuai)(kuai)內(但在(zai)函數體外(wai)),一個被聲明為(wei)靜態的變(bian)量可以被模(mo)塊(kuai)(kuai)內所(suo)用函數訪問,但不能(neng)被模(mo)塊(kuai)(kuai)外(wai)其它函數訪問。它是一個本地的全局變(bian)量。

3) 在(zai)模(mo)(mo)(mo)塊內,一(yi)個(ge)被聲明為靜(jing)態的(de)函數(shu)只可被這一(yi)模(mo)(mo)(mo)塊內的(de)其它(ta)函數(shu)調用。那就是(shi),這個(ge)函數(shu)被限制在(zai)聲明它(ta)的(de)模(mo)(mo)(mo)塊的(de)本地范圍(wei)內使用。

大多數應試(shi)者能(neng)正(zheng)確(que)回答第一部分,一部分能(neng)正(zheng)確(que)回答第二部分,同是(shi)(shi)很少的人能(neng)懂(dong)得第三部分。這是(shi)(shi)一個應試(shi)者的嚴(yan)重的缺點,因為(wei)他(ta)顯然不懂(dong)得本地化(hua)數據和代碼(ma)范圍的好處和重要(yao)性。

7.關鍵字const有什(shen)么含意?

我只(zhi)要一聽到被(bei)面試者說:"const意味著常數(shu)",我就知(zhi)道我正在和一個業(ye)余者打交道。

去年Dan Saks已經在他的(de)(de)(de)文(wen)(wen)章里(li)完全(quan)概括了const的(de)(de)(de)所有(you)用法,因(yin)此ESP(譯者:Embedded Systems Programming)的(de)(de)(de)每一位讀者應(ying)該非(fei)常熟(shu)悉const能(neng)做什么(me)和不(bu)能(neng)做什么(me).如果你從沒有(you)讀到那篇文(wen)(wen)章,只(zhi)要能(neng)說出const意味著"只(zhi)讀"就可以了。

盡管這個(ge)答案(an)(an)(an)(an)不是完全的答案(an)(an)(an)(an),但我接受它(ta)作(zuo)為一個(ge)正確的答案(an)(an)(an)(an)。(如果你想知(zhi)道(dao)更詳(xiang)細(xi)(xi)的答案(an)(an)(an)(an),仔細(xi)(xi)讀(du)一下Saks的文章吧。)

如果應試者能正確回答(da)這個(ge)問題,我將問他一個(ge)附加的問題:

下面的聲明都(dou)是什(shen)么意思(si)?

const int a;

int const a;

const int *a;

int * const a;

int const * a const;

/******/

前兩個的(de)作用(yong)是一樣,a是一個常整(zheng)型數。第(di)三(san)個意味著a是一個指(zhi)向(xiang)常整(zheng)型數的(de)指(zhi)針。

第四個意(yi)思a是(shi)(shi)一個指向(xiang)整(zheng)型數的(de)(de)常指針(也就是(shi)(shi)說,指針指向(xiang)的(de)(de)整(zheng)型數是(shi)(shi)可以修改的(de)(de),但指針是(shi)(shi)不可修改的(de)(de))。

最后一(yi)個(ge)意味著a是(shi)一(yi)個(ge)指向(xiang)常整型數的常指針。如(ru)果應試者(zhe)能正確回(hui)答這些問題,那么(me)他就(jiu)給(gei)我留下了一(yi)個(ge)好印象。

順帶提一句,也(ye)許(xu)你可能(neng)(neng)會問(wen),即使不用關(guan)鍵字 const,也(ye)還是能(neng)(neng)很(hen)容易寫出功能(neng)(neng)正確的程序,那(nei)么我為什么還要如此看重關(guan)鍵字const呢?我也(ye)如下(xia)的幾下(xia)理由:

1) 關鍵字const的(de)作用(yong)是為給讀你代碼的(de)人傳達非常有用(yong)的(de)信(xin)(xin)息,實際(ji)上,聲明一個參(can)數為常量是為了告訴了用(yong)戶這個參(can)數的(de)應用(yong)目的(de)。如果你曾(ceng)花很(hen)多時間清(qing)理(li)其它人留下的(de)垃圾(ji),你就會(hui)很(hen)快(kuai)學(xue)會(hui)感(gan)謝這點多余的(de)信(xin)(xin)息。

2) 通(tong)過(guo)給優化(hua)器一些附加的信息(xi),使用(yong)關(guan)鍵字const也許能產生更(geng)緊湊的代碼(ma)。

3) 合理地使用關(guan)鍵字const可(ke)以(yi)使編譯器很自(zi)然地保護那些不希望(wang)被(bei)改變(bian)的參(can)數,防止其被(bei)無(wu)意(yi)的代碼修改。簡而(er)言之,這樣可(ke)以(yi)減少bug的出現(xian)。

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

一(yi)個(ge)定義為volatile的變(bian)(bian)(bian)量(liang)是(shi)說這變(bian)(bian)(bian)量(liang)可能會被(bei)意想不到地改變(bian)(bian)(bian),這樣,編(bian)譯器就不會去假(jia)設這個(ge)變(bian)(bian)(bian)量(liang)的值了。

精確地(di)說就是,優化器在用到(dao)這個(ge)變量時必(bi)須每次都小(xiao)心地(di)重(zhong)新讀取(qu)這個(ge)變量的值(zhi),而不是使用保存在寄存器里的備份。

下面(mian)是volatile變量的幾個例子:

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

2) 一個中(zhong)斷服務子程序中(zhong)會訪(fang)問到的(de)非(fei)自動變量(Non-automatic variables)

3) 多(duo)線程應用中被幾個(ge)任務共享的變量

回答(da)不(bu)出(chu)這個問題的(de)人是不(bu)會(hui)被雇傭的(de)。我認為這是區分(fen)C程序員(yuan)和嵌入式系(xi)統(tong)程序員(yuan)的(de)最(zui)基本的(de)問題。

搞嵌入式的家伙們經常同硬件、中斷、RTOS等等打交(jiao)道,所有這些都(dou)要(yao)求用到(dao)volatile變量。不懂得volatile的內容(rong)將會帶來(lai)災難(nan)。

假設被面試者正確地回答(da)了這(zhe)是問(wen)題(嗯,懷疑是否(fou)會是這(zhe)樣),我將稍(shao)微深究一(yi)下,看一(yi)下這(zhe)家伙是不是直正懂得volatile完全的重要性。

1) 一個參數既(ji)可以是(shi)const還可以是(shi)volatile嗎?解釋(shi)為什么。

2) 一(yi)個指針可(ke)以是volatile 嗎?解釋為(wei)什么。

3) 下面的函數有(you)什么(me)錯誤:

int square(volatile int *ptr)

{

return *ptr * *ptr;

}

下面是答案(an):

1) 是的(de)。一個例子是只讀(du)的(de)狀態寄存器。它是volatile因為(wei)它可能被(bei)意想不到地改變。它是const因為(wei)程(cheng)序不應(ying)該(gai)試圖去(qu)修(xiu)改它。

2) 是的。盡管這并不很常見。一(yi)個例子是當一(yi)個中服(fu)務子程序修該一(yi)個指(zhi)向一(yi)個buffer的指(zhi)針時。

3) 這段代碼有點變(bian)態。這段代碼的目的是(shi)用來返指針(zhen)*ptr指向值的平方,但是(shi),由(you)于(yu)*ptr指向一個volatile型參數(shu),編譯器將產生類(lei)似下(xia)面的代碼:

int square(volatile int *ptr)

{

int a,b;

a = *ptr;

b = *ptr;

return a * b;

}

由于*ptr的(de)值可能(neng)被意想不到地該(gai)變,因此a和b可能(neng)是(shi)不同的(de)。結(jie)果,這段代碼可能(neng)返不是(shi)你所期(qi)望的(de)平(ping)方值!正確的(de)代碼如下:

long square(volatile int *ptr)

{

int a;

a = *ptr;

return a * a;

}

位操作(Bit manipulation)

9. 嵌入式(shi)系統總是要用戶對變(bian)量(liang)或寄存器進行位(wei)操作。給定一個(ge)整(zheng)型變(bian)量(liang)a,寫兩段代碼,第一個(ge)設置a的bit 3,第二個(ge)清除a 的bit 3。在(zai)以上兩個(ge)操作中,要保持其它位(wei)不變(bian)。

最佳的解決(jue)方案如下:

#define BIT3 (0x1 << 3)

static int a;

void set_bit3(void)

{

a |= BIT3;

}

void clear_bit3(void)

{

a &= ~BIT3;

}

一(yi)些人喜歡為設(she)置和(he)清除值而定義一(yi)個掩(yan)碼同(tong)時定義一(yi)些說明常數,這也是可以接受的。我希望看到(dao)幾(ji)個要點:說明常數、|=和(he)&=~操(cao)作。

訪問固定的內存位置(Accessing fixed memory locations)

10. 嵌入式系統(tong)經(jing)常具有要求程(cheng)序員去訪問某(mou)特定的(de)內存位置的(de)特點。在某(mou)工程(cheng)中,要求設置一(yi)絕對地(di)址為(wei)(wei)0x67a9的(de)整型變量的(de)值(zhi)為(wei)(wei)0xaa66。編譯器是一(yi)個純粹(cui)的(de)ANSI編譯器。寫代碼(ma)去完(wan)成(cheng)這一(yi)任(ren)務。

這一問題測試(shi)你是否知道為(wei)了訪問一絕對地址把一個整(zheng)型數強制(zhi)轉(zhuan)換(typecast)為(wei)一指針是合法的(de)。這一問題的(de)實(shi)現方式(shi)隨著(zhu)個人風格不(bu)(bu)同而不(bu)(bu)同。典(dian)型的(de)類似(si)代(dai)碼如下:

int *ptr;

ptr = (int *)0x67a9;

*ptr = 0xaa55;

A more obscure approach is:

一個較晦澀(se)的(de)方(fang)法是:

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

即使(shi)你的(de)品味更接(jie)近第(di)二種(zhong)方案,但我建(jian)議你在面試時使(shi)用第(di)一種(zhong)方案。

這些都是嵌入式工程師面試時必會考的一些知識點,所以你需要好好掌握,當然也不只這些,還有很多,想要(yao)更多(duo)的,可以看右邊彈窗,咨(zi)詢(xun)客服來獲(huo)取哦。

相關推薦:嵌入式(shi)求職攻(gong)略(lve)

上一篇:單片機學習路線中你需要注意的四大問題

下一篇:2018年嵌入式學習技巧出爐 學通嵌入式要套路

熱點文章推薦
華清學員就業(ye)榜(bang)單
高薪學員經驗分享
熱點新聞推薦
前(qian)臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談(tan)專線(xian):010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部