1. 程式人生 > >嵌入式常見面試題總結(5)

嵌入式常見面試題總結(5)

35,什麼是GPIO? 答:general purpose input/output   GPIO是相對於晶片本身而言的,如某個管腳是晶片的GPIO腳,則該腳可作為輸入或輸出高或低電平使用,當然某個腳具有複用的功能,即可做GPIO也可做其他用途。  也就是說你可以把這些引腳拿來用作任何一般用途的輸入輸出,例如用一根引腳連到led的一極來控制它的亮滅,也可以用一根(一些)引腳連到一個感測器上以獲得該感測器的狀態,這給cpu提供了一個方便的控制周邊裝置的途經。如果沒有足夠多的gpio管腳,在控制一些外圍裝置時就會力有不逮,這時可採取的方案是使用CPLD來幫助管理。36,觸控式螢幕的硬體原理? 答:觸控式螢幕的主要三大種類是:電阻技術觸控式螢幕、 表面聲波技術觸控式螢幕、 電容技術觸控式螢幕。 電阻觸控式螢幕的主要部分是一塊與顯示器表面非常配合的電阻薄膜屏, 這是一種多層的複合薄膜,它以一層玻璃或硬塑料平板作為基層,表面圖有一層透明氧化金屬 (ITO氧化銦,透明的導電電阻) 導電層,上面在蓋有一層外表面硬化處理、光滑防擦的塑料層 、它的內表面也塗有一層ITO塗層 、在他們之間有許多細小的(小於1/1000英寸)的透明隔離點把兩層導電層隔開絕緣 。當手指觸控式螢幕幕時,兩層導電層在觸控點位置就有了接觸,控制器偵測到這一接觸並計算出(X,Y )的位置,再根據模擬滑鼠的方式運作。這就是電阻技術觸控式螢幕的最基本的原理。

表面聲波技術是利用聲波在物體的表面進行傳輸,當有物體觸控到表面時,阻礙聲波的傳輸,換能器偵測到這個變化,反映給計算機,進而進行滑鼠的模擬。

電容技術觸控式螢幕利用人體的電流感應進行工作 。使用者觸控式螢幕幕時 ,由於人體電場,使用者和觸控式螢幕表面形成以一個耦合電容, 對於高頻電流來說,電容是直接導體,於是手指從接觸點吸走一個很小的電流。

37,在Linux C中,ls這個命令是怎麼被執行的? 答:使用fork建立一個程序或exec函式族覆蓋原程序。38,在一個只有128M記憶體並且沒有交換分割槽的機器上,說說下面兩個程式的執行結果?

答:1,#define MEMSIZE 1024*1024 int count = 0; void *p = NULL; 2,while(1) {   p = (void *)malloc(MEMSIZE);   if (!p) break;   printf("Current allocation %d MB\n", ++count); } while(1) {   p = (void *)malloc(MEMSIZE);   if (!p) break;   memset(p, 1, MEMSIZE);   printf("Current allocation %d MB\n", ++count); } 第一道程式分配記憶體但沒有填充,編譯器可能會把記憶體分配優化掉,程式死迴圈;第二道,程式分配記憶體並進行填充,系統會一直分配記憶體,直到記憶體不足,退出迴圈。39

