嵌入式軟件常見筆試面試題總結

1。中斷與異常區別:

異常:在產生時必須考慮與處理器的時鐘同步,實際上異常也稱爲同步中斷。在處理器執行到由於編程失誤而導致的錯誤指令時,或者在執行期間出現特殊情況(如缺頁),必須靠內核處理的時候,處理器就會產生一個異常。

所謂中斷就是外部硬件產生的一個電信號,從CPU的中斷引腳進入,打斷當前CPU的運行

所謂異常就是軟件運行中發生了一些必須作出處理的事件,CPU自動產生一個陷入來打斷當前運行,轉入異常處理流程。

 

2。進程與線程的區別:

a:調度:線程作爲調度與分配的基本單位,進程作爲擁有資源的基本單位

b:併發性:不僅進程之間可以併發執行,同一個進程的多個線程之間也可併發執行

c:擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬於進程的資源

d:系統開銷:在創建或撤銷進程時,由於系統都要爲之分配和回收資源,導致系統的開銷明顯大於創建或撤銷線程時的開銷

 

3。volatile關鍵字有什麼含義

volatile說明這個變量可能會被意想不到的改變,這樣在使用之前都要去內存裏重新讀取它的值,並告訴編譯器不要隨意對變量做優化

用到場合:並行設備的硬件寄存器(如狀態寄存器),一箇中斷服務子程序會訪問到的非自動變量,多線程應用中被幾個任務共享的變量

 

4。static作用

a:在函數體中,一個被聲明爲靜態的變量在這一函數被調用過程中維持其值不變

b:在模塊內(但在函數體外),一個被聲明爲靜態變量的變量,可以被這個模塊內的所有函數使用,但不能被模塊外的函數使用,它是一個本地的全局變量,

c:在模塊內,一個被聲明爲靜態的函數只可被這一模塊內的其它函數調用,那就是這個函數被限制在聲明它模塊的本地範圍內使用

後注問題:static全局變量與普通的全局變量有何不同?static局部變量和普通局部變量有何區別?static函數與普通函數有什麼區別?

答:static全局變量只初始化一次,防止在其它文件單元中被引用;static局部變量只被初始化一次,下一次依據上一次結果值;static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝

 

5。關鍵字const是什麼含義?

答案一:

a:它可以定義const常量

b:const可以修飾函數的參數,返回值,甚至是函數的定義體,被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程序的健壯性。

答案二:

const意味着只讀

 

如:int const *p  指向常整型的指針;

int *const p 指向整型的常指針

int *const *p 指向常整型的常指針  或者等同於const int * const p

 

a:關鍵字const的作用是爲給讀你代碼的人傳達非常有用的信息,實際上,聲明一個參數爲常量是爲了告訴用戶這個參數的應用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學會感謝這點多於的信息。(當然,懂得用const的程序員很少會留下的垃圾讓別人來清理的)

b:通過給優化器一些附加的信息,使用關鍵字const也許能產生更緊湊的代碼

c:合理地使用關鍵字const可以使編譯器很自然的保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。

 

6:對變量或寄存器進行位操作,給定一個整型變量a,寫兩段代碼,第一個設置a的bit3,第二個清除a的bit3。在以上兩個操作中,要保持其他位不變。

代碼如下:

#define BIT3 (0x1<<3)

static int a;

void set_bit3(void)

{

a|=BIT3;

}

void clear_bit3(void)

{

a&=~BIT3;

}

 

7:用C語言實現大小端的測試

void checkcpu()

{

union{

int a;

char b;

}c;

c.a=1;

if(c.b==1)

printf("xiaoduan");

else

printf("daduan");

}

 

8:引用與指針有什麼區別?

a:引用必須初始化,指針不必

b:引用初始化不能改變,指針可以被改變

c:不存在指向空值的引用,但存在指向空值的指針

 

注:用const限定引用的目的是:用這種形式的引用不能通過引用對目標變量的值進行修改

形式爲const 類型標識符 &引用名=目標變量名

eg:Example(const Example &x)

 

引用的主要目的:當參數傳遞的數據量較大時,用引用比用一般變量傳遞參數的效率和空間佔有率較好

 

9:寫出float,int ,bool類型與零的比較,假設變量爲x

float:if(x>0.000001&&x<-0.000001)

int :if(x==0)

bool: if(x==false)

 

10:OSI七層網絡協議,TCP/IP協議

OSI:物理層-數據鏈路層-網絡層-傳輸層-會話層-表示層-應用層

TCP/IP:網絡接口層-互連網絡層-傳輸層-應用層

 

11:對於一個頻繁使用的短小函數,在C語言與C++中分別用什麼實現?

C中用宏定義,C++用inline

注:inline作用:當在程序中調用一個內聯函數時,是將該函數的代碼直接插入到調用點,然後執行該段代碼,所以在調用過程中不存在程序的跳轉與返回問題,而對於普通函數的調用,程序是從主調函數點轉去執行被調函數,待被調函數執行完畢後,再返回到主調函數的調用點的下一語句繼續執行。從調用機理看,內聯函數可以加快程序代碼的執行速度和效率,減少調用開銷。但這是以增加程序代碼爲代價來求得速度的。

 

12:堆與棧的區別

Heap是堆,Stack是棧;

Stack的空間由操作系統自動分配/釋放,Heap上的空間是手動分配/釋放;

C中的malloc函數分配的內存空間在堆上,C++對應的是new操作符;

程序在編譯期間對變量和函數分配內存都在棧上進行,且程序運行過程中函數調用時參數的傳遞也在棧上進行;

 

13:用宏定義寫出swap(x,y);用define聲明一個常數,用以表明1年中有多少秒;寫出宏MIN,這個宏輸入兩個參數並返回較小的一個

#define swap(x,y)/

x=x+y;/

y=x-y;/

x=x-y;

 

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

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章