http://www.myexception.cn/linux-unix/1438308.html
linux驅動面試題2
GPIO是相對於芯片本身而言的,如某個管腳是芯片的GPIO腳,則該腳可作爲輸入或輸出高或低電平使用,當然某個腳具有複用的功能,即可做GPIO也可做其他用途。
也就是說你可以把這些引腳拿來用作任何一般用途的輸入輸出,例如用一根引腳連到led的一極來控制它的亮滅,也可以用一根(一些)引腳連到一個傳感器上以獲得該傳感器的狀態,這給cpu提供了一個方便的控制周邊設備的途經。如果沒有足夠多的gpio管腳,在控制一些外圍設備時就會力有不逮,這時可採取的方案是使用CPLD來幫助管理。
表面聲波技術是利用聲波在物體的表面進行傳輸,當有物體觸摸到表面時,阻礙聲波的傳輸,換能器偵測到這個變化,反映給計算機,進而進行鼠標的模擬。
電容技術觸摸屏利用人體的電流感應進行工作 。用戶觸摸屏幕時 ,由於人體電場,用戶和觸摸屏表面形成以一個耦合電容, 對於高頻電流來說,電容是直接導體,於是手指從接觸點吸走一個很小的電流
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);
}
-
#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");
-
}
- }
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