<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 設計應用 > 20個(gè)嵌入式工程師常見(jiàn)面試題

20個(gè)嵌入式工程師常見(jiàn)面試題

作者: 時(shí)間:2025-02-27 來(lái)源: 收藏

01

本文引用地址:http://dyxdggzs.com/article/202502/467407.htm

Q:系統中經(jīng)常要用到無(wú)限循環(huán),如何用C編寫(xiě)死循環(huán)?

A:while(1){}或者for(;;)

02

Q:程序的局部變量存在于哪里,全局變量存在于哪里,動(dòng)態(tài)申請數據存在于哪里?

A:程序的局部變量存在于棧區;全局變量存在于靜態(tài)區;動(dòng)態(tài)申請數據存在于堆區。

03

Q:關(guān)鍵字const有什么含義?

A:1)只讀;2)使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼;3)使編譯器很自然地保護那些不希望被改變的參數,防止其被無(wú)意的代碼修改。

04

Q:請問(wèn)以下代碼有什么問(wèn)題:

int main() {
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;
}

A:沒(méi)有為str分配內存空間,將會(huì )發(fā)生異常,問(wèn)題出在將一個(gè)字符串復制進(jìn)一個(gè)字符變量指針所指地址。雖然可以正確輸出結果,但因為越界進(jìn)行內在讀寫(xiě)而導致程序崩潰。

05

Q:已知一個(gè)數組table,用一個(gè)宏定義,求出數據的元素個(gè)數

A:# define NTBL (sizeof(table)/sizeof(table[0]))

06

Q:寫(xiě)一個(gè)"標準"宏MIN ,這個(gè)宏輸入兩個(gè)參數并返回較小的一個(gè)。

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

考點(diǎn):

· 標識#define在宏中應用的基本知識。這是很重要的。因為在 嵌入(inline)操作符 變?yōu)闃藴蔆的一部分之前,宏是方便產(chǎn)生嵌入代碼的唯一方法,對于系統來(lái)說(shuō),為了能達到要求的性能,嵌入代碼經(jīng)常是必須的方法。

· 三重條件操作符的知識。這個(gè)操作符存在C語(yǔ)言中的原因是它使得編譯器能產(chǎn)生比if-then-else更優(yōu)的代碼,了解這個(gè)用法是很重要的。

· 懂得在宏中小心地把參數用括號括起來(lái)。

07

Q: do……while和while有什么區別?

A:前一個(gè)循環(huán)一遍再判斷,后一個(gè)判斷以后再循環(huán)。

08

Q:什么是預編譯,何時(shí)需要預編譯?

A:1、總是使用不經(jīng)常改動(dòng)的大型代碼體。2、程序由多個(gè)模塊組成,所有模塊都使用一組標準的包含文件和相同的編譯選項。在這種情況下,可以將所有包含文件預編譯為一個(gè)預編譯頭。

預編譯指令指示了在程序正式編譯前就由編譯器進(jìn)行的操作,可以放在程序中的任何位置。

09

Q: 一個(gè)32位的機器,該機器的指針是多少位?

A: 指針是多少位只要看地址總線(xiàn)的位數就行了。80386以后的機子都是32的數據總線(xiàn)。所以指針的位數就是4個(gè)字節了。

10

Q:局部變量能否和全局變量重名?

A:能,局部會(huì )屏蔽全局。

局部變量可以與全局變量同名,在函數內引用這個(gè)變量時(shí),會(huì )用到同名的局部變量,而不會(huì )用到全局變量。

對于有些編譯器而言,在同一個(gè)函數內可以定義多個(gè)同名的局部變量,比如在兩個(gè)循環(huán)體內都定義一個(gè)同名的局部變量,而那個(gè)局部變量的作用域就在那個(gè)循環(huán)體內。

11

Q:引用與指針有什么區別?

A:引用必須被初始化,指針不必。

· 引用初始化以后不能被改變,指針可以改變所指的對象。

· 不存在指向空值的引用,但是存在指向空值的指針。

12

Q:關(guān)鍵字static的作用是什么?

A:在C語(yǔ)言中,關(guān)鍵字static有三個(gè)明顯的作用:

· 在函數體,一個(gè)被聲明為靜態(tài)的變量在這一函數被調用過(guò)程中維持其值不變。

· 在模塊內(但在函數體外),一個(gè)被聲明為靜態(tài)的變量可以被模塊內所用函數訪(fǎng)問(wèn),但不能被模塊外其它函數訪(fǎng)問(wèn)。它是一個(gè)本地的全局變量。

