- 嵌入式C語(yǔ)言面試題(附答案) 推薦度:
- 相關(guān)推薦
2024年嵌入式面試試題(附答案)
嵌入式分為操作系統和硬件兩個(gè)方面,就業(yè)的方向更廣、更深,就業(yè)機會(huì )和入職待遇比普通軟件工程師好。下面小編為大家整理了關(guān)于嵌入式面試的試題,希望對你有所幫助。
嵌入式面試試題附答案 1
一、嵌入式系統中,動(dòng)態(tài)分配內存可能發(fā)生的問(wèn)題是什么
盡管不像非嵌入式計算機那么常見(jiàn),嵌入式系統還是有從堆(heap)中動(dòng)態(tài)分配內存的過(guò)程的。那么嵌入式系統中,動(dòng)態(tài)分配內存可能發(fā)生的問(wèn)題是什么?
這里,我期望應試者能提到內存碎片,碎片收集的問(wèn)題,變量的持行時(shí)間等等。這個(gè)主題已經(jīng)在ESP雜志中被廣泛地討論過(guò)了(主要是 P.J. Plauger, 他的解釋遠遠超過(guò)我這里能提到的任何解釋),所有回過(guò)頭看一下這些雜志吧!讓?xiě)囌哌M(jìn)入一種虛假的安全感覺(jué)后,我拿出這么一個(gè)小節目:下面的代碼片段的輸出是什么,為什么?
char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
puts(“Got a null pointer”);
else
puts(“Got a valid pointer”);
這是一個(gè)有趣的問(wèn)題。最近在我的一個(gè)同事不經(jīng)意把0值傳給了函數malloc,得到了一個(gè)合法的指針之后,我才想到這個(gè)問(wèn)題。這就是上面的代碼,該代碼的輸出是“Got a valid pointer”。我用這個(gè)來(lái)開(kāi)始討論這樣的一問(wèn)題,看看被面試者是否想到庫例程這樣做是正確。得到正確的答案固然重要,但解決問(wèn)題的方法和你做決定的基本原理更重要些。
二、關(guān)鍵字volatile有什么含意并給出三個(gè)不同的例子
一個(gè)定義為volatile的變量是說(shuō)這變量可能會(huì )被意想不到地改變,這樣,編譯器就不會(huì )去假設這個(gè)變量的值了。精確地說(shuō)就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個(gè)例子:
1). 并行設備的硬件寄存器(如:狀態(tài)寄存器)
2). 一個(gè)中斷服務(wù)子程序中會(huì )訪(fǎng)問(wèn)到的非自動(dòng)變量(Non-automatic variables)
3). 多線(xiàn)程應用中被幾個(gè)任務(wù)共享的變量
三、嵌入式系統中經(jīng)常要用到無(wú)限循環(huán),你怎么樣用C編寫(xiě)死循環(huán)呢?
這個(gè)問(wèn)題用幾個(gè)解決方案。我首選的方案是:
while(1) { }
一些程序員更喜歡如下方案:
for(;;) { }
這個(gè)實(shí)現方式讓我為難,因為這個(gè)語(yǔ)法沒(méi)有確切表達到底怎么回事。如果一個(gè)應試者給出這個(gè)作為方案,我將用這個(gè)作為一個(gè)機會(huì )去探究他們這樣做的基本原理。如果他們的基本答案是:“我被教著(zhù)這樣做,但從沒(méi)有想到過(guò)為什么!边@會(huì )給我留下一個(gè)壞印象。
第三個(gè)方案是用 goto
Loop:
…
goto Loop;
應試者如給出上面的方案,這說(shuō)明或者他是一個(gè)匯編語(yǔ)言程序員(這也許是好事)或者他是一個(gè)想進(jìn)入新領(lǐng)域的BASIC/FORTRAN程序員。
四、嵌入式系統中關(guān)于中斷的問(wèn)題
中斷是嵌入式系統中重要的組成部分,這導致了很多編譯開(kāi)發(fā)商提供一種擴展—讓標準C支持中斷。具代表事實(shí)是,產(chǎn)生了一個(gè)新的關(guān)鍵字 __interrupt。下面的代碼就使用了__interrupt關(guān)鍵字去定義了一個(gè)中斷服務(wù)子程序(ISR),請評論一下這段代碼的`。
__interrupt double compute_area (double radius)
{ double area = PI * radius * radius;
printf(” Area = %f”, area);
return area;
}
這個(gè)函數有太多的錯誤了,以至讓人不知從何說(shuō)起了:
1). ISR 不能返回一個(gè)值。如果你不懂這個(gè),那么你不會(huì )被雇用的。
2). ISR 不能傳遞參數。如果你沒(méi)有看到這一點(diǎn),你被雇用的機會(huì )等同第一項。
3). 在許多的處理器/編譯器中,浮點(diǎn)一般都是不可重入的。有些處理器/編譯器需要讓額處的寄存器入棧,有些處理器/編譯器就是不允許在ISR中做浮點(diǎn)運算。此外,ISR應該是短而有效率的,在ISR中做浮點(diǎn)運算是不明智的。
4). 與第三點(diǎn)一脈相承,printf()經(jīng)常有重入和性能上的問(wèn)題。如果你丟掉了第三和第四點(diǎn),我不會(huì )太為難你的。不用說(shuō),如果你能得到后兩點(diǎn),那么你的被雇用前景越來(lái)越光明了。
嵌入式面試試題附答案 2
1、下面有關(guān)servlet中init,service,destroy方法描述錯誤的是?
A.init()方法是servlet生命的起點(diǎn)。一旦加載了某個(gè)servlet,服務(wù)器將立即調用它的init()方法
B.Service()方法處理客戶(hù)機發(fā)出的所有請求
C.destroy()方法標志servlet生命周期的結束
D.servlet在多線(xiàn)程下使用了同步機制,因此,在并發(fā)編程下servlet是線(xiàn)程安全的.
參考答案:D
2、下面有關(guān)java和c++的描述,錯誤的是?
A.java是一次編寫(xiě)多處運行,c++是一次編寫(xiě)多處編譯
B.c++和java支持多重承
C.Java不支持操作符重載,操作符重載被認為是c++的突出特征
D.java沒(méi)有函數指針機制,c++支持函數指針
參考答案:B
3、()設計模式將抽象部分與它的實(shí)現部分相分離。
A.Singleton(單例)
B.Bridge(橋接)
C.Composite(組合)
D.Facade(外觀(guān))
參考答案:B
4、哪些設計模式是降低資源使用率:
A.prototype
B.singleton
C.flyweight
D.abstract factory
參考答案:BC
5、運行在多核處理器上的Linux環(huán)境中,若臨界區非常短,且不允許線(xiàn)程上下文切換的情況下,使用下列哪種機制滿(mǎn)足上述需求并且性能最好?
A.SpinLock
B.Mutex
C.Semaphore
D.Condition variable
參考答案:C
6、Unix系統中,哪些可以用于進(jìn)程間的通信?()
A.Socket
B.共享內存
C.消息隊列
D.信號量
參考答案:ABCD
7、對一些資源以及狀態(tài)的操作保存,最好是保存在生命周期的哪個(gè)函數中進(jìn)行?
A.onPause()
B.onCreate()
C.onResume()
D.onStart()
參考答案:A
8、在android中使用Menu時(shí)可能需要重寫(xiě)的方法有?
A.onCreateOptionsMenu()
B.onCreateMenu()
C.onOptionsItemSelected()
D.onItemSelected()
參考答案:AC
二、解答題
1、編寫(xiě)一個(gè)函數,作用是把一個(gè)char組成的字符串循環(huán)右移n個(gè)。比如原來(lái)是“abcdefghi”如果n=2,移位后應該是“hiabcdefgh” 函數頭是這樣的:
//pStr是指向以結尾的字符串的指針
//steps是要求移動(dòng)的n
void LoopMove ( char*pStr, int steps )
{
//請填充...
}
參考答案
正確解答1:
void LoopMove ( char*pStr, int steps )
{
int n = strlen( pStr ) - steps;
char tmp[MAX_LEN];
strcpy ( tmp, pStr + n );
strcpy ( tmp + steps, pStr);
*( tmp + strlen ( pStr ) ) = ;
strcpy( pStr, tmp );
}
正確解答2:
void LoopMove ( char*pStr, int steps )
{
int n = strlen( pStr ) - steps;
char tmp[MAX_LEN];
memcpy( tmp, pStr + n, steps );
memcpy(pStr + steps, pStr, n );
memcpy(pStr, tmp, steps );
}
【剖析】
這個(gè)試題主要考查面試者對標準庫函數的熟練程度,在需要的時(shí)候引用庫函數可以很大程度上簡(jiǎn)化程序編寫(xiě)的工作量。
最頻繁被使用的庫函數包括:
(1) strcpy
(2) memcpy
(3) memset
2、軟件測試應該劃分幾個(gè)階段?簡(jiǎn)述各個(gè)階段應重點(diǎn)測試的點(diǎn)?各個(gè)階段的含義?
參考答案:
大體上來(lái)說(shuō)可分為單元測試,集成測試,系統測試,驗收測試,每個(gè)階段又分為以下五個(gè)步驟: 測試計劃,測試設計,用例設計,執行結果,測試報告
初始測試集中在每個(gè)模塊上,保證源代碼的正確性,該階段成為單元測試,主要用白盒測試方法。 接下來(lái)是模塊集成和集成以便組成完整的軟件包。集成測試集中在證實(shí)和程序構成問(wèn)題上。主要采用黑盒測試方法,輔之以白盒測試方法。
軟件集成后,需要完成確認和系統測試。確認測試提供軟件滿(mǎn)足所有功能、性能需求的最后保證。確認測試僅僅應用黑盒測試方法。
嵌入式面試試題附答案 3
1、一根金條長(cháng)31厘米,如果把它切成數段,使其中的一段或幾段能夠接成長(cháng)為1到31中任何整數的金條,請問(wèn)要切幾次?
A.4
B.5
C.6
D.7
參考答案:A
2、運行在多核處理器上的Linux環(huán)境中,若臨界區非常短,且不允許線(xiàn)程上下文切換的情況下,使用下列哪種機制滿(mǎn)足上述需求并且性能最好?
A.SpinLock
B.Mutex
C.Semaphore
D.Condition variable
參考答案:A
3、以下程序輸出的結果是()
#include
int main(){
int x=10,y=10;
printf("%d %d",x--,--y);
}
A.10 10
B.9 9
C.9 10
D.10 9
參考答案:D
4、下面所述步驟中,不是創(chuàng )建進(jìn)程所必須的步驟是?
A.由調度程序為進(jìn)程分配CPU
B.建立一個(gè)進(jìn)程控制塊
C.為進(jìn)程分配內存
D.將進(jìn)程控制塊鏈入就緒隊列
參考答案:A
5、下面描述中,表達正確的有()
A.公有繼承是基類(lèi)中的public成員在派生類(lèi)中仍是public的
B.公有繼承是基類(lèi)中的'private成員在派生類(lèi)中仍是private的
C.公有繼承是基類(lèi)中的protected成員在派生類(lèi)中仍是protected的
D.私有繼承是基類(lèi)中的public成員在派生類(lèi)中仍是private的
參考答案:ACD
6、int listen(SOCKET s, int backlog);該函數中第二個(gè)參數的含義是?
A.是否打開(kāi)log信息
B.是否打開(kāi)后臺log信息
C.后臺等待連接隊列的最大限制值
D.后臺等待連接隊列的最小限制值
參考答案:C
7、Java程序中的類(lèi)名稱(chēng)必須與存放該類(lèi)的文件名相同。
A.對
B.錯
參考答案:B
8、造成軟件危機的主要原因是以下里的哪幾個(gè)?
、儆脩(hù)使用不當 ②硬件不可靠 ③對軟件的錯誤認識 ④缺乏好的開(kāi)發(fā)方法和手段 ⑤軟件本身特點(diǎn) ⑥開(kāi)發(fā)效率低
A.(①②③)
B.(②③④)
C.(③⑤⑥)
D.(④⑤⑥)
參考答案:D
9、下面有個(gè)hibernate延遲加載,說(shuō)法錯誤的是?
A.Hibernate2延遲加載實(shí)現:a)實(shí)體對象 b)集合(Collection)
B.Hibernate3 提供了屬性的延遲加載功能
C.get支持延遲加載,load不支持延遲加
D.hibernate使用Java反射機制,而不是字節碼增強程序來(lái)實(shí)現透明性
參考答案:C
10、確定模塊的功能和模塊的接口是在軟件設計的那個(gè)階段完成的?
A.需求分析
B.概要設計
C.詳細設計
D.編碼
參考答案:B
【嵌入式面試試題附答案】相關(guān)文章:
嵌入式C語(yǔ)言面試題(附答案)03-17
photoshop試題附答案07-15
CAD基礎試題「附答案」06-23
excel單選試題「附答案」03-09
最新photoshop試題附答案10-10
ps理論試題「附答案」05-11
關(guān)于導游業(yè)務(wù)試題(附答案)02-26
最新ps考證試題附答案03-19