linux驅動面試題二

http://www.myexception.cn/linux-unix/1438308.html

linux驅動面試題2

1.什麼是GPIO?

general purpose input/output  

GPIO是相對於芯片本身而言的,如某個管腳是芯片的GPIO腳,則該腳可作爲輸入或輸出高或低電平使用,當然某個腳具有複用的功能,即可做GPIO也可做其他用途。 

也就是說你可以把這些引腳拿來用作任何一般用途的輸入輸出,例如用一根引腳連到led的一極來控制它的亮滅,也可以用一根(一些)引腳連到一個傳感器上以獲得該傳感器的狀態,這給cpu提供了一個方便的控制周邊設備的途經。如果沒有足夠多的gpio管腳,在控制一些外圍設備時就會力有不逮,這時可採取的方案是使用CPLD來幫助管理。

2.觸摸屏的硬件原理?
http://www.51touch.com/Article/Maintain/Technology/175945932.htm
http://www.cublog.cn/u2/78837/showart_1186312.html
觸摸屏的主要三大種類是:電阻技術觸摸屏、 表面聲波技術觸摸屏、 電容技術觸摸屏。

電阻觸摸屏的主要部分是一塊與顯示器表面非常配合的電阻薄膜屏, 這是一種多層的複合薄膜,它以一層玻璃或硬塑料平板作爲基層,表面圖有一層透明氧化金屬 (ITO氧化銦,透明的導電電阻) 導電層,上面在蓋有一層外表面硬化處理、光滑防擦的塑料層 、它的內表面也塗有一層ITO塗層 、在他們之間有許多細小的(小於1/1000英寸)的透明隔離點把兩層導電層隔開絕緣 。當手指觸摸屏幕時,兩層導電層在觸摸點位置就有了接觸,控制器偵測到這一接觸並計算出(X,Y )的位置,再根據模擬鼠標的方式運作。這就是電阻技術觸摸屏的最基本的原理。

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

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


3.在Linux C中,ls這個命令是怎麼被執行的?
使用fork創建一個進程或exec函數族覆蓋原進程。

4.在一個只有128M內存並且沒有交換分區的機器上,說說下面兩個程序的運行結果
1,
#define MEMSIZE 1024*1024
int count = 0;
void *p = NULL;
while(1) {
  p = (void *)malloc(MEMSIZE);
  if (!p) break;
  printf("Current allocation %d MB\n", ++count);
}

2,
while(1) {
  p = (void *)malloc(MEMSIZE);
  if (!p) break;
  memset(p, 1, MEMSIZE);
  printf("Current allocation %d MB\n", ++count);
}

第一道程序分配內存但沒有填充,編譯器可能會把內存分配優化掉,程序死循環;第二道,程序分配內存並進行填充,系統會一直分配內存,直到內存不足,退出循環。

5.請定義一個宏,比較兩個數a、b的大小,不能使用大於、小於、if語句
搞的比較複雜。主要思想就是a-b的值的最高位是否爲0;但是又得考慮整數溢出的問題,所以很複雜。不知道哪位大俠有更好的辦法,指點指點。

  1. #include<stdio.h>

  2. #define ZHENG(i)((i>> 31)== 0)
  3. #define FU(i)((i>> 31)!= 0)
  4. #define COMPARE(a,b)((ZHENG(a)&& FU(b))||(((ZHENG(a)&& ZHENG(b))||(FU(a)&&FU(b)))&&((((a)-(b))>> 31)== 0)))

  5. void main()
  6. {
  7.     int a = 0x80000001;
  8.     int b = 0x6FFFFFFF;

  9.     if(COMPARE(a,b))
  10.     {
  11.         printf("a >= b\n");
  12.     }
  13.     else
  14.     {
  15.         printf("a < b\n");
  16.     }
  17. }

 

 

 

1、LINUX下的Socket套接字和Windows下的WinSock有什麼共同點?請從C/C++語言開發的角度描述,至少說出兩點共同點。(10分,說得好的每點加5分,沒有上限。精通SOCK編程者破格錄用。)



本題的目的就是考考應試者的SOCK功底,以及應用能力。答案可謂是五花八門,但是答對的少得可憐。其實答案很多,也很好回答。可見面試者功底確實一般,對SOCK編程只是一知半解。更有甚者,把TCP/IP的原理搬出來講了一大堆,卻無一條符合要求。



參考答案:

第1題,答中一個得5分,答出其它正確答案的,也得5分。

a)都基於TCP/IP協議,都提供了面向連接的TCP SOCK和無連接的UDP SOCK。

b)都是一個sock結構體。

c)都是使用sock文件句柄進行訪問。

d)都具有緩衝機制。



2、請編寫一個標準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時間由系統分派。

(本題滿分20分,程序15分,註釋5分。程序不能運行的0分,能夠運行但有BUG的10分,能夠正確無誤的運行的15分。清楚編寫註釋的5分。)



本題是考查LINUX和嵌入式編程功底的,寫出程序來的不少,但是95%以上的人竟無視我假設的資源,不知道在重啓test程序的時候需要加上一個適當的
掩飾時間,以便資源緊張的操作系統有時間回收資源。85%的人不知道寫完testd之後,要在init裏邊加載這個腳本,才能實現啓動時自動加載的功能。
有人甚至在腳本開頭使用bash作爲腳本解析器,我已經清清楚楚說明了用“標準shell”!用sh不就完了嗎?是習慣作祟嗎?



