天天看點

嵌入式常見面試題總結(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,嵌入式中常用的檔案系統有哪些?說出它們的主要特點和應用場合?

繼續閱讀