• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > WindowsCE.Net下基于流驅動的AD驅動設計與實現

    WindowsCE.Net下基于流驅動的AD驅動設計與實現

    作者: 時間:2012-03-24 來源:網絡 收藏

    0 引言

    Windows CE.Net 是一個32位、多任務、多線程的完全搶占式的實時操作系統。它提供了眾多強大工具適應于快速構建新一代內存少、體積小的智能設備,如工業控制器、手持式設備等。該系統的特點是專為各種具有嚴格資源限制的硬件系統所設計的。為了將操作系統和硬件設備連接起來,連接硬件和應用軟件的驅動就非常重要。該論文主要針對SAMSUNG公司以ARM9為內核的S3C2410進行分析,介紹在Windows CE.Net 系統下進行底層設備的原理和開發方法并提供AD驅動程序的實例。

    1 S3C2410芯片片上AD介紹

    S3C2410 是一款基于ARM920T的16/32位RISC微處理器,擁有高性價比,低功耗等特點,也是目前市面上出現較多的嵌入式開發板的處理器之一,具有8路 10位的A/D轉換,S3C2410上的A/D轉換器在2.5MHZ的時鐘下,最大轉化速率可達500KSPS,A/D轉換器支持片上采樣和保持功能。 S3C2410微處理對AD轉換進行的操作,主要是對下面的兩個寄存器進行讀/寫:ADC 控制寄存器,ADCCON ;ADC 數據寄器,ADCDAT0。

    2

    Windows CE.Net 支持四種驅動模型:本地驅動、流驅動、USB、NDIS[1]。本文只針對流驅動進行介紹。

    2.1 體系結構

    流驅動將設備抽象為文件進行操作,它體系結構如圖1所示。應用程序使用文件API對設備進行訪問,文件API被操作系統轉發到FileSys.exe進程中;然后FileSys.exe發現是對設備進行操作,就會把執行交給設備管理器;接著設備管理器根據具體的請求,調用不同的流接口驅動程序中暴露的接口;最終驅動程序負責與硬件交互[2-3]。

    圖1流接口驅動的體系結構

    2.2 流接口函數

    流接口驅動程序是動態連接庫,由設備管理程序的特殊程序加載、管理和卸載,與具有單獨目的接口的內部驅動程序相比,流接口驅動程序使用同一個接口并調用同一個函數集-流接口函數[4]。Windows CE.Net 系統規定流接口的入口點如表1,對應著直接或者間接調用流接口函數的系統組件或文件API函數。生成一個DLL后,就用設備文件名前綴替換入口點名字中的XXX。

    表1 流接口入口函數

    流接口函數

    功能描述

    調用流接口對象

    XXX_Init()

    初始化設備

    系統設備管理器

    XXX_Denit()

    卸載設備

    系統設備管理器

    XXX_Open()

    打開設備進行讀寫操作

    文件API函數CreateFile()

    XXX_Close()

    關閉設備

    文件API函數CloseHandle()

    XXX_Read()

    讀取設備數據

    文件API函數ReadFile()

    XXX_Write()

    向設備寫數據

    文件API函數WriteFile()

    XXX_IOControl()

    對設備進行各種操作

    文件API函數DeviceIOControl()

    XXX_Seek()

    移動設備數據的指針位置

    文件API函數SetFilePointer()

    XXX_PowerDown()

    使設備休眠

    系統電源管理器

    XXX_PowerUp()

    恢復設備電源

    系統電源管理器

    2.3 流接口驅動工作原理

    在流驅動工作原理中需要包括幾個重要的工作實體:硬件、流接口驅動驅動程序、系統注冊表、設備管理器、應用程序。整個驅動程序工作原理如圖2所示。

    流驅動的工作順序如下:1)加載驅動。在當系統啟動時,設備管理器搜尋注冊表的 HKEY_LOCAL_MACHINEDriverBuiltIn鍵下面的子鍵,并逐一加載子鍵下的每個驅動,此過程叫BusEnum。2)設備管理器從注冊表的dll鍵值中獲取驅動程序所在的DLL文件名。3)設備管理器調用LoadDriver()函數把DLL加載到自己的虛擬地址空間內。4)設備管理器在注冊表的HKEY_LOCAL_MACHINEDriverActive下面,記錄所有已經加載的驅動程序[2]。 5)設備管理器調用驅動中的XXX_Init()函數。6)在XXX_Init()中,通常對硬件進行一些基本的初始化操作。通過以上6步,流接口驅動被成功加載。7)應用程序使用該設備。首先它調用CreateFile()打開設備。CreateFile()是在FileSys.exe中實現的。但是 FileSys.exe只作簡單判斷,如果發現打開的程序而不是一個文件,那么就重新把主動權交還給設備管理器。8)設備管理器調用驅動程序中的 XXX_Open()函數打開設備。在XXX_Open()中,驅動程序可能會對硬件進行一些額外的初始化工作,使硬件進入工作狀態。 9)XXX_Open()函數把打開設備的結果返回給設備管理器。10)設備管理器把XXX_Open()返回的結果,再返回給應用程序的 CreateFile()函數調用。通過7-10步,設備已被成功打開,至此就可以對設備進行讀寫和控制操作。11)應用程序使用第7步 CreateFile()函數返回的句柄作為ReadFile() / WriteFile()的第一個參數,向設備發送讀請求。同樣ReadFile() / WriteFile()要經過FileSys.exe轉發給設備管理器。12)設備管理器調用驅動程序中的XXX_Read() / XXX_Write() 函數,讀取設備的數據信息或向設備寫信息。13)在流驅動程序中,XXX_Read() / XXX_Write() 函數可與硬件交互,從硬件中讀取必要的信息或向硬件寫必要的信息。然后返回給設備管理器,再返回給應用程序。


    上一頁 1 2 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 铅山县| 乐陵市| 瑞丽市| 江口县| 盐池县| 蚌埠市| 吉木乃县| 沙洋县| 会昌县| 南宁市| 平南县| 密云县| 北川| 都江堰市| 班玛县| 会同县| 珲春市| 永胜县| 常熟市| 曲松县| 荃湾区| 郁南县| 得荣县| 喀什市| 鄂州市| 湛江市| 营山县| 青岛市| 绍兴市| 嘉义市| 昌江| 太康县| 石城县| 庄浪县| 威海市| 阿拉尔市| 丰顺县| 涟源市| 阳谷县| 青岛市| 庄河市|