參考答案:

########################################

#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

#########################################

 

 


就業模擬測試題-LINUX驅動、系統底層工程師職位   1.你平常是怎麼用C寫嵌入式系統的死循環的? [3分]  2.寫一條命令,實現在dir以及其子目錄下找出所有包含“hello world”字符串的文件[2分] 

 

3.下面的兩段程序中,循環能否執行?爲什麼?

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”); }  
                

4.一個計劃跑LINUX系統的ARM系統把bootloader燒錄進去後,上電後串口上沒有任何輸出,硬件和軟件各應該去檢查什麼?   

 提示: 1.跑LINUX的系統一般都需要外擴DRAM,一般的系統也經常有NOR或NAND FLASH          

 

2.bootloader一般是由彙編和C編寫的裸奔程序[5分] 

 

 

 5.列舉最少3種你所知道的嵌入式的體系結構,並請說明什麼是ARM體系結構。[7分] 

 

6.請簡述下面這段代碼的功能 mov r12, #0x0        ldr r13, =0x30100000 mov r14, #4096 loop:   ldmia      r12!, {r0-r11}  stmia      r13!, {r0-r11}    cmp       r12, r14   blo          loop  [2分]

 

 


 7.嵌入式中常用的文件系統有哪些?說出它們的主要特點和應用場合?[5分] 

 

 

 8.某外設寄存器rGpioBase的地址是0x56000000,寄存器的0~15位有效,請寫出給外設寄存器高八位(8~`15位)設置成0xc3的代碼[7分] 

 

9.根據時序圖和說明編寫程序:


  GPIO已經設置好,只需要調用函數gpio_seet_level(int gpio, int level)即課使某個GPIO輸出高電平或者低電平。圖中用於產生時序的gpio已經分別定義爲SSP_XCS,SSP_SCLK,SSP_DIN,level的定義分別爲GPIO_LO和GPIO_HI,需要編寫函數的原型爲:void ssp_io_write_word(u32 command),該函數用來輸出一個字(如上圖中的A0到C0一組9位),這9個位是在參數command中的低9位. [5分]  10.簡述LINUX系統從上電開始到系統起來的主要流程?  提示: 1.可以uboot、內核和文件系統的主要功能去總結         

 

2.這個題主要是在筆試之後的面試,需要在3~5分鐘之內表述清楚[8分] 

 

 

11.如何編寫一個LINUX驅動?

 

提示:主要說字符設備的編寫過程 [7分]    12.簡述LINUX驅動中字符設備和塊設備的區別?[5分]   

 

 

13.試總結單片機底層開發與LINUX驅動開發有哪些異同?[4分] 

 

 

 14.請從網卡、USB HOST、LCD驅動器、NAND FLASH、WIFI 、音頻芯片中選擇一個或者2個(可以以具體的芯片爲例),對下面的問題做答: 
1.如果是外部擴展芯片,請說出你用的芯片的型號 
                      [每空5分] 

 

15.畫出上題中你選定相應硬件模塊與CPU的主要引腳連線[5分]  16. 編寫上題中你選定相應硬件模塊相應LINUX驅動的流程?[6分] 

 

 

 

 

 

 

 
int *ptr = (int *)0xaa66; *ptr = 0x67a9; 
我感覺自己寫的應該不算錯吧(自我感覺,還請達人指正),我寫的適合裸機下用,當做寄存器用,而答案就是適合在操作系統下的寫法。 
   
1. linux內核裏面,內存申請有哪幾個函數,各自的區別?  
2. IRQ和FIQ有什麼區別,在CPU裏面是是怎麼做的?  3.   
int *a;  
char *b;  
a 和 b本身是什麼類型?  
a、b裏面本身存放的只是一個地址,難道是這兩個地址有不同麼?    
4. 中斷的上半部分和下半部分的問題:  
講下分成上半部分和下半部分的原因,爲何要分?講下如何實現?  
5. 內核函數mmap的實現原理,機制?  
6. 驅動裏面爲什麼要有併發、互斥的控制?如何實現?講個例子?  
7. spinlock自旋鎖是如何實現的?  
8. 任務調度的機制?  
【二、本人碰到】  
1. 嵌入式linux和wince操作系統的特點和特性?  
2. 嵌入式linux中tty設備驅動的體系結構?  
3. 嵌入式設備,爲加快啓動速度,可以做哪些方面的優化?  

 

 


 
4. USB設備的枚舉過程?  
5. PSRAM、SDRAM、DDR、DDR2的時序特性?  
6. I2C觸摸屏芯片與CPU的數據傳輸流程?畫出相關圖例?(這題目記得不是太清楚了,大概是考查I2C設備驅動的數據傳輸過程) 

 

 

1、linux驅動分類

2、信號量與自旋鎖

3、platform總線設備及總線設備如何編寫

4、kmalloc和vmalloc的區別

5、module_init的級別

6、添加驅動

7、IIC原理,總線框架,設備編寫方法,i2c_msg

8、kernel panic

9、USB總線,USB傳輸種類,urb等

10、android boot 流程

11、android init解析init.rc


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