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

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

24,IRQ和FIQ有什麼區別,在CPU裡面是是怎麼做的?

答:快速中斷請求(Fast Interrupt Request,FIQ)

中斷控制器去中斷ARM核心,可以選擇fiq和irq兩種方式:

irq發生時,ARM處於irq模式。在irq模式期間,不可以再次被irq中斷打斷,也就是不能巢狀;但是可以被fiq打斷;

fiq發生時,ARM處於fiq模式,在fiq模式期間,不可以再次被fiq中斷打斷,更不可能被irq模式打斷。

在ARM11及以前版本中,一箇中斷控制器中只有一箇中斷能被設為fiq ;

綜上所述,兩個區別:

fiq的優先更高一些(跟irq相比);

fiq 的r8 r9 r10 r11 r12暫存器物理上是獨立,進入fiq保護現場時,少保護這幾個暫存器(我拷,這能節約多少時間?)

另外,linux直接沒有用到ARM的fiq.

25,中斷的上半部分和下半部分的問題:講下分成上半部分和下半部分的原因,為何要分?講下如何實現?答:上半部分執行與硬體相關的處理要求快, 而有些驅動在中斷處理程式中又需要完成大量工作,這構成矛盾,所以Linux有所謂的bottom half機制,中斷處理程式中所有不要求立即完成的,在開中斷的環境下,由底半程式隨後完成. Linux的底半處理實際上是建立在核心的軟中斷機制上的. Linux 的底半 機制主要有Tasklet 和 work queue 以及 softirq ( 2.4核心則有BH , Task queue , softirq , tasklet 沒有work queue),其實底半可以理解成一種工作的延遲。所以實際使用時跟timer機制基本上一個意思。26,

核心函式mmap的實現原理,機制?答:mmap函式實現把一個檔案對映到一個記憶體區域,從而我們可以像讀寫記憶體一樣讀寫檔案,他比單純呼叫read/write也要快上許多。在某些時候我們可以把記憶體的內容拷貝到一個檔案中實現記憶體備份,當然,也可以把檔案的內容對映到記憶體來恢復某些服務。另外,mmap實現共享記憶體也是其主要應用之一,mmap系統呼叫使得程序之間通過對映同一個普通檔案實現共享記憶體。

27,驅動裡面為什麼要有併發、互斥的控制?如何實現?講個例子?

答:併發(concurrency)指的是多個執行單元同時、並行被執行,而併發的執行單元對 共 享資源(硬體資源和軟體上的全域性變數、靜態變數等)的訪問則很容易導致競態(race conditions) 。 解決競態問題的途徑是保證對共享資源的互斥訪問, 所謂互斥訪問就是指一個執行單 元 在訪問共享資源的時候,其他的執行單元都被禁止訪問。 訪問共享資源的程式碼區域被稱為臨界區, 臨界區需要以某種互斥機 制加以保護, 中斷遮蔽, 原子操作,自旋鎖,和訊號量都是 linux 裝置驅動中可採用的互斥途徑。

28,spinlock自旋鎖是如何實現的?答:自旋鎖在同一時刻只能被最多一個核心任務持有,所以一個時刻只有一個執行緒允許存在於臨界區中。這點可以應用在多處理機器、或執行在單處理器上的搶佔式核心中需要的鎖定服務。 這裡也介紹下訊號量的概念,因為它的用法和自旋鎖有相似的地方。linux中的訊號量是一種睡眠鎖。如果有一個任務試圖獲得一個已被持有的訊號量時,訊號量會將其推入等待佇列,然後讓其睡眠。這時處理器獲得自由去執行其它程式碼。當持有訊號量的程序將訊號量釋放後,在等待佇列中的一個任務將被喚醒,從而便可以獲得這個訊號量。

29,任務排程的機制?

答:linux程序的排程時機大致分為兩種情況:

一種是程序自願排程;

另一種是發生強制性排程。

首先,自願的排程隨時都可以進行。在核心空間中,程序可以通過schedule()啟動一次排程;在使用者空間中,可以通過系統呼叫pause()達到同樣的目的。如果要為自願的暫停行為加上時間限制,在核心中使用schedule_time(),而在使用者空間則使用nanosleep()系統呼叫。

30,嵌入式linux和wince作業系統的特點和特性?

答:支援多種硬體平臺,wince差一點;

佔有較少的硬體資源,wince對資源的要求更高;

高可定製性,wince做不到;

具有實時處理能力;

具備強大的網路功能,wince沒有;

高安全性和高可靠性;

具有完善的嵌入式GUI和嵌入式瀏覽器;

實現嵌入式日誌檔案系統,具備斷電保護能力;

能夠提供完善的開發工具集;

能夠快速啟動。

31,嵌入式linux中tty裝置驅動的體系結構?

