嵌入式C語(yu)言經(jing)典(dian)面試題匯總
時間:2018-07-31 來(lai)源:未知
嵌入(ru)式(shi)C語言面(mian)試題在面(mian)試中是特(te)別(bie)常(chang)見的了,因(yin)為嵌入(ru)式(shi)的基礎就是C語言,很多人(ren)在面(mian)試時,總會在C語言這個地方磕(ke)磕(ke)絆(ban)絆(ban)一下(xia),而導致(zhi)失(shi)去了進入(ru)公(gong)(gong)司的權利,下(xia)面(mian)是我去的幾家公(gong)(gong)司面(mian)試時,C語言面(mian)試題的總結,比較(jiao)全。
1、某(mou)32位系統(tong)下, C++程序void *p = malloc( 100 ); sizeof (p) = ?
A.1
B.4
C.100
D.400
2、在(zai)一個(ge)10階的(de)B-樹上,每個(ge)樹根(gen)結點中所含的(de)關鍵字數(shu)目多(duo)允許(xu)為(wei)( )個(ge),少允許(xu)為(wei)( )個(ge)。
A.10,5
B.9,4
C.8,3
D.7,6
3、以下程序段執行(xing)后(hou)結果是()
#include
void main()
{
short *p,*q;
short arr[15]={0};
p=q=arr;
p++;
printf("%d,",p-q);
printf("%d,",(char*)p-(char*)q);
printf("%d",sizeof(arr)/sizeof(*arr));
}
A.1,0,15
B.0,2,1
C.1,1,15
D.1,2,15
4、(1)靜態鏈表(biao)既(ji)有順序存儲的(de)優(you)點(dian),又有動態鏈表(biao)的(de)優(you)點(dian)。所(suo)以(yi),它存取表(biao)中第i個元素的(de)時間與i無關(guan)。
(2)靜態(tai)鏈表中能容納的元素個數的大(da)數在表定(ding)義(yi)時就確(que)定(ding)了,以后不能增加(jia).
(3)靜(jing)態鏈表與動態鏈表在元素的插(cha)入、刪(shan)除(chu)上類似,不需做元素的移動。
以上(shang)錯誤的是(shi)()
A.(1),(2)
B.(1)
C.(1),(2),(3)
D.(2)
相關(guan)答案(an):1~4:BBDB
相關(guan)大題總結(jie):
1. 讀程序段,回答問題
int main(int argc,char *argv[])
{
int c=9,d=0;
c=c++%5;
d=c;
printf("d=%d\n",d);
return 0;
}
a) 寫出(chu)程序輸出(chu)
b) 在一個可移植(zhi)的(de)系(xi)統(tong)中(zhong)這(zhe)種表(biao)達式是否存(cun)在風(feng)險?why?
#include "stdio.h"
int a=0;
int b;
static char c;
int main(int argc,char *argv[])
{
char d=4;
static short e;
a++;
b=100;
c=(char)++a;
e=(++d)++;
printf("a=%d, b=%d, c=%d, d= %d, e=%d",a,b,c,d,e);
return 0;
}
a) 寫出程序(xu)輸出
b) 編譯器如果(guo)安排各個變量(liang)(a,b,c,d)在內存中的布局(eg. stack,heap,data section,bss section),最好用(yong)圖形方式描述。
2 中斷是(shi)嵌入式系統中重要的(de)組成部分,這(zhe)導致了許多編(bian)譯開(kai)發商提供一種擴展(zhan):讓標(biao)準C支(zhi)持中斷,產生了一個新的(de)關(guan)鍵(jian)字(zi)__interrupt。下(xia)面(mian)的(de)代(dai)碼就使(shi)用了__interrupt關(guan)鍵(jian)字(zi)去定義了一個中斷服務(wu)子程(cheng)序(xu)(ISR),請評論以下(xia)這(zhe)段(duan)代(dai)碼。
__interrupt double compute_area(double radius)
{
double area = PI * radius *radius;
printf("nArea = %f", area);
return area;
}
3 C/C++基礎知(zhi)識問(wen)題
a) 關鍵字volatile在編譯時有什(shen)么含義(yi)?并給出(chu)三個(ge)不同使用場景的例(li)子(可(ke)以(yi)偽(wei)代碼或者文字描述)。
b) C語言中static關鍵字(zi)的具(ju)體(ti)作用(yong)有哪(na)些 ?
c) 請(qing)問下面(mian)三種變量聲明有何區別(bie)?請(qing)給出具體含義
int const *p;
int* const p;
int const* const p;
4 嵌入式系統相關問題
a) 對于整形(xing)變量A=0x12345678,請畫出在(zai)little endian及(ji)big endian的方式(shi)下在(zai)內(nei)存(cun)中(zhong)是如何存(cun)儲的。
b) 在ARM系統中,函(han)數調(diao)用的(de)時候(hou),參數是通過哪種方式傳遞的(de)?
c) 中斷(interrupt,如(ru)鍵盤中斷)與(yu)異(yi)常(chang)(exception,如(ru)除(chu)零異(yi)常(chang))有何區(qu)別?
5 設周(zhou)期(qi)(qi)性任務P1,P2,P3的周(zhou)期(qi)(qi)為T1,T2,T3分別(bie)為100,150,400;執(zhi)行時間分別(bie)為20,40,100。請設計一種調度(du)算法(fa)進行任務調度(du),滿足(zu)任務執(zhi)行周(zhou)期(qi)(qi)及任務周(zhou)期(qi)(qi)。
6 優先(xian)級反(fan)轉問(wen)題(ti)在嵌(qian)入(ru)式系(xi)統中是一中嚴重(zhong)的問(wen)題(ti),必須給與足夠重(zhong)視。
a) 首先(xian)請解釋優(you)先(xian)級反(fan)轉問題
b) 很多RTOS提供優先(xian)(xian)級(ji)(ji)繼(ji)承策(ce)略(Priority inheritance)和優先(xian)(xian)級(ji)(ji)天花板(ban)策(ce)略(Priority ceilings)用來解(jie)決優先(xian)(xian)級(ji)(ji)反轉問(wen)題,請討(tao)論(lun)這兩種(zhong)策(ce)略。
參考答案:
1 5
存在風險,因為(wei)c=c++%5;這(zhe)個表達式(shi)對c有兩次修(xiu)改,行(xing)為(wei)未(wei)定義,c的值(zhi)不確定
int a=0; // data section
int b; // data section
static char c; // BSS
int main(int argc,char *argv[])
{
char d=4; // stack
static short e; // BSS
a++;
b=100;
c=(char)++a;
e=(++d)++;
printf("a=%d, b=%d, c=%d, d= %d, e=%d",a,b,c,d,e);
return 0;
}
a=2,b=100,c=2,d=6,e=5
2 a)ISR不能返回(hui)一(yi)個值;
b)ISR不(bu)能(neng)傳遞參(can)數(shu);
c)浮(fu)點一般(ban)都是不可重入的;
d)printf函數有重入和性能上的問(wen)題。
3 a) 用volatile關鍵字定義變量,相當(dang)于告訴(su)編譯器,這個變量的值會隨時發生變化,每(mei)次使用時都(dou)需要去內(nei)存里
重新讀取它(ta)的(de)值,并不要隨意針對它(ta)作(zuo)優化(hua)。
建議使用volatile變量(liang)的場(chang)所(suo):
(1) 并行設備的硬件寄存器
(2) 一(yi)個中斷服(fu)務子程序中會訪問到的非(fei)自(zi)動變量(liang)(全局變量(liang))
(3) 多線程(cheng)應(ying)用(yong)中(zhong)被幾(ji)個任(ren)務共享的變量
b) 在函數(shu)體,一個被聲明為靜態(tai)的(de)變量在這一函數(shu)被調用過程中維持(chi)其值(zhi)不(bu)變。
在(zai)模塊內(nei)(但(dan)在(zai)函數體(ti)外),一個被聲明為靜態的變量可以被模塊內(nei)所用函數訪問,但(dan)不能被模塊外其它函數
訪(fang)問。它是一個本地的全局變量(liang)。
在模塊內(nei),一(yi)個被(bei)聲(sheng)(sheng)明(ming)(ming)為靜態的(de)函(han)數只可被(bei)這一(yi)模塊內(nei)的(de)其它(ta)函(han)數調用(yong)。那就是,這個函(han)數被(bei)限制在聲(sheng)(sheng)明(ming)(ming)它(ta)的(de)
模(mo)塊的本地范圍(wei)內使用。
static全(quan)局(ju)變量與普通的(de)全(quan)局(ju)變量有(you)什么區(qu)別:static全(quan)局(ju)變量只初使化(hua)一(yi)次,防止在其他文件單(dan)元中被引用;
static局(ju)部變量和普(pu)通局(ju)部變量有什么區別:static局(ju)部變量只(zhi)被(bei)初(chu)始化一次,下一次依(yi)據上一次結果值;
static函數與普通函數有(you)什(shen)么區別:static函數在(zai)內存中只有(you)一份,普通函數在(zai)每個被調用中維持(chi)一份拷貝
c) 一個指(zhi)向常整型數的指(zhi)針(zhen)
一個(ge)指(zhi)向整型數的常指(zhi)針
一個(ge)指向常(chang)整(zheng)型數(shu)的常(chang)指針
4
a) 0x12345678
little endian big endian 剛(gang)好反過來
高地址--〉 0x12 低(di)地址--〉 0x12
0x34 0x34
0x56 0x56
低(di)地(di)址--〉 0x78 高地(di)址--〉 0x78
b)參(can)數<=4時候,通過R0~R3傳遞,>4的通過壓棧(zhan)方(fang)式傳遞
c) 異(yi)常:在產生時(shi)必須(xu)(xu)考慮與處理(li)器的時(shi)鐘同步,實(shi)踐上,異(yi)常也稱為同步中(zhong)斷。在處理(li)器執(zhi)行到由于編程失誤而導(dao)致(zhi)的錯誤指令時(shi),或者在執(zhi)行期間出現特(te)殊情況(如缺頁),必須(xu)(xu)靠(kao)內核處理(li)的時(shi)候(hou),處理(li)器就會產生一(yi)個異(yi)常。
所謂中(zhong)(zhong)斷應(ying)該是指外部硬件產生的一個(ge)電信(xin)號,從cpu的中(zhong)(zhong)斷引腳進入,打斷cpu當前的運行;
所謂異常(chang),是指軟件運(yun)行中發生了一些必須作出處理的事件,cpu自動(dong)產生一個陷(xian)入(ru)來打斷當前運(yun)行,轉入(ru)異常(chang)處理流(liu)程。
異步與同步的(de)區別`
5
6 高優(you)先級(ji)(ji)任務(wu)(wu)需要等(deng)待(dai)低(di)優(you)先級(ji)(ji)任務(wu)(wu)釋(shi)放資源(yuan),而低(di)優(you)先級(ji)(ji)任務(wu)(wu)又正在等(deng)待(dai)中等(deng)優(you)先級(ji)(ji)任務(wu)(wu)的現象(xiang)叫(jiao)做(zuo)優(you)先級(ji)(ji)反轉
優(you)先級(ji)繼(ji)(ji)承(cheng)(cheng)策(ce)略(Priority inheritance):繼(ji)(ji)承(cheng)(cheng)現有被阻塞任務(wu)的最(zui)高優(you)先級(ji)作為其優(you)先級(ji),任務(wu)退(tui)出臨(lin)界(jie)區,恢
復初始優先級。
優(you)先(xian)級(ji)天花板策略(lve)(Priority ceilings):控制訪(fang)問臨界資源的(de)信號(hao)量的(de)優(you)先(xian)級(ji)天花板。
優先級(ji)繼承(cheng)策略(lve)對任務(wu)(wu)執(zhi)行(xing)流程的影響(xiang)相對教小,因(yin)為只有當高優先級(ji)任務(wu)(wu)申請已(yi)被低優先級(ji)任務(wu)(wu)占(zhan)有的臨界資源
這(zhe)一事實發生時,才抬升(sheng)低優先級任務(wu)的優先

