天天看點

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

1,字元型驅動裝置是怎麼建立裝置檔案的,就是/dev/下面的裝置檔案,供上層應用程式打開使用的檔案?

答:方式一(手動):mknod指令結合裝置的主裝置号和次裝置号,可建立一個裝置檔案;

方式二(自動):UDEV/MDEV自動建立裝置檔案的方式,UDEV/MDEV是運作在使用者态的程式,可以動态管理裝置檔案,包括建立和删除裝置檔案,運作在使用者态意味着系統要運作之後;

方式三(自動):在系統啟動期間還有devfs建立了裝置檔案。

2,寫一個中斷服務需要注意哪些?如果中斷産生之後要做比較多的事情你是怎麼做的?

答:(1)中斷處理例程應該盡量短,注意快進快出,在中斷服務程式裡面盡量快速采集資訊,包括硬體資訊,然後推出中斷,要做其它事情可以使用工作隊列或者tasklet方式。也就是中斷上半部和下半部;

(2)中斷服務程式中不能有阻塞操作;

(3)中斷服務程式注意傳回值,要用作業系統定義的宏做為傳回值,而不是自己定義的FAIL,OK,之類的。

中斷服務程式(ISR,Interrupt Service Routines):處理器處理"急件",可了解為是一種服務,是通過執行事先編好的某個特定的程式來完成的。

3,自旋鎖和信号量在互斥使用時需要注意哪些?在中斷服務程式裡面的互斥是使用自旋鎖還是信号量?還是兩者都能用?為什麼?

答:使用自旋鎖的程序不能睡眠,使用信号量的程序可以睡眠。中斷服務例程中的互斥使用的是自旋鎖,原因是在中斷處理例程中,硬中斷是關閉的,這樣會丢失可能到來的中斷。

自旋鎖:它是為實作保護共享資源而提出一種鎖機制。其實,自旋鎖與​​互斥鎖​​比較類似,它們都是為了解決對某項資源的互斥使用。無論是互斥鎖,還是自旋鎖,在任何時刻,最多隻能有一個保持者,也就說,在任何時刻最多隻能有一個執行單元獲得鎖。但是兩者在排程機制上略有不同。對于互斥鎖,如果資源已經被占用,資源申請者隻能進入睡眠狀态。但是自旋鎖不會引起調用者睡眠,如果自旋鎖已經被别的執行單元保持,調用者就一直循環在那裡看是否該自旋鎖的保持者已經釋放了鎖,"自旋"一詞就是是以而得名。

信号量:有時被稱為信号燈,是在多線程環境下使用的一種設施,是可以用來保證兩個或多個關鍵代碼段不被​​并發​​調用。在進入一個關鍵代碼段之前,線程必須擷取一個信号量;一旦該關鍵代碼段完成了,那麼該線程必須釋放信号量。其它想進入該關鍵代碼段的線程必須等待直到第一個線程釋放信号量。為了完成這個過程,需要建立一個信号量VI,然後将Acquire Semaphore VI以及Release Semaphore VI分别放置在每個關鍵代碼段的首末端。确認這些信号量VI引用的是初始建立的信号量。

互斥鎖:在多線程開發中,我們采用@synchronized來建立一個互斥鎖,保證在同一時刻隻有一個線程對其進行操作。

4,原子操作你怎麼了解?

答:原子操作,即不可分割開的操作,該操作一定是在同一個cpu時間片中完成,這樣即使線程被切換,多個線程也不會看到同一塊記憶體中不完整的資料。如果這個操作所處的層(layer)的更高層不能發現其内部實作與結構,那麼這個操作是一個原子(atomic)操作。原子操作可以是一個步驟,也可以是多個操作步驟,但是其順序不可以被打亂,也不可以被切割而隻執行其中的一部分。将整個操作視作一個整體是原子性的核心特征。

5,nsmod 一個驅動子產品,會執行子產品中的哪個函數?rmmod呢?這兩個函數在設計上要注意哪些?遇到過解除安裝驅動出現異常沒?是什麼問題引起的?

答:insmod調用init函數,rmmod調用exit函數。

解除安裝子產品時曾出現解除安裝失敗的情形,原因是存在程序正在使用子產品,檢查代碼後發現産生了死鎖的問題。

要注意在init函數中申請的資源在exit函數中要釋放,包括存儲,ioremap,定時器,工作隊列等等。也就是一個子產品注冊進核心,退出核心時要清理所帶來的影響,帶走一切不留下一點痕迹。

繼續閱讀