,請定義一個巨集,比較兩個數a、b的大小,不能使用大於、小於、if語句? 答:搞的比較複雜。主要思想就是a-b的值的最高位是否為0;但是又得考慮整數溢位的問題,所以很複雜。不知道哪位大俠有更好的辦法,指點指點。 #include<stdio.h> #define ZHENG(i)((i>> 31)== 0) #define FU(i)((i>> 31)!= 0) #define COMPARE(a,b)((ZHENG(a)&& FU(b))||(((ZHENG(a)&& ZHENG(b))||(FU(a)&&FU(b)))&&((((a)-(b))>> 31)== 0))) void main() {     int a = 0x80000001;     int b = 0x6FFFFFFF;     if(COMPARE(a,b))     {         printf("a >= b\n");     }     else     {         printf("a < b\n");     } }40
,LINUX下的Socket套接字和Windows下的WinSock有什麼共同點?請從C/C++語言開發的角度描述,至少說出兩點共同點? 答:a)都基於TCP/IP協議,都提供了面向連線的TCP SOCK和無連線的UDP SOCK。 b)都是一個sock結構體。 c)都是使用sock檔案控制代碼進行訪問。 d)都具有緩衝機制。41,請編寫一個標準Shell指令碼testd,實現如下功能: A、在Linux作業系統啟動的時候,自動載入/mnt/test/test程式。 B、當test異常退出之後,自動重新啟動。 C、當test程式重啟次數超過100次,自動復位作業系統。 答:假設你所擁有的資源: A、目標機器是一臺具有標準shell的嵌入式計算機,CPU為ARM7 56MB,記憶體16MB,軟體環境基於Linux2.6.11和BusyBox1.2構建。 B、當前已有11個使用者程序在執行,佔用了大部分的CPU時間和記憶體,你可使用的記憶體只有2MB左右,CPU時間由系統分派。 本題是考查LINUX和嵌入式程式設計功底的,寫出程式來的不少,但是95%以上的人竟無視我假設的資源,不知道在重啟test程式的時候需要加上一個適當的掩飾時間,以便資源緊張的作業系統有時間回收資源。85%的人不知道寫完testd之後,要在init裡邊載入這個指令碼,才能實現啟動時自動載入的功能。 參考答案: ######################################## #testd is a daemon script to start an watch the program test ######################################## #!/bin/sh #load *.so that may need if [ -r /sbin/ldconfig ]; then ldconfig fi #add the libs PATH that may need export LD_LIBRARY_PATH="/lib" #count is the counter of test started times count=0 #main loop while [ 1 ] ;do #add execute property for /mnt/test/test chmod +x /mnt/test/test #start test /mnt/test/test #the running times counter let count=count+1 echo "test running times is $count" #Is test running too many times? if [ "$count" -gt 100 ]; then echo "Will reboot because of test running too many times" reboot fi #wait for test stoping...

sleep 3 done #########################################42.你平常是怎麼用C寫嵌入式系統的死迴圈的?

答:While(1);for(;;)

43,寫一條命令,實現在dir以及其子目錄下找出所有包含“hello world”字串的檔案?

答:grep -r "hello world" ./dir或者grep -rHn "hello world" ./44,下面的兩段程式中,迴圈能否執行?為什麼? A: unsigned short i; unsigned short index = 0; for(i = 0; i <index-1; i++){     printf(“a\n”); } B: unsigned short i; unsigned long index = 0; for(i = 0; i <index-1; i++){      printf(“b\n”); }  45,一個計劃跑LINUX系統的ARM系統把bootloader燒錄進去後,上電後串列埠上沒有任何輸出,硬體和軟體各應該去檢查什麼?    提示: 1.跑LINUX的系統一般都需要外擴DRAM,一般的系統也經常有NOR或NAND FLASH          46,列舉最少3種你所知道的嵌入式的體系結構,並請說明什麼是ARM體系結構。

答:ARM7/ARM9/ARM11

47,請簡述下面這段程式碼的功能?

mov r12, #0x0        

ldr r13, =0x30100000 

mov r14, #4096 

loop:   

ldmia      r12!, {r0-r11}  

stmia      r13!, {r0-r11}    

cmp       r12, r14   

bl          loop

答案:藉助r0~r11,將記憶體地址0x0開始的4KB資料拷貝到0x30100000

48,嵌入式中常用的檔案系統有哪些?說出它們的主要特點和應用場合?

答:只讀檔案系統  cramfs: 壓縮的只讀檔案系統  特點: 啟動快,檔案最大支援256MB,單個檔案最大16MB  squashfs: 只讀檔案系統  特點: 壓縮比最大,啟動比cramfs慢  案例:路由器,ubuntu的發行光碟 可結合LZMA壓縮演算法  可讀寫的檔案系統:  JFFS2: 支援NOR 和NAND FLASH (對NAND的支援天生不足)  

49,某外設暫存器rGpioBase的地址是0x56000000,暫存器的0~15位有效,請寫出給外設暫存器高八位(8~`15位)設定成0xc3的程式碼?

答:#define rGpioBase (*((volatile unsigned int *)0x56000000)) rGpioBase &= ~0xff00; rGpioBase |= 0xc300;