答:tty這個名稱源於電傳打位元組的簡稱。在linux表示各種終端。終端通常都跟硬體相對應。比如對應於輸入裝置鍵盤滑鼠。輸出裝置顯示器的控制 終端和串列埠終端.也有對應於不存在裝置的pty驅動。在如此眾多的終端模型之中,linux是怎麼將它們統一建模的呢?這就是我們今天要討論的問題。

Linux核心中tty的層次結構包含tty核心、tty線路規程和tty驅動;

tty裝置傳送資料的流程為:tty核心從一個使用者獲取將要傳送給一個tty裝置的資料,tty核心將資料傳遞給tty線路規程驅動,接著資料被傳遞到tty驅動,tty驅動將資料轉換為可以傳送給硬體的格式。

接收資料的流程為: 從tty硬體接收到的資料向上交給tty驅動,進入tty線路規程驅動,再進入 tty 核心,在這裡它被一個使用者獲取。儘管大多數時候tty核心和tty之間的資料傳輸會經歷tty線路規程的轉換,但是tty驅動與tty核心之間也可以直接傳輸資料。

32,嵌入式裝置,為加快啟動速度,可以做哪些方面的優化?

答:linux預設的安裝核心相當龐大,為了保證系統的相容性和靈活性,支援熱插拔操作,核心啟動時要進行大量的硬體檢測和初始化工作,而嵌入式的硬體都是固定的,只需要選擇需要的硬體驅動就可以,不需要全部的硬體驅動都檢測;因此可以進行適當的裁剪核心達到縮小啟動linux系統的目的;同時可以統計驅動模組的耗時時間,對耗時較長的模組驅動加以分析,優化。

33,USB裝置的列舉過程? 答:(1) Get Device Descriptor。主機的第一個命令要求得到裝置描述符,此SETUP 包為8 個位元組資料(80,06,00,01,00,00,40,00),發向地址0,埠0。“40”表示返回資料長度最大為40H 個位元組。實際上,只返回一個包,即陣列DEV_DESC[ ]中的前8 個位元組,用於說明裝置的描述符的真實長度和裝置的型別。 (2) Set Address。接著是設定裝置地址處理事件,主機發送一個含有指定地址的資料包(00,05,02,00,00,00,00,00),在主機只有一個USB 裝置的時候,這個地址一般會是2,最大地址127,USB 協議中可以連線127 個裝置。設定地址事件處理結束後,裝置進入地址狀態,主機以後會在新的指定地址處訪問裝置。 (3) Get Device Descriptor。主機再次傳送請求得到裝置描述符的資料包(80,06,00,01,00,00,12,00),與上次不同的是,要求的資料的長度是實際的資料長度,同時是傳送到Set Address命令所設定的地址。 (4) 讀取全部Configuration Descriptor。接著主機要求得到裝置全部的配置描述符、介面描述符和節點描述符(80,06,00,02,00,00,40,00),由於主機不知道裝置描述符的真實長度,因此它要求得到64個位元組。 (5) Set Interface,主機發送資料包(01,0B,00,00,00,00,00,00),設定介面值為0。 (6) Set Conifguration,確定USB裝置工作在哪一個配置下。對於U盤裝置來說,一般只有1個配置值,其值為01。主機發送資料包(00,09,01,00,00,00,00,00)。 (7) 如果以上步驟都正確,主機將找到新裝置,並且配置成功,該裝置可以正常使用,可以進行後續的U盤列舉過程了。 (8) 用busHound觀察計算機對於U盤的列舉過程,發現上述步驟後還有一個GetMaxLun的操作,但是實際上對於U盤來說忽略該步驟也沒有問題。34,PSRAM、SDRAM、DDR、DDR2的時序特性?

答:PSRAM,全稱Pseudo static random access memory。指的是偽靜態隨機儲存器。

SDRAM:Synchronous Dynamic Random Access Memory,同步動態隨機儲存器,同步是指 Memory工作需要同步時鐘,內部的命令的傳送與資料的傳輸都以它為基準;動態是指儲存陣列需要不斷的重新整理來保證資料不丟失;隨機是指資料不是線性依次儲存,而是自由指定地址進行資料讀寫。

DDR=Double Data Rate雙倍速率同步動態隨機儲存器。DDR SDRAM是Double Data Rate SDRAM的縮寫,是雙倍速率同步動態隨機儲存器的意思。

在同等核心頻率下,DDR2的實際工作頻率是DDR的兩倍。這得益於DDR2記憶體擁有兩倍於標準DDR記憶體的4BIT預讀取能力。換句話說,雖然DDR2和DDR一樣,都採用DDR2記憶體的頻率了在時鐘的上升延和下降延同時進行資料傳輸的基本方式,但DDR2擁有兩倍於DDR的預讀取系統命令資料的能力。也就是說,在同樣100MHz的工作頻率下,DDR的實際頻率為200MHz,而DDR2則可以達到400MHz。