· 在模塊內,一個(gè)被聲明為靜態(tài)的函數只可被這一模塊內的其它函數調用。那就是,這個(gè)函數被限制在聲明它的模塊的本地范圍內使用。

13

Q:static全局變量與普通的全局變量有什么區別?static函數與普通函數有什么區別?

A:全局變量(外部變量)的說(shuō)明之前再冠以static 就構成了靜態(tài)的全局變量。

全局變量本身就是靜態(tài)存儲方式,靜態(tài)全局變量當然也是靜態(tài)存儲方式。這兩者在存儲方式上并無(wú)不同。

這兩者的區別雖在于非靜態(tài)全局變量的作用域是整個(gè)源程序, 當一個(gè)源程序由多個(gè)源文件組成時(shí),非靜態(tài)的全局變量在各個(gè)源文件中都是有效的。而靜態(tài)全局變量則限制了其作用域,即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。

由于靜態(tài)全局變量的作用域局限于一個(gè)源文件內,只能為該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。

從以上分析可以看出,把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍。

static函數與普通函數作用域不同。僅在本文件。只在當前源文件中使用的函數應該說(shuō)明為內部函數(static),內部函數應該在當前源文件中說(shuō)明和定義。

對于可在當前源文件以外使用的函數,應該在一個(gè)頭文件中說(shuō)明,要使用這些函數的源文件要包含這個(gè)頭文件。

14

Q:進(jìn)程之間通信的途徑有哪些?

A:進(jìn)程間通信主要通過(guò)管道、消息、信號等途徑進(jìn)行。

1、無(wú)名管道( pipe ):管道是一種半雙工的通信方式,數據只能單向流動(dòng),而且只能在具有親緣關(guān)系的進(jìn)程間使用。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。

2、高級管道(popen):將另一個(gè)程序當做一個(gè)新的進(jìn)程在當前程序進(jìn)程中啟動(dòng),則它算是當前程序的子進(jìn)程,這種方式我們成為高級管道方式。

3、有名管道 (named pipe) :有名管道也是半雙工的通信方式,但是它允許無(wú)親緣關(guān)系進(jìn)程間的通信。

4、消息隊列( message queue ) :消息隊列是由消息的鏈表,存放在內核中并由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無(wú)格式字節流以及緩沖區大小受限等缺點(diǎn)。

5、信號量( semophore ) :信號量是一個(gè)計數器,可以用來(lái)控制多個(gè)進(jìn)程對共享資源的訪(fǎng)問(wèn)。它常作為一種鎖機制,防止某進(jìn)程正在訪(fǎng)問(wèn)共享資源時(shí),其他進(jìn)程也訪(fǎng)問(wèn)該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內不同線(xiàn)程之間的同步手段。

6、信號 ( sinal ) :信號是一種比較復雜的通信方式,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生。

7、共享內存( shared memory ) :共享內存就是映射一段能被其他進(jìn)程所訪(fǎng)問(wèn)的內存,這段共享內存由一個(gè)進(jìn)程創(chuàng )建,但多個(gè)進(jìn)程都可以訪(fǎng)問(wèn)。共享內存是最快的 IPC 方式,它是針對其他進(jìn)程間通信方式運行效率低而專(zhuān)門(mén)設計的。它往往與其他通信機制,如信號兩,配合使用,來(lái)實(shí)現進(jìn)程間的同步和通信。

8、套接字( socket ) :套解口也是一種進(jìn)程間通信機制,與其他通信機制不同的是,它可用于不同機器間的進(jìn)程通信。

15

Q:產(chǎn)生死鎖的原因是什么?

A:多個(gè)并發(fā)進(jìn)程因爭奪系統資源而產(chǎn)生相互等待的現象。即:一組進(jìn)程中的每個(gè)進(jìn)程都在等待某個(gè)事件發(fā)生,而只有這組進(jìn)程中的其他進(jìn)程才能觸發(fā)該事件,這就稱(chēng)這組進(jìn)程發(fā)生了死鎖。

產(chǎn)生死鎖的本質(zhì)原因為:1)系統資源有限;2)進(jìn)程推進(jìn)順序不合理。

16

Q:死鎖的4個(gè)必要條件?

A:1、互斥:某種資源一次只允許一個(gè)進(jìn)程訪(fǎng)問(wèn),即該資源一旦分配給某個(gè)進(jìn)程,其他進(jìn)程就不能再訪(fǎng)問(wèn),直到該進(jìn)程訪(fǎng)問(wèn)結束。

