嵌入式面试常见问题(六)—各大公司面试题
1、阿里面試
1、Linux系統方面
1)進程和線程的區別(不能太書面化)(需要從內存角度,或者其他角度描述)
需要用自己理解的方式去回答這個問題,如果你回答了xxx是基本單位,這樣子是不行的。技術面試會追問你,需要你用自己的話去理解進程和線程。線程和進程是否是獨立的?線程和進程的之間內存空間是否是共享的?進程和進程之間是否是共享的?
2)線程之間是如何調度的
比如說有兩個線程:線程A和線程B,線程B要先于線程A運行,或者是線程B運行了多次之后在啟動線程A,如何進行調度?
3)非實時操作系統和實時操作系統的區別和選擇,以及應用場景。
2、C語言方面
1)static的作用,函數中變量使用static的作用,它的生命周期會如何。
2)extern的作用
3)c語言中有哪些宏定義?
4)#define和#typedef這兩個的區別
5)代碼編譯的四個過程,預處理的階段做了哪些事情(深入問條件編譯里面做了哪些事情)四個過程都
生成哪些文件?
3、數據結構
1)何為數據結構?
2)問了隊列、棧、鏈表的概念和特征,隊列和棧在項目中的應用場景。什么情況下用棧,什么情況下用隊列和鏈表。
4、網絡的概念
總結:
1、簡歷中有的項目,一定要會,不會的東西不寫,寫上去的東西保證自己每個細節都懂,也就是確實是自己做的項目,不是捏造的項目。
2、大廠面試注重基礎,因為大公司會培養你,只要你基礎扎實就行,所以基礎很重要,整個面試一個多小時,大部分時間在linux系統、編程能力、數據結構、計算機網絡基本概念上。
3、大廠面試喜歡問你對于某個常見的東西自己的理解,因為書上的名詞大家都會說,但是你自己理解的
肯定是不一樣的。比如富士康的一個面試官問過:你認為OSI七層網絡模型和生活中給的什么很像?
答案:快遞業務。
2、CVTE面試
崗位:嵌入式軟件工程師。面試時間:20分鐘
面試
1、簡歷中寫了做過海思音視頻項目,所以問了海思項目是怎么學的?(考察自學能力)。
2、問:學海思項目,是因為興趣,還是為了畢設?
回答:是因為興趣,因為自己畢設是51單片機。
問:如果一個Linux和51單片機進行通訊,讓我怎么設計通訊協議,然后問我怎么進行檢驗。
回答:可以設計串口,加奇偶校驗,并且檢查數據包的總字節數。
問:如果字節總個數是對的,但是有些位錯了,那應該怎么去檢查?
(不該說自己的畢設是51單片機的,因為自己本身不了解51單片機,所以這一塊答得一般)后來面試官
知道我對51單片機沒怎么學過,是春招后才準備現學現用的,就沒有繼續問下去了。
3、二叉樹學過嗎?
回答:學過,但是后面沒怎么用,幾乎忘光了,比較熟悉和常用的是鏈表。
4、如何判斷一個鏈表有環?
回答:快慢指針
5、線程和進程的區別?
6、線程和進程間的通訊方式有哪些?
7、訪問臨界資源時應該怎么辦?
8、線程和進程的API,知道哪些?
回答:我把API名字和API的參數是什么都說了,面試官就沒繼續往下問了
9、工作的意向地點
10、對于加班的看法(據說CVTE加班很猛,另外兩個是多益和三七)(廣州)
11、有沒有轉管理層的意向?
12、有什么問題想問的?
回答:如果有幸入職貴公司,請問是否會有一些培訓制度?
總結:除了一開始的那個怎么設計單片機和Linux通信協議沒答好,其他的問題答得還可以,HR挺有耐心挺溫柔的,也會在面試時一步步引導。從面試過程可以看出,很多公司,面試官一般都是根據你的簡歷和你的回答,來決定下一個問題。所以千萬不要自己給自己挖坑,簡歷寫的東西,必須要會,自己回答的東西,自己必須要會。所以面試官比較隨和的情況下,可以通過自己的回答,把面試官引導到全是自己熟悉的領域。
3、富士康面試
崗位:嵌入式軟件工程師。面試時間:30分鐘。
薪資:試用期基本工資7200,轉正按情況加(0-1000),算月工資8000,加班有加班費,算上加班費
大概9~10K,13薪。
所應聘部門是基于高通平臺,做通信模塊的。
1、自我介紹
2、如何理解交叉編譯?
3、OSI七層網絡和TCPIP網絡模型區別?以及每一層名稱。
4、你覺得網絡分層協議和生活中什么比較像?(快遞業務)
5、什么是上下文切換(我從中斷上下文方面講。然后他問為什么響應中斷要保護現場,中斷處理流程是
什么)
6、你如何理解異步(我從文件IO中的異步非阻塞回答)
7、你是XXXX專業,是不是和嵌入式不太匹配,都是自學的嗎?
8、數據結構學的怎么樣?
9、計算機操作系統學的怎么樣?
10、你熟悉哪些數據結構?
11、如何理解數據結構和算法的關系?
12、你是XXXX專業,是如何學習嵌入式的?(我都是做項目,項目中學習)
13、C語言和其他編程語言有什么關系,處于一個什么地位?(更底層)
14、你如何理解編程語言和日常說話語言的關系?
15、你如何理解指針?(也是一種變量而已,只是存儲的內容是地址,所以可以叫指針變量)
16、什么是系統調用?
17、用戶程序運行在usr space還是kernel space?
18、普通調用和系統調用的區別?
19、系統調用用什么函數(ioctl等)?
20、數據結構學的怎么樣,學過紅黑樹嗎?講一講。
回答:紅黑樹,Red-Black Tree 「RBT」是一個自平衡(不是絕對的平衡)的二叉查找樹(BST),樹上的每
個節點都遵循下面的規則:
1)每個節點都有紅色或黑色
2)樹的根始終是黑色的 (黑土地孕育黑樹根)
3)沒有兩個相鄰的紅色節點(紅色節點不能有紅色父節點或紅色子節點,并沒有說不能出現連續的黑色
節點)
4)從節點(包括根)到其任何后代NULL節點(葉子結點下方掛的兩個空節點,并且認為他們是黑色的)
的每條路徑都具有相同數量的黑色節點)
補充:二叉查找樹,Binary Search Tree 「BST」,要想了解二叉查找樹,我們首先看下二叉查找樹有
哪些特性:
1)某節點的左子樹節點值僅包含小于該節點值
2)某節點的右子樹節點值僅包含大于該節點值
3)左右子樹每個也必須是二叉查找樹
21、講一講馮諾依曼和哈佛體系的區別
總結:他特別喜歡問你是如何理解某個東西的,這樣的問法比單問你知識點牛多了,就是看你到底有沒有對底層原理有理解,然后用通俗的話表達出來。
4、小米面試
崗位:嵌入式軟件工程師(相機驅動崗)。面試時間:40分鐘。
以下問題面試者全部答出,已offer,薪資請去小程序offershow上查。
1、請進行一個簡單的自我介紹(2分鐘)
2、C語言全局變量可否定義在頭文件中?
回答:不能,并且這不是一個好的習慣。
3、全局變量和局部變量是否可以重名?
回答:可以重名。只是作用域不同,局部變量在局部生效。
4、extern C 的作用?
回答:extern C 的主要作用就是為了能夠正確實現C++代碼調用其他C語言代碼,即在C++代碼中嵌入式C語言代碼。
5、從代碼編譯到可執行文件的流程?
回答:一個源程序到一個可執行程序的過程:預編譯、編譯、匯編、鏈接。
6、進程和線程的區別?
回答:進程是資源(CPU、內存等)分配的基本單位,線程是CPU調度和分配的基本單位(程序執行的最小單位)。同一時間,如果CPU是單核,只有一個進程在執行,所謂的并發執行,也是順序執行,只不過由于切換速度太快,你以為這些進程在同步執行而已。多核CPU可以同一時間點有多個進程在執行。
7、手撕代碼:寫一個雙向鏈表的插入。
8、問簡歷上面的項目。
9、IIC協議說一下(因為我簡歷里面寫了IIC)
回答:I2C協議有兩條信號線,SDA和SCL,分別是數據線和時鐘線,同一總線可以掛載多個IIC設備,靠設備地址區分。
10、C++有了解嗎,用它做過什么項目沒有。
回答:我主要用C語言,C++用的比較少。
11、設備樹有了解嗎?
在此補充回答:Linus Torvalds在2011年3月17日的ARM Linux郵件列表宣稱“this whole ARM thing is a fucking pain in the ass”,ARM Linux社區對此作出了回應,引入設備樹。
ARM Device Tree起源于OpenFirmware (OF),在過去的Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥著大量的垃圾代碼,相當多數的代碼只是在描述板級細節,而這些板級細節對于內核來講,不過是垃圾,如板上的platform設resourcei2c_board_info、spi_board_info以及各種硬件的platform_data。為了改變這種局面,Linux社區的大牛們參考了PowerPC等體系架構中使用Flattened Device Tree(FDT),也采用了Device Tree結構,許多硬件的細節可以直接透過它傳遞給Linux,而不再需要在kernel中進行大量的冗余編碼。Device Tree是一種描述硬件的數據結構,它起源于 OpenFirmware (OF)。在Linux 2.6中,ARM架構的板極硬件細節過多地被硬編碼在arch/arm/plat-xxx和arch/arm/mach-xxx,采用Device Tree后,許多硬件的細節可以直接透過它傳遞給Linux,而不再需要在kernel中進行大量的冗余編碼。
12、內存分為哪幾個部分
回答:內存分為四區:堆區、棧區、全局區、代碼區。13、二分法查找的原理?
回答:類似于快速排序算法。二分法使用的前提是數組已經是有序序列,原理是折半查找,每次把表分成兩半,因為已經排序的,所以只需要和中間數比較就能確定是在哪一半,然后不斷分成兩半,直到匹配,或者沒有數字,表示查找失敗。
14、二叉樹了解過嗎?前序,中序,后序遍歷流程說一下。
回答:其實二叉樹是很重要的數據結構,更深一點的知識點有平衡二叉樹,紅黑樹,B樹,B+樹,B-樹
等,可以自行了解。這里只問了前中后序遍歷,2021秋招百度筆試也考了這道題。
15、內核裁剪說一下。
回答:個人理解,內核裁剪的原因主要是Linux內核本身很龐大,但客戶有時候不需要這么多功能,想裁
剪,定制內核,定制功能。
簡單的內核的配置有三種方式,在命令行輸入:
1、make config 文本配置方式; 2、make menuconfig 菜單配置方式; 3、make xconfig 圖形界面配置方式(需安裝qt)。補充個例子:假如客戶需要在手機固件升級的時候,有個指示燈閃爍,該怎么辦?這個時候你單純寫應用代碼是沒用的,因為手機固件升級的時候,系統都沒有跑起來,這時候代碼只能寫在Linux內核的bootloader里,因為bootloader起來了。做嵌入式開發還是要熟悉Linux內核的,沒學習的趕緊學習,用到是早晚的事。
16、memcpy(), strcpy(), strcmp(), strcat()有什么區別,如何避免內存越界?
回答:這幾個函數,做嵌入式崗位必須要會,按照學校老師的話來講:這道題是這次考試的必考題,15分就放在那里,愛背不背。這道題,浙江大華也考了,mtk也考了,做嵌入式對內存太敏感,必考。strcpy函數會導致內存溢出。strcpy拷貝函數不安全,他不做任何的檢查措施,也不判斷拷貝大小,不判斷目的地址內存是否夠用。
char *strcpy(char *strDest,const char *strSrc)strncpy拷貝函數,雖然計算了復制的大小,但是也不安全,沒有檢查目標的邊界。
strncpy(dest, src, sizeof(dest))strncpy_s是安全的strcmp(str1,str2),是比較函數,若str1=str2,則返回零;若str1<str2,則返回負數;若str1>str2,則返回正數。(比較字符串)strncat()主要功能是在字符串的結尾追加n個字符。
char * strncat(char *dest, const char *src, size_t n);strcat()函數主要用來將兩個char類型連接。例如:
char d[20]="Golden"; char s[20]="View"; strcat(d,s); //打印d printf("%s",d);輸出 d 為 GoldenView (中間無空格)memcpy拷貝函數,它與strcpy的區別就是memcpy可以拷貝任意類型的數據,strcpy只能拷貝字符串類型。
memcpy 函數用于把資源內存(src所指向的內存區域)拷貝到目標內存(dest所指向的內存區域);
有一個size變量控制拷貝的字節數;
函數原型:
17、棧和隊列的區別?
回答:這兩種數據結構都很重要,棧是先入后出,隊列是先入先出。
18、memcpy函數以什么結尾?
回答:與strcpy相比,memcpy遇到’\0’不結束,而且一定會復制完n個字節,函數原型在上面。
19、你最有成就的項目或者經歷是什么?
20、你有什么想問的嗎?
5、浙江大華面試
崗位:嵌入式軟件工程師。
浙江大華嵌入式軟件筆試一共37道題,35道選擇填空,2道編程,時間60分鐘,C語言一半,C++一半。
一面是晚上九點半打電話過來,過程15分鐘,可能他們還在加班。二面是現場面,過程20分鐘。現場面
流程很快,二面完畢HR面,當天面試完畢。一周內發offer。
一面:
1、簡單的自我介紹
回答:我主要介紹過去兩年我做的項目和個人的知識框架
2、問了一下我主要用的編程語言,我說C
3、因為他們也做相機類產品,所以我把我實習的項目講了一遍,包括標定sensor,標定shading、AWB這些相機相關知識。
4、如何防止編譯器優化?
回答:volatile
那就順便解釋一下關鍵詞static、const、extern的作用(經典)。
5、在C++代碼中嵌入C代碼,需要做什么?
回答:extern C
6、進程與線程,分配資源的最小單位是什么?
回答:進程
7、網絡編程中長鏈接和短鏈接?
回答:
什么時候用長連接,短連接?
長連接多用于操作頻繁,點對點的通訊,而且連接數不能太多情況。每個TCP連接都需要三步握手,這需要時間,如果每個操作都是先連接,再操作的話那么處理速度會降低很多,所以每個操作完后都不斷開,次處理時直接發送數據包就OK了,不用建立TCP連接。例如:數據庫的連接用長連接, 如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket 創建也是對資源的浪費。而像WEB網站的http服務一般都用短鏈接,因為長連接對于服務端來說會耗費一定的資源,而像WEB網站這么頻繁的成千上萬甚至上億客戶端的連接用短連接會更省一些資源,如果用長連接,而且同時有成千上萬的用戶,如果每個用戶都占用一個連接的話,那可想而知吧。所以并發量大,但每個用戶無需頻繁操作情況下需用短連好。
8、多線程編程中,寫線程安全的函數要注意哪些點?
回答:注意的點比較多,這是屬于多線程編程的知識點。首先需要注意寫的函數是可重入的:CPU運行時收到信號,于是暫停目前正在執行的函數,轉到信號處理函數,而這個信號處理函數的執行過程中,又恰恰也會進入到剛剛執行的函數,這樣便發生了所謂的重入。此時如果能夠正確的運行,而且處理完成后,之前暫停的也能夠正確運行,則說明它是可重入的, 反復調用都得到正確的結果。其余的點子請大家自行百度。
9、斷言(assert)的用法
回答:assert 不僅僅是個報錯函數,事實上,它是個宏,并且作用并非"報錯"。assert 宏的原型定義在assert.h 中,其作用是如果它的條件返回錯誤,則終止程序執行。
assert 的作用是現計算表達式 expression ,如果其值為假(即為0),那么它先向 stderr 打印一條出錯信息,然后通過調用 abort 來終止程序運行。
用法:
1)在函數開始處檢驗傳入參數的合法性
2)每個assert只檢驗一個條件,因為同時檢驗多個條件時,如果斷言失敗,無法直觀的判斷是哪個條件失敗
3)不能使用改變環境的語句,因為assert只在debug階段生效,如果這么做,會使用程序在真正運行時遇到問題
4)assert和后面的語句應空一行,以形成邏輯和視覺上的一致感
10、內存四區(堆、棧、全局區、代碼區)
11、了解幾種排序算法,時間復雜度是多少?
回答:
十種常見排序算法可以分為兩大類:
非線性時間比較類排序:通過比較來決定元素間的相對次序,由于其時間復雜度不能突破O(nlogn),因此稱為非線性時間比較類排序。線性時間非比較類排序:不通過比較來決定元素間的相對次序,它可以突破基于比較排序的時間下界,以線性時間運行,因此稱為線性時間非比較類排序
二面:
二面是現場面試,大概20分鐘左右。
1、對著簡歷面試,問你簡歷寫的東西。
2、對著你筆試的時候的題目,看你做的情況,隨便選一個你做對的或者你做錯的讓你解釋。(所以筆試完一定要搞懂)
3、問進程線程,經典問題。
4、問strcpy拷貝函數安全嗎,如果不安全,用什么去替代。
不安全,strcpy函數會導致內存溢出,因為他不做任何的檢查措施,也不判斷拷貝大小,不判斷目的地址內存是否夠用。
char *strcpy(char *strDest,const char *strSrc)strncpy拷貝函數,雖然計算了復制的大小,但是也不安全,沒有檢查目標的邊界。
strncpy(dest, src, sizeof(dest));strncpy_s是安全的memcpy拷貝函數,它與strcpy的區別就是memcpy可以拷貝任意類型的數據,strcpy只能拷貝字符串類型。
memcpy 函數用于把資源內存(src所指向的內存區域)拷貝到目標內存(dest所指向的內存區域);有一個size變量控制拷貝的字節數;
5、寫一個雙向鏈表的插入刪除
6、解釋一下動態內存和靜態內存
回答:
a) 靜態內存分配在編譯時完成,不占用CPU資源; 動態內存分配在運行時,分配與釋放都占用CPU資源。
b) 靜態內存在棧(stack)上分配; 動態內存在堆(heap)上分配。
c) 動態內存分配需要指針和引用類型支持,靜態不需要。
d) 靜態內存分配是按計劃分配,由編譯器負責; 動態內存分配是按需分配,由程序員負責。
總結
以上是生活随笔為你收集整理的嵌入式面试常见问题(六)—各大公司面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决树莓派4B从USB启动的问题
- 下一篇: 简单易懂的方式去看C语言精华--指针