以下是嵌入式驅(qū)動開發(fā)工程師面試的幾道經(jīng)典筆試題:
驅(qū)動工程師筆試題目
1.什么是GPIO?
general purpose input/output
GPIO是相對于芯片本身而言的,如某個管腳是芯片的GPIO腳,則該腳可作為輸入或輸出高或低電平使用,當然某個腳具有復用的功能,即可做GPIO也可做其他用途。
也就是說你可以把這些引腳拿來用作任何一般用途的輸入輸出,例如用一根引腳連到led的一極來控制它的亮滅,也可以用一根(一些)引腳連到一個傳感器上以獲得該傳感器的狀態(tài),這給cpu提供了一個方便的控制周邊設備的途經(jīng)。如果沒有足夠多的gpio管腳,在控制一些外圍設備時就會力有不逮,這時可采取的方案是使用CPLD來幫助管理。
2.觸摸屏的硬件原理?
觸摸屏的主要三大種類是:電阻技術(shù)觸摸屏、 表面聲波技術(shù)觸摸屏、 電容技術(shù)觸摸屏。
電阻觸摸屏的主要部分是一塊與顯示器表面非常配合的電阻薄膜屏, 這是一種多層的復合薄膜,它以一層玻璃或硬塑料平板作為基層,表面圖有一層透明氧化金屬 (ITO氧化銦,透明的導電電阻) 導電層,上面在蓋有一層外表面硬化處理、光滑防擦的塑料層 、它的內(nèi)表面也涂有一層ITO涂層 、在他們之間有許多細小的(小于1/1000英寸)的透明隔離點把兩層導電層隔開絕緣 。當手指觸摸屏幕時,兩層導電層在觸摸點位置就有了接觸,控制器偵測到這一接觸并計算出(X,Y )的位置,再根據(jù)模擬鼠標的方式運作。這就是電阻技術(shù)觸摸屏的最基本的原理。
表面聲波技術(shù)是利用聲波在物體的表面進行傳輸,當有物體觸摸到表面時,阻礙聲波的傳輸,換能器偵測到這個變化,反映給計算機,進而進行鼠標的模擬。
電容技術(shù)觸摸屏利用人體的電流感應進行工作 。用戶觸摸屏幕時 ,由于人體電場,用戶和觸摸屏表面形成以一個耦合電容, 對于高頻電流來說,電容是直接導體,于是手指從接觸點吸走一個很小的電流
3.在Linux C中,ls這個命令是怎么被執(zhí)行的?
使用fork創(chuàng)建一個進程或exec函數(shù)族覆蓋原進程。
4.在一個只有128M內(nèi)存并且沒有交換分區(qū)的機器上,說說下面兩個程序的運行結(jié)果
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);
}
第一道程序分配內(nèi)存但沒有填充,編譯器可能會把內(nèi)存分配優(yōu)化掉,程序死循環(huán);第二道,程序分配內(nèi)存并進行填充,系統(tǒng)會一直分配內(nèi)存,直到內(nèi)存不足,退出循環(huán)。
5.請定義一個宏,比較兩個數(shù)a、b的大小,不能使用大于、小于、if語句
搞的比較復雜。主要思想就是a-b的值的最高位是否為0;但是又得考慮整數(shù)溢出的問題,所以很復雜。不知道哪位大俠有更好的辦法,指點指點。
#include
#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");
}
}