時間:2018-08-16 00:00:00 來源:信盈達 作者:信盈達
學習嵌入式之后緊接著就是面試了,信盈達小編整理了三十道經典面試題可供各位參考:
1、int a[10]={1,2,3,4,5,6,7,8,9,0};
int *p=&a[1];
則p[6]等于8
2、整數數組清零:bzero(),memset()。
3、sizeof();測試變量所占地址的字節數
4、 main()
{
char *str[]={"ab","cd","ef","gh","ij","kl"};
char *t;
t=(str+4)[-1];
printf("%s",t);
}
則顯示"gh"
5、小端:低位字節數據存儲在低地址
大端:高位字節數據存儲在低地址
例如:int a=0x12345678;(a首地址為0x2000)
0x2000 0x2001 0x2002 0x2003
0x12 0x34 0x56 0x78 大端格式
6、異步IO和同步IO區別
如果是同步IO,當一個IO操作執行時,應用程序必須等待,直到此IO執行完,相反,異步IO操作在后臺運行,
IO操作和應用程序可以同時運行,提高系統性能,提高IO流量; 在同步文件IO中,線程啟動一個IO操作然后就立即進入等待狀態,直到IO操作完成后才醒來繼續執行,而異步文件IO中,
線程發送一個IO請求到內核,然后繼續處理其他事情,內核完成IO請求后,將會通知線程IO操作完成了。
7、用變量a定義
一個整型數 int a;
一個指向整型數的指針 int *a;
一個指向指針的指針,它指向的指針式指向一個整型數 int **a;
一個有10個整型數的數組 int a[10];
一個有10指針的數組,該指針是指向一個整型數 int *a[10];
一個指向有10個整型數數組的指針 int (*a)[10];
一個指向函數的指針,該函數有一個整型數參數并返回一個整型數 int (*a)(int);
一個有10個指針的數組,該指針指向一個函數,該函數有一個整型數參數并返回一個整型 int (*a[10])(int);
8、int foo(void)
{
int i;
char c=0x80;
i=c;
if(i>0)
return 1;
return 2;
}
返回值為2;因為i=c=-128;如果c=0x7f,則i=c=127。
9、a=b*2;a=b/4;a=b%8;a=b/8*8+b%4;a=b*15;效率最高的算法
a=b*2 -> a=b<<1; a=b/4 -> a=b>>2; a=b%8 -> a=b&7; a=b/8*8+b%4 -> a=((b>>3)<<3)+(b&3) a=b*15 -> a=(b<<4)-b
10、c關鍵字
c的關鍵字共32個
*數據類型關鍵字(12)
char,short,int,long,float,double,unsigned,signed,union,enum,void,struct
*控制語句關鍵字(12)
if,else,switch,case,default,for,do,while,break,continue,goto,return
*存儲類關鍵字(5)
auto,extern,register,static,const
*其他關鍵字(3)
sizeof,typedef,volatile
11、int main(void)
{
unsigned int a = 6;
int b = -20;
char c;
(a+b>6)?(c=1):(c=0);
}則c=1,但a+b=-14;如果a為int類型則c=0。
原來有符號數和無符號數進行比較運算時(==,<,>,<=,>=),有符號數隱式轉換成了無符號數(即底層的補碼不變,但是此數從有符號數變成了無符號數),
比如上面 (a+b)>6這個比較運算,a+b=-14,-14的補碼為1111111111110010。此數進行比較運算時,
被當成了無符號數,它遠遠大于6,所以得到上述結果。
12、給定一個整型變量a,寫兩段代碼,第一個設置a的bit3,第二個清除a的bit,在以上兩個操作中,
要保持其它位不變。
#define BIT3 (0x1<<3)
static int a;
void set_bit3(void)
{
a |= BIT3;
}
void clear_bit3(void)
{
a &= ~BIT3;
}
13、要求設置一絕對地址為0x67a9的整型變量的值為0xaa66。
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa66;(建議用這種)
一個較晦澀的方法是:
*(int * const)(0x67a9) = 0xaa66;
14、中斷是嵌入式系統中重要的組成部分,這導致了很多編譯開發商提供一種擴展—讓標準C支持中斷。
具代表性的是,產生了一個新的關鍵字__interrupt。下面的代碼就使用了__interrupt關鍵字去定義了一個中斷服務子程序(ISR),請評論一下這段代碼的。
__interrupt void compute_area (void)
{
double area = PI * radius * radius;
printf(" Area = %f", area);
return area;
}
ISR不可能有參數和返回值的!
ISR盡量不要使用浮點數處理程序,浮點數的處理程序一般來說是不可重入的,而且是消耗大量CPU時間的!!
printf函數一般也是不可重入的,UART屬于低速設備,printf函數同樣面臨大量消耗CPU時間的問題!
15、評價下面的代碼片斷:
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
/*1's complement of zero */
對于一個int型不是16位的處理器為說,上面的代碼是不正確的。應編寫如下:
unsigned int compzero = ~0;
16、main()
{
char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
puts("Got a null pointer");
else
puts("Got a valid pointer");
}
該代碼的輸出是“Got a valid pointer”。還可以*ptr='a';不出現段錯誤
17、Typedef 在C語言中頻繁用以聲明一個已經存在的數據類型的同義字。也可以用預處理器做類似的事。
例如,思考一下下面的例子:
#define dPS struct s *
typedef struct s * tPS;
以上兩種情況的意圖都是要定義dPS 和 tPS 作為一個指向結構s指針。哪種方法更好呢?(如果有的話)為什么?
這是一個非常微妙的問題,任何人答對這個問題(正當的原因)是應當被恭喜的。答案是:typedef更好。思考下面的例子:
dPS p1,p2;
tPS p3,p4;
第一個擴展為
struct s * p1, p2;
上面的代碼定義p1為一個指向結構的指,p2為一個實際的結構,這也許不是你想要的。第二個例子正確地定義了p3 和p4 兩個指針。
18、int a = 5, b = 7, c;
c = a+++b;
則c=12。
19、int main()
{
int j=2;
int i=1;
if(i = 1) j=3;
if(i = 2) j=5;
printf("%d",j);
}
輸出為5;如果再加上if(i=3)j=6;則輸出6。
20、宏定義是在預編譯階段被處理的。
21、Norflash與Nandflash的區別
(1)、NAND閃存的容量比較大
(2)、由于NandFlash沒有掛接在地址總線上,所以如果想用NandFlash作為系統的啟動盤,就需要CPU具備特殊的功能,
如s3c2410在被選擇為NandFlash啟動方式時會在上電時自動讀取NandFlash的4k數據到地址0的SRAM中。
(3)、NAND Flash一般地址線和數據線共用,對讀寫速度有一定影響。NOR Flash閃存數據線和地址線分開,
所以相對而言讀寫速度快一些。
22、反碼:對原碼除符號位外的其余各位逐位取反就是反碼
補碼:負數的補碼就是對反碼加1
正數的原碼、反碼、補碼都一樣
23、pthread_t tid;
pthread_create(&tid,NULL,pthread_func,NULL);//創建線程
pthread_join(tid,NULL);//等待子線程結束,并回收資源
pthread_detach(tid);//與當前進程分離
pthread_exit(NULL);//退出調用線程
pthread_cancel(tid);//取消線程
pthread_mutex mutex=PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_init(&mutex,NULL);//初始化一個互斥鎖
pthread_mutex_lock(&mutex);//對互斥鎖上鎖
pthread_mutex_unlock(&mutex);//對互斥鎖解鎖
sem_t sem;
sem_init(&sem,0,1);//創建信號量并初始化它的值
sem_wait(&sem);//信號量的值減1
sem_post(&sem);//信號量的值加1
24、內存管理MMU的作用
*內存分配和回收
*內存保護
*內存擴充
*地址映射
25、ROM是只讀存儲器,掉電不丟失
RAM是讀寫存儲器,掉電丟失
26、SRAM:CPU的緩存就是SRAM,靜態的隨機存取存儲器,加電情況下,不需要刷新,數據不會丟失
DRAM,動態隨機存取存儲器最為常見的系統內存,需要不斷刷新,才能保存數據
SDRAM:同步動態隨機存儲器,即數據的讀取需要時鐘來同步。
27、signed char 的取值范圍-128~127.
28、編譯和鏈接有什么不同?(如外部符號的處理)
編譯生成的是目標文件(object *.o);
編譯過程中對于外部符號不做任何解釋和處理。外部符號對應的就是“符號”
鏈接生成的是可執行程序
鏈接將會解釋和處理外部符號。外部符號對應的是地址
29、已知strcpy函數的函數原型是:
char *strcpy(char *strDest, const char *strSrc)。其中,strDest是目的字符串,strSrc是源字符串。
不調用C++/C的字符串庫函數,請編寫函數strcpy
char *strcpy(char *strDest, const char *strSrc)
{
int i=0;
if(!(strDest && strSrc))
return;
while(strDest[i++] = *strSrc++);
return strDest;
}
30、strcpy能把strSrc的內容復制到strDest,為什么還要char *類型的返回值?
為了實現鏈式表達式
int len = strlen(strcpy(strDest, strSrc));

信盈達2008年在深圳特區南山高新科技園成立。自成立至今近九年來專注為企業和個人提供高端方案設計、高端嵌入式/Android培訓等服務。公司下設信盈達實訓學院、信盈達研發中心、信盈達教學儀器三大業務板塊。九年來公司堅持"技術領先、服務領先",以雄厚的實力和專業的品質成為國內唯一有實力從產品最底層研發到系統層開發的嵌入式實訓、產品解決方案提供商。為中國IT行業提供最具價值的職業教育服務。專業培訓嵌入式、物聯網、人工智能、Java、單片機等課程,想了解更多信息點擊立馬咨詢
免費領取試聽卡
申請已經提交
老師會馬上給您安排試聽課程!
申請出錯了
您可以加老師QQ:914865590報名咨詢!