揭開嵌入式C面試題背後的玄機

2021-09-09 02:57:59 字數 2876 閱讀 8142

今天老大讓我針對乙個面試者出些嵌入式方面的面試題,主要是想對他的技術深度進一步了解。我就出了下面這些問題,每個問題背後都是考察乙個嵌入式程式設計師應該具備的相關技能。當然這些只是我的個人理解,不一定正確。在此與大家分享,只是希望朋友們能夠得到一點點啟發:如何抓住每乙個契機展現你的與眾不同?

同樣的技術問題,很多人可能都能夠回答得對,但有些人只是知其然而不知所以然。其實面試官每乙個問題背後通常都隱藏著乙個考察點。如果我們能夠透過問題看到背後的實質,在回答出答案的時候還能夠藉機發揮,我相信90和100分的差別就出來了。哪個面試官不喜歡招乙個喜歡思考、能透過現象看本質的員工呢~

1、 int a=2,b=11,c=a+b++/a++; 則c值為多少?

【考點】編碼規範。

表面上考察你對運算子優先順序的掌握程度,但實際上優先順序這些玩意很難死記硬背得住?大家的疑惑不就是運算子的結合順序麼?那麼如何去避免呢?c=a+((b++)/(a++))不就行了麼,其實問題背後考察的是你的編碼規範,如何寫清晰易懂的**,如何在乙個團隊中讓自己的**狠容易毫無偏差的讓新人看懂~

2、 static用在全域性變數定義和函式內部區域性變數定義有何區別?

【考點】編碼規範及模組化設計。

static變數的兩個屬性涉及儲存位置及可見域。在大型的程式設計中static全域性變數可以有效的避免名字空間的重複及無意的變數引用,這樣可以有效的提高程式設計的安全性,同時也利用模組化作業

3、 在程式設計中哪些地方需要使用define?如何用define來定義一年內有多少小時的常量?

【考點】可移植性。

嵌入式程式設計的特點就是軟硬體平台可變性,有效利用define常量可以提高程式的可移植性,這樣改動方便,不易出錯

4、 define巨集語句和inline函式有什麼區別?

【考點】時空效率及巨集的***。

嵌入式系統平台通常儲存資源有限,但同時又對實時性有一定的要求,二者如何權衡需要考慮。define巨集語句相對於函式呼叫能提高執行時間效能,但消耗了空間,並且不標準的巨集語句定義在不標準的編碼中更容易出現***,因此inline函式則是define語句的完美替代品。小資金幹大事正是嵌入式的終極目標!

5、 哪些地方可以用到const?const變數和函式輸入引數用const修飾有哪些作用?

【考點】程式設計可靠性。

const唯讀變數可以有效克服define常量的一些弊端,如無型別安全檢查。const形參可以有效避免程式內部更改無意的更改。人非聖賢孰能無誤,所以我們要將這些可能的失誤統統交給智慧型的編譯器,這樣就可以將錯誤扼殺在搖籃中

6、 int,short,char在32位平台下各佔幾個位元組?乙個結構體含有int、short、char變數各乙個,結構體佔據的總記憶體空間多少?

【考點】跨平台移植。

嵌入式並非x86,其硬體平台具備很大的差異性,同為int在不同的架構體系下可能佔據的位元組數是不一樣的。不同的平台也有不同的編譯器,其在變數對齊方面可能有不同的特性。因此在結構體定義時如何設計成員變數的順序以有效減少佔據的記憶體空間,以及如何填充特定字段保證訪問對齊問題,都是嵌入式系統結構體設計時應該考慮的跨平台可移植性問題

7、 如何將unsigned int明確定義為乙個32位型別?define和typedef有何區別?

【考點】跨平台移植。

define和typedef都可以實現變數型別重定義,但是typedef型別的指標變數可以有效去除變數定義的二義性。在嵌入式的工程專案中,通常為了保證資料型別的統一且便於跨平台移植時修改資料型別方便,通常都會單獨定義乙個資料型別的標頭檔案,把所有用到的資料型別typedef成所熟悉的形式

8、 有沒有用過volatile?有哪些典型的適用場合?

