【原創】關於wince os開發面試的總結系列之驅動

今天對於驅動方面在面試中遇到的問題進行一個簡單的總結,也是一些基本的知識但是會常常用到,所以還是需要引起注意,時常要看看。另外一個就是在驅動中所牽涉到的一些其他的話題,比如非常重要的一個就是電源管理了,電源管理最近也在研究但一直沒有實際操作開發過,HJB最近的一篇博文中也簡單介紹了一下電源管理方面的知識,這裏也擺出來,在面試的時候當然筆試就沒辦法了,面試的時候會提出來,至少我是遇到過。當然還有例如顯示驅動之類的比較複雜的驅動,這些在面試專門的開發崗位的時候可能會細問,這裏由於篇幅有限,我們只對一些基礎通訊類驅動問題進行一個總結和提出,另外對電源管理在這裏多說一些。

-------------------------------------------------------------------------------------------

Q1:驅動程序是幹嘛用的?
A1:驅動程序是一個抽象物理設備或者虛擬設備的功能軟件,驅動程序管理這些設備的操作;

Q2:驅動程序有哪些種類?
A2:一般來分有內建驅動和可安裝驅動,分層和不分層驅動以及本地和流式驅動這幾種分類;(這裏的分層和不分層的驅動就是MDD和PDD昨天的文章中已經對這個概念進行描述了,這裏就不多說,請大家參考上一篇文章中的內容)

Q3:本地驅動和流失驅動各有什麼特點,如何分類?
A3:本地驅動由於它們會使用wince中特定的接口,所以這些設備的接口是特殊定製的,微軟也對每一個本地設備有特別的規定,所以類似於在本地建立一個驅動,所以稱爲本地驅動,很常見的例子比如說顯示驅動就是一個本地驅動,在PB中提供參考實例中,本地驅動的實例有:顯示驅動,鍵盤驅動,觸摸板驅動,指示LED驅動。從這些驅動不難看出,都是在系統中會一直處於運行狀態,從系統開始工作到掉電或者復位都是會處於持續工作狀態。
關於流式驅動也是相對於本地驅動來說的,流式驅動通常有固定的流接口,其通常與文件系統的API配合使用,這些驅動都有固定的接口與應用層程序鏈接,也就是一些固定的文件API函數例如READFILE,WRITEFIEL,CREATEFILE,DEVICEIOCONTROL這些個函數。

Q4:簡單描述下驅動的開發過程,自己編寫的驅動是如何加載到wince系統當中的?
A4:首先我們對開發對象的硬件特性分析,分析完成後我們需要做的是在對於BSP包下的DRIVER目錄下爲我們的驅動建立一個目錄,並在DRIVER文件目錄下的DIR中將其包含,接着我們就可以在我們新建的驅動目錄下進行程序代碼的開發編寫,其中包括驅動程序,source文件,以及makefile文件,驅動程序由開發對象所決定,source文件決定了驅動生成的dll庫的名稱,驅動程序中所需要引用到庫的名稱,所包含源程序文件的名稱,以及一些編譯條件,例如生成文件類型,DLL函數入口等,做完以上的工作可以嘗試對這個目錄進行build,如果無程序錯誤將會生成一個dll文件,這時我們就可以在platform.reg和platform.bib文件中對這個驅動進行加載,reg文件中主要是描述驅動的特徵,如是流驅動則一般建立在buildin註冊表路徑下,同時指名所調用的dll庫名稱,以及其自身的名稱縮寫以及索引等信息,如需要對此驅動進行電源管理,還需要加入ICLASS鍵值,在bib文件中則需要在FILE段將其dll的文件路徑加入,以使的在編譯生成image時加入此dll,到這裏一個驅動的基本開發就基本完成了。當系統啓動時,系統會自動加載其鏡像中包含的設備,對於流驅動來說,當系統啓動以後,首先會去執行XXX_init文件,將設備加載到系統中,用戶可以通過createfile來將設備打開,此時設備將會執行XXX_open將設備打開,當關閉設備時,驅動會執行XXX_close,將設備關閉,同時,需要考慮電源管理時,XXX_POWERUP和XXX_POWERDOWN是兩個比較重要的接口,當系統從掛起狀態到恢復正常狀態時,系統會去執行XXX_POWERUP,而系統進入掛起狀態時,XXX_PWERDOWN會被執行,在這兩個函數中可以對設備進行電源的開啓和關閉,以控制電源,進行電源管理;

Q5:什麼是DMA?
A5:DMA是直接內存訪問的縮寫,在沒有CPU的幫助下,數據從設備移動到內存或者從內存移動到設備的一種方法,DMA可以有兩種方式實現,第一是使用CEDDK函數,另一種是使用內核函數,一般推薦是使用CEDDK來操作。