2、占有且等待:一個(gè)進(jìn)程本身占有資源(一種或多種),同時(shí)還有資源未得到滿(mǎn)足,正在等待其他進(jìn)程釋放該資源。

3、不可搶占:別人已經(jīng)占有了某項資源,你不能因為自己也需要該資源,就去把別人的資源搶過(guò)來(lái)。

4、循環(huán)等待:存在一個(gè)進(jìn)程鏈,使得每個(gè)進(jìn)程都占有下一個(gè)進(jìn)程所需的至少一種資源。

當以上四個(gè)條件均滿(mǎn)足,必然會(huì )造成死鎖,發(fā)生死鎖的進(jìn)程無(wú)法進(jìn)行下去,它們所持有的資源也無(wú)法釋放。這樣會(huì )導致CPU的吞吐量下降。所以死鎖情況是會(huì )浪費系統資源和影響計算機的使用性能的。那么,解決死鎖問(wèn)題就是相當有必要的了。

17

Q:死鎖的處理方式有哪些?

A:死鎖的處理方式主要從預防死鎖、避免死鎖、檢測與解除死鎖這四個(gè)方面來(lái)進(jìn)行處理。

預防死鎖:

1、資源一次性分配:(破壞請求和保持條件)

2、可剝奪資源:即當某進(jìn)程新的資源未滿(mǎn)足時(shí),釋放已占有的資源(破壞不可剝奪條件)

3、資源有序分配法:系統給每類(lèi)資源賦予一個(gè)編號,每一個(gè)進(jìn)程按編號遞增的順序請求資源,釋放則相反(破壞環(huán)路等待條件)

避免死鎖:

預防死鎖的幾種策略,會(huì )嚴重地損害系統性能。因此在避免死鎖時(shí),要施加較弱的限制,從而獲得 較滿(mǎn)意的系統性能。由于在避免死鎖的策略中,允許進(jìn)程動(dòng)態(tài)地申請資源。因而,系統在進(jìn)行資源分配之前預先計算資源分配的安全性。若此次分配不會(huì )導致系統進(jìn)入不安全狀態(tài),則將資源分配給進(jìn)程;否則,進(jìn)程等待。其中最具有代表性的避免死鎖算法是銀行家算法。

檢測死鎖:

首先為每個(gè)進(jìn)程和每個(gè)資源指定一個(gè)唯一的號碼;

然后建立資源分配表和進(jìn)程等待表

解除死鎖:

當發(fā)現有進(jìn)程死鎖后,便應立即把它從死鎖狀態(tài)中解脫出來(lái),常采用的方法有:

1、剝奪資源:從其它進(jìn)程剝奪足夠數量的資源給死鎖進(jìn)程,以解除死鎖狀態(tài);

2、撤消進(jìn)程:可以直接撤消死鎖進(jìn)程或撤消代價(jià)最小的進(jìn)程,直至有足夠的資源可用,死鎖狀態(tài).消除為止;所謂代價(jià)是指優(yōu)先級、運行代價(jià)、進(jìn)程的重要性和價(jià)值等。

18

Q:進(jìn)程和線(xiàn)程有什么區別?

A:進(jìn)程是并發(fā)執行的程序在執行過(guò)程中分配和管理資源的基本單位。線(xiàn)程是進(jìn)程的一個(gè)執行單元,是比進(jìn)程還要小的獨立運行的基本單位。一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線(xiàn)程。兩者的區別主要有以下幾個(gè)方面:

· 進(jìn)程是資源分配的最小單位。

· 線(xiàn)程是程序執行的最小單位,也是處理器調度的基本單位,但進(jìn)程不是,兩者均可并發(fā)執行。

· 進(jìn)程有自己的獨立地址空間,每啟動(dòng)一個(gè)進(jìn)程,系統就會(huì )為它分配地址空間,建立數據表來(lái)維護代碼段、堆棧段和數據段,這種操作非常昂貴。而線(xiàn)程是共享進(jìn)程中的數據,使用相同的地址空間,因此,CPU切換一個(gè)線(xiàn)程的花費遠比進(jìn)程小很多,同時(shí)創(chuàng )建一個(gè)線(xiàn)程的開(kāi)銷(xiāo)也比進(jìn)程小很多。

