基于S3C2440處理器和WinCE的智能車載儀表設計
3 軟件設計
軟件的整體環境為WinCE編程環境。針對本車載智能儀表硬件系統定制相應的WinCE操作系統,實現對硬件的驅動。再編寫應用程序,通過對應用程序的具體操作實現對系統硬件的操作,即實現系統的功能。其中非常關鍵的是編寫CAN控制器的驅動。CAN 驅動實現應用軟件對CAN控制單元的操作,以及讀取CAN控制單元中的數據代碼。
3.1 系統開發和移植
嵌入式系統開發就是系統驅動層的設計,其中最主要就是BSP的開發和調試。所以智能車載儀表底層驅動的開發就顯得尤為重要。
由于使用的是WinCE操作系統,所以使用Platform Builder定制WinCE操作系統鏡像。在Platform Builder中,可以添加系統部分硬件(如液晶屏、RAM)的驅動,這些驅動已經由微軟公司編寫好。然后啟動Bootloader,把鏡像文件下載到 Flash存儲器中,并配置操作系統啟動文件boot.ini.
3.2 CAN總線驅動開發
由于CAN是外部設備,所以需要將CAN的驅動以流接口驅動方式編寫。流接口驅動函數被設計來與通常的文件系統API(如ActivateDevice、ReadFile、WriteFile和IOControl等)緊密匹配,即流接口驅動在應用程序中表現為一個系統文件,應用程序通過對系統文件的特殊文件進行操作從而完成對設備的操作。編寫流接口文件主要用到流接口函數,也就是流接口驅動的入口點,如XXX_Init、XXX_Read和XXX_Open等。這些流接口文件與相應的API函數對應,使應用程序由相應的函數可以訪問到外部設備。
作為流接口驅動程序,CAN總線驅動程序也有一組標準函數,可完成I/O操作。這些函數提供給WinCE操作系統內核使用,它們都是流接口驅動程序的DLL文件。動態加載CAN總線驅動程序時,系統要進行注冊。CAN驅動程序注冊表信息:
WCHAR * szRegKey=L“DriversBuiltInCAN”;
WCHAR * szPrefix=L“CAN”;
WCHAR * szDLL=L“can.dll”;
WCHAR * szFriendlyName=L“CANDriver”;
DWORD * DrvIndex=1;
DWORD * DrvOrder=0;
通過以上代碼完成注冊之后,調用 ActivateDeviceEx()函數進行加載驅動。
3.3 CAN總線驅動通信流程
CAN總線控制器驅動程序主要用于設置MCP2515的波特率、MCP2515的驗收過濾器、CAN消息傳送模式和CAN收發數據方式。驅動程序是連接上位應用程序和硬件的一個中間紐帶。智能車載儀表系統在EVC++環境下進行CAN總線開發。
流式驅動以文件的方式打開函數CreateFile( ):驅動成功打開后,CreateFile( )函數返回不為INVALID?HANDLE?VALUE的句柄,此句柄也是關閉驅動函數CloseHandle( )的參數。CAN設置函數DeviceIoControl( )接收由CreateFile( )函數獲得的句柄及控制命令碼,設置輸入/輸出緩沖區以及緩沖區的大小。函數執行完成后返回實際輸出的緩沖區大小等。CAN總線發送與接收函數 WriteFile( )和ReadFile( ),利用驅動文件句柄、發送和接收緩沖區等參數完成數據的發送和接收,操作成功后返回實際發送和接收的字節數。
為了不讓主線程一直處于等待數據到來的狀態,讓主線程擁有時間令牌來操作其他事情,程序采用多線程設計,創建一個接收數據線程。接收數據線程是一個無限循環,它不斷查詢CAN總線數據退出標志,如果退出標志有效,則該循環結束退出。驅動程序流程如圖3所示。
圖3 CAN總線驅動通信流程
結語
目前,基于嵌入式技術的車載儀表逐漸開始流行。本文使用基于WinCE的ARM9微處理器作為開發平臺,處理速度快,功能強大;使用CAN總線技術進行信號的相互傳輸,CAN總線實時接收汽車部件發送來的信息,并進行處理與分析;使用WinCE操作系統,界面友好。本智能車載儀表系統可以節約成本、降低功耗,并且可維護性強,便于擴展和升級。
評論