Q6:簡單描述下一個驅動的電源管理是如何開發實現的?
A6:1.首先在定製系統是加入電源管理的組件,通常只要在Catalog中添加就可以;2.主要是在現有的驅動上添加電源管理的功能。對於流式驅動來說,就是在DeviceIoControl部分添加電源管理的相關消息處理部分,也就是說流驅動主要是在XXX_IOControl中,實現IOCTL_POWER_CAPABILITIES、IOCTL_POWER_QUERY、 IOCTL_POWER_SET和IOCTL_POWER_GET。而內建驅動,例如顯示驅動,就需要直接去調用AdvertiseInterface函數。另外,對於流式驅動來說,上面的問題也提到了需要添加一個ICLASS來聲明本設備需要電源管理。3.通過應用層函數實現對設備的電源管理和控制,主要就是在應用程序中通過調用電源管理的API,協助系統管理各個設備和整個系統的工作狀態。

進一步的參考請查看HJB-we blog http://www.cnblogs.com/we-hjb/archive/2010/01/27/1657973.html

Q7:簡單描述下I2C協議
Q7:I2C協議是由飛利浦公司開發的一種2線協議,I2 C總線在傳送數據過程中共有三種類型信號, 它們分別是:開始信號、結束信號和應答信號。
開始信號:SCL爲高電平時,SDA由高電平向低電平跳變,開始傳送數據。
結束信號:SCL爲低電平時,SDA由低電平向高電平跳變,結束傳送數據。
應答信號:接收數據的IC在接收到8bit數據後,向發送數據的IC發出特定的低電平脈衝,表示已收到數據。CPU向受控單元發出一個信號後,等待受控單元發出一個應答信號,CPU接收到應答信號後,根據實際情況作出是否繼續傳遞信號的判斷。若未收到應答信號,由判斷爲受控單元出現故障。
I2C分讀寫兩種操作,讀操作有三種基本操作:當前地址讀、隨機讀和順序讀。應當注意的是:最後一個讀操作的第9個時鐘週期不是“不關心”。爲了結束讀操作,主機必須在第9個週期間發出停止條件或者在第9個時鐘週期內保持SDA爲高電平、然後發出停止條件。寫操作分爲字節寫和頁面寫兩種操作,對於頁面寫根據芯片的一次裝載的字節不同有所不同。

 

以上是一些通用的問題,都是有還算比較標準的答案,下面的問題可能需要大家自己考慮下了,有的是因爲答案很多,要針對不同的平臺來說,有的是太複雜了,基本上說完天都黑了那種的,大家可以自己去考慮下組織下語言來應對,這裏就不給出來A了,因爲有些我自己都還不是很清楚如何去作答纔算讓考官滿意的,總之有一次面試考官足足面試了1個多小時,wince從驅動到AP所有能問的我感覺都被問到了,實在是傻了,發現自己實在是井底之蛙,還需要繼續努力學習;

Q8:DircetDraw是什麼?
PS.當時考官直接問的是,DircetDraw用過沒?說說看。大家自己找找答案,可以說很久這個問題。

Q9:描述下系統喚醒休眠的過程,系統是如何操作的?
PS.這個問題一般會結合你所操作過的平臺來說,但一般都差不多,有一個GPIO產生中斷之類的信號,系統響應到了以後去執行一系列的休眠動作,比如說關閉一些電源,操作流驅動中的powerdown關閉設備,執行一些彙編的指令關閉時鐘,保留32.768KHZ時鐘,內存如何控制,Flash如何控制,這些按照你實際平臺的情況說一遍就可以了。

Q10:描述一個你開發過的IC驅動,描述下那個IC的特性。
PS.實話實說就可以了

Q11:兩個驅動之間,如果想傳遞數據,一般你會怎麼去處理?
PS.我處理的方式是通過一個AP程序將兩個驅動聯繫起來,通過一個進程互斥機制來控制兩個設備之間數據的傳遞,也就是通過AP申請一個內存空間,兩個設備對數據進行互斥共享,AP負責控制兩個設備獲取數據的條件,控制設備讀取和寫入,這個其實我是實際操作過兩個IC做驅動後互相通訊傳遞數據,中間還用到了一箇中斷來控制數據的讀寫,採用一箇中斷的話數據也就不會出現死等或者獨佔不出來的情況,一方發出數據到內存給出中斷,另一方接到中斷後去讀內存,這樣來互斥。大家也可以考慮下有其他的方法,我這個方法需要有一個硬件的中斷,對硬件有要求;

Q12:MLC是什麼?
PS.我一開始真不知道MLC是什麼,後來回家查了下才知道是flash的一種類型,這個沒弄過就是不知道。也不要不懂裝懂了,老老實實查查以後知道就可以了。不過做這個的現在實在是不知道多不多,CSDN上看過有人討論,但是具體情況也不明;

 

總結到這裏算告一段落,歡迎大家繼續討論,添加一些新的面試例子給大家共享一下。呵呵。祝大家新年快樂。來年步步高昇事業有成!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章