【考點】編譯優化的***。

通常為了提高程式執行的效率,編譯器會自動進行一些優化,如將變數放在暫存器中,以減少儲存器訪問次數,在資料長期未變時不重新讀取記憶體等等。但是優化有時會帶來問題,如硬體暫存器、多工共享變數、中斷和主程式共享變數,優化有可能帶來資料訪問不一致性的問題,因此對於這些個別變數,我們需要用volatile宣告告訴編譯器取消優化

9、 引數傳遞有哪些形式?暫存器和堆疊傳遞各有什麼優缺點?

【考點】編譯優化、呼叫效能、介面設計。

每種體系結構及對應的編譯器對引數傳遞都有自己的規定。引數傳遞並非總是通過堆疊進行的,引數入棧出棧是需要耗費時間的,編譯器總是盡量優化利用暫存器來傳遞引數,因為暫存器的訪問效率要高,但當引數過多時,將放棄優化從而用棧傳遞引數。因此為了提高呼叫效能,應儘量減少引數個數,太多時可以將所有引數重新定義為乙個結構體,利用結構體指標來傳遞引數。在函式介面設計時應考慮硬體平台和編譯器的特性,以靈活定義引數形式

10、 中斷服務程式設計應注意的問題?中斷觸發方式的選擇?中斷處理太長怎麼辦?中斷處理程式如何與主應用程式互動?

【考點】中斷服務程式設計。

嵌入式程式最大的特點是經常需要和硬體打交道,中斷是接收外界輸入的典型方式,通常都決定了系統執行流程,因此如何高效不丟失的處理中斷是每個嵌入式程式設計師應考慮的問題

11、 tcp/ip和osi七層模型是如何劃分的?各層的功能,這麼設計有什麼好處?

【考點】層次化軟體設計保證可移植性。

分層模型最大的好處就是某一層變化了,只要其提供上層的介面未變,那麼上層就無需做任何改動。因此只需要更改本層的實現即可。嵌入式平台因為軟硬體多變性,為了最大限度的利用先前的成果,軟體設計一定要遵循這種層次化模型,這樣才能保證其可移植性

12、 tcp和udp的區別?各種網路互連裝置都用在哪一層?如何建立鏈結?如何進行擁塞控制?

【考點】協議設計可靠性及緩衝區設計管理。

tcp和udp的最大區別在於可靠性,tcp通過三次握手協議及超時機制安全可靠的建立或者釋放連線。協議設計最大的問題就是如何保證效率合可靠性,tcp的設計為我們提供了乙個參考。而滑動視窗機制可以有效的進行擁塞控制,但視窗大小的設計則關係到記憶體利用率及緩衝效率可靠性等問題。在嵌入式的驅動程式設計中,經常會開闢緩衝區來進行流量控制及防止資料覆蓋,緩衝區的大小設計則需要更加具體的應用情況設計才能保證可靠性合靈活性

揭開嵌入式C面試題背後的玄機

1 int a 2,b 11,c a b a 則c值為多少?考點 編碼規範。表面上考察你對運算子優先順序的掌握程度,但實際上優先順序這些玩意很難死記硬背得住?大家的疑惑不就是運算子的結合順序麼?那麼如何去避免呢?c a b a 不就行了麼,其實問題背後考察的是你的編碼規範,如何寫清晰易懂的 如何在乙...

揭開嵌入式C面試題背後的玄機

揭開嵌入式c面試題背後的玄機 今天老大讓我針對乙個面試者出些嵌入式方面的面試題,主要是想對他的技術深度進一步了解。我就出了下面這些問題,每個問題背後都是考察乙個嵌入式程式設計師應該具備的相關技能。當然這些只是我的個人理解,不一定正確。在此與大家分享,只是希望朋友們能夠得到一點點啟發 如何抓住每乙個契...

嵌入式面試題

15 typedef 在c語言中頻繁用以宣告乙個已經存在的資料型別的同義字。也可以用預處理器做類似的事。例如,思考一下下面的例子 define dps struct s typedef struct s tps 以上兩種情況的意圖都是要定義dps 和 tps 作為乙個指向結構s指標。哪種方法更好呢?...