天天看點

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

50,如何編寫一個LINUX驅動? 

答:一.在系統的資源檔案代碼中定義platform_device,裡面填寫對應裝置的外設IO起始位址,位址長度,中斷,DMA資源等資訊資源資訊,并把資源資訊添加到系統啟動初始化流程裡面;

二. 通過module_init(xxx_init)和moule_exit(xxx_init)定義驅動入口和出口函數;

三.寫出子產品加載xxx_init()和退出的實際處理函數xxx_exit(),這裡以xxx_init()為例:

在裡面調用platform_driver_resigter()注冊一個platform_driver結構體,實作其中的probe()和remove()函數以及driver成員結構體中name和owner成員。

51,簡述LINUX驅動中字元裝置和塊裝置的差別?

答:字元裝置的特點是資料以字元流的方式進行通路,資料的順序不能錯序,亂序和随機讀寫,字元裝置核心中不需要讀寫的緩沖,其驅動不支援lseek()函數

塊裝置的特點是資料是固定塊大小(典型值有512位元組,2KB,4KB)進行讀寫,塊裝置可以随機讀寫,讀寫的時候核心中需要緩沖,驅動支援lseek()函數,塊裝置中資料的通路需要先mount到LINUX的目錄檔案後才能通路裡面的資料

LINUX中字元裝置架構相對簡單,應用程式設計的系統調用open,close,read,write和ioctl等函數驅動裡面有相應的file_operations結構體裡面的函數與之對應。

LINUX中塊裝置架構相對複雜,應用程式的讀寫會通過塊裝置裡面的檔案系統轉化為讀寫的IO請求,塊裝置驅動裡面通過gendisk結構體抽象塊裝置,并通過對請求隊列的處理來實作對塊裝置的讀寫。

52,試總結單片機底層開發與LINUX驅動開發有哪些異同?

答:底層的程式包括,核心,bootloader和驅動。基本開發Android硬體産品公司主要需要這一類人。而不同産品中,核心和bootloader變化較小,主要的工作量是在驅動之上。驅動相當于 單片機程式+linux核心接口。

但是從單片機轉型為Linux驅動開發的,幾個主要問題的,是代碼量急劇增加,在單片機中有一些習慣在驅動開發裡變成緻命的陷阱。比如不喜歡用宏,在驅動大量用到核心複雜結構而單片機往往自寫,還有一個并發處理,也是一個難點。

相同點:

單片機開發和LINUX的驅動開發都有對硬體的操作,最底層對硬體的寄存器操作,對時序的了解是一緻的。

不同點:

1.單片機是對外設的IO實位址進行直接操作,而LINUX裡面,由于使能了MMU,是以對外設IO位址的操作必須先通過ioremap()或者通過靜态映射,把外設IO位址映射到核心的虛拟位址空間後才能正确操作。

2.在單片機編寫對應裝置的驅動不用考慮系統太多的系統分層問題,重用其他的代碼量比較小,而LINUX采用分層抽象的思想,在LINUX中編寫裝置驅動,要按照LINUX已經搭建好的層次結構進行驅動編寫,經常調用LINUX提供的函數和機制,代碼重用性大。

3.由于LINUX是一個多任務的系統,即使在單核CPU上也存在資源競争的情況(思考一下,LINUX裡面那些地方可能導緻資源競争),是以在對驅動的編寫的時候,對競争資源需要采用一定的資源保護機制,比如原子變量,自旋鎖等

4.單片機中斷處理時,一般直接在産生中斷的進入到中斷處理函數裡面在關中斷的情況下處理完中斷就可以。而LINUX裡面把中斷分為2部分,上半部分和下班部分,在上半部分中,是在關中斷情況下,隻做最基本和最核心的部分,然後在下半部分在開中斷情況下,通過LINUX提供的各種機制來處理(思考: LINUX中斷的底半部分有哪些模式)。

53.請從網卡、USB HOST、LCD驅動器、NAND FLASH、WIFI 、音頻晶片中選擇一個或者2個(可以以具體的晶片為例),對下面的問題做答: 

1)如果是外部擴充晶片,請說出你用的晶片的型号 

2)畫出上題中你標明相應硬體子產品與CPU的主要引腳連線 

3) 編寫上題中你標明相應硬體子產品相應LINUX驅動的流程? 

54,linux驅動分類?

答:Linux裝置驅動的分類

  (1)字元裝置。

  (2) 塊裝置。

  (3) 網絡裝置。

  字元裝置指那些必須以串行順序依次進行通路的裝置,如觸摸屏、錄音帶驅動器、滑鼠等。塊裝置可以用任意順序進行通路,以塊為機關進行操作,如硬碟、軟驅等。字元裝置不經過系統的快速緩沖,而塊裝置經過系統的快速緩沖。但是,字元裝置和塊裝置并沒有明顯的界限,如對于Flash裝置,符合塊裝置的特點,但是我們仍然可以把它作為一個字元裝置來通路。網絡裝置在Linux裡做專門的處理。Linux的網絡系統主要是基于BSD unix的socket 機制。在系統和驅動程式之間定義有專門的資料結構(sk_buff)進行資料的傳遞。系統裡支援對發送資料和接收資料的緩存,提供流量控制機制,提供對多協定的支援。

55,信号量與自旋鎖?

繼續閱讀