· 線(xiàn)程之間的通信更方便,同一進(jìn)程下的線(xiàn)程共享全局變量、靜態(tài)變量等數據,而進(jìn)程之間的通信需要以通信的方式(IPC)進(jìn)行。不過(guò)如何處理好同步與互斥是編寫(xiě)多線(xiàn)程程序的難點(diǎn)。但是多進(jìn)程程序更健壯,多線(xiàn)程程序只要有一個(gè)線(xiàn)程死掉,整個(gè)進(jìn)程也跟著(zhù)死掉了,而一個(gè)進(jìn)程死掉并不會(huì )對另外一個(gè)進(jìn)程造成影響,因為進(jìn)程有自己獨立的地址空間。

· 進(jìn)程切換時(shí),消耗的資源大,效率低。所以涉及到頻繁的切換時(shí),使用線(xiàn)程要好于進(jìn)程。同樣如果要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線(xiàn)程不能用進(jìn)程。

· 執行過(guò)程:每個(gè)獨立的進(jìn)程有一個(gè)程序運行的入口、順序執行序列和程序入口。但是線(xiàn)程不能獨立執行,必須依存在應用程序中,由應用程序提供多個(gè)線(xiàn)程執行控制。

優(yōu)缺點(diǎn):

線(xiàn)程執行開(kāi)銷(xiāo)小,但是不利于資源的管理和保護。線(xiàn)程適合在SMP機器(雙CPU系統)上運行。

進(jìn)程執行開(kāi)銷(xiāo)大,但是能夠很好的進(jìn)行資源管理和保護,可以跨機器遷移。

何時(shí)使用多進(jìn)程,何時(shí)使用多線(xiàn)程?

對資源的管理和保護要求高,不限制開(kāi)銷(xiāo)和效率時(shí),使用多進(jìn)程。

要求效率高,頻繁切換時(shí),資源的保護管理要求不是很高時(shí),使用多線(xiàn)程。

19

Q:線(xiàn)程是否具有相同的堆棧?

A:真正的程序執行都是線(xiàn)程來(lái)完成的,程序啟動(dòng)的時(shí)候操作系統就幫你創(chuàng )建了一個(gè)主線(xiàn)程。

每個(gè)線(xiàn)程有自己的堆棧。

20

Q:TCP與UDP有啥區別?

A:TCP和UDP是OSI模型中的運輸層中的協(xié)議。TCP提供可靠的通信傳輸,而UDP則常被用于廣播和細節控制交給應用的通信傳輸,兩者主要的不同體現在一下幾個(gè)方面:

1、TCP面向連接(如打電話(huà)要先撥號建立連接);UDP是無(wú)連接的,即發(fā)送數據之前不需要建立連接

2、TCP提供可靠的服務(wù)。它通過(guò)校驗和,丟包時(shí)的重傳控制,序號標識,滑動(dòng)窗口、確認應答,次序亂掉的分包進(jìn)行順序控制實(shí)現可靠傳輸。即通過(guò)TCP連接傳送的數據,無(wú)差錯,不丟失,不重復,且按序到達; UDP盡最大努力交付,即不保證可靠交付。

3、UDP具有較好的實(shí)時(shí)性,工作效率比TCP高,適用于對高速傳輸和實(shí)時(shí)性有較高要求的通信或廣播通信場(chǎng)景。

4、每一條TCP連接只能是點(diǎn)到點(diǎn)的; UDP支持一對一,一對多,多對一和多對多的交互通信方式。

5、TCP對系統資源要求較多,UDP對系統資源要求較少。

UDP有時(shí)比TCP更有優(yōu)勢:

UDP以其簡(jiǎn)單、傳輸快的優(yōu)勢,在越來(lái)越多場(chǎng)景下取代了TCP, 如實(shí)時(shí)游戲。

(1)網(wǎng)速的提升給UDP的穩定性提供可靠網(wǎng)絡(luò )保障,丟包率很低,如果使用應用層重傳,能夠確保傳輸的可靠性。

(2)TCP為了實(shí)現網(wǎng)絡(luò )通信的可靠性,使用了復雜的擁塞控制算法,建立了繁瑣的握手過(guò)程,由于TCP在內置的系統協(xié)議棧中,極難對其進(jìn)行改進(jìn)。

采用TCP,一旦發(fā)生丟包,TCP會(huì )將后續的包緩存起來(lái),等前面的包重傳并接收到后再繼續發(fā)送,延時(shí)會(huì )越來(lái)越大。

基于UDP對實(shí)時(shí)性要求較為嚴格的情況下,采用自定義重傳機制,能夠把丟包產(chǎn)生的延遲降到最低,盡量減少網(wǎng)絡(luò )問(wèn)題造成的影響。



關(guān)鍵詞: 嵌入式 工程師

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>