<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于S3C2440處理器和WinCE的智能車載儀表設(shè)計(jì)

          基于S3C2440處理器和WinCE的智能車載儀表設(shè)計(jì)

          作者: 時(shí)間:2013-12-31 來(lái)源:網(wǎng)絡(luò) 收藏

            3 軟件設(shè)計(jì)

            軟件的整體環(huán)境為編程環(huán)境。針對(duì)本車載智能儀表硬件系統(tǒng)定制相應(yīng)的操作系統(tǒng),實(shí)現(xiàn)對(duì)硬件的驅(qū)動(dòng)。再編寫應(yīng)用程序,通過(guò)對(duì)應(yīng)用程序的具體操作實(shí)現(xiàn)對(duì)系統(tǒng)硬件的操作,即實(shí)現(xiàn)系統(tǒng)的功能。其中非常關(guān)鍵的是編寫CAN控制器的驅(qū)動(dòng)。CAN 驅(qū)動(dòng)實(shí)現(xiàn)應(yīng)用軟件對(duì)CAN控制單元的操作,以及讀取CAN控制單元中的數(shù)據(jù)代碼。

            3.1 系統(tǒng)開(kāi)發(fā)和移植

            嵌入式系統(tǒng)開(kāi)發(fā)就是系統(tǒng)驅(qū)動(dòng)層的設(shè)計(jì),其中最主要就是BSP的開(kāi)發(fā)和調(diào)試。所以底層驅(qū)動(dòng)的開(kāi)發(fā)就顯得尤為重要。

            由于使用的是操作系統(tǒng),所以使用Platform Builder定制WinCE操作系統(tǒng)鏡像。在Platform Builder中,可以添加系統(tǒng)部分硬件(如液晶屏、RAM)的驅(qū)動(dòng),這些驅(qū)動(dòng)已經(jīng)由微軟公司編寫好。然后啟動(dòng)Bootloader,把鏡像文件下載到 Flash存儲(chǔ)器中,并配置操作系統(tǒng)啟動(dòng)文件boot.ini.

            3.2 CAN總線驅(qū)動(dòng)開(kāi)發(fā)

            由于CAN是外部設(shè)備,所以需要將CAN的驅(qū)動(dòng)以流接口驅(qū)動(dòng)方式編寫。流接口驅(qū)動(dòng)函數(shù)被設(shè)計(jì)來(lái)與通常的文件系統(tǒng)API(如ActivateDevice、ReadFile、WriteFile和IOControl等)緊密匹配,即流接口驅(qū)動(dòng)在應(yīng)用程序中表現(xiàn)為一個(gè)系統(tǒng)文件,應(yīng)用程序通過(guò)對(duì)系統(tǒng)文件的特殊文件進(jìn)行操作從而完成對(duì)設(shè)備的操作。編寫流接口文件主要用到流接口函數(shù),也就是流接口驅(qū)動(dòng)的入口點(diǎn),如XXX_Init、XXX_Read和XXX_Open等。這些流接口文件與相應(yīng)的API函數(shù)對(duì)應(yīng),使應(yīng)用程序由相應(yīng)的函數(shù)可以訪問(wèn)到外部設(shè)備。

            作為流接口驅(qū)動(dòng)程序,CAN總線驅(qū)動(dòng)程序也有一組標(biāo)準(zhǔn)函數(shù),可完成I/O操作。這些函數(shù)提供給WinCE操作系統(tǒng)內(nèi)核使用,它們都是流接口驅(qū)動(dòng)程序的DLL文件。動(dòng)態(tài)加載CAN總線驅(qū)動(dòng)程序時(shí),系統(tǒng)要進(jìn)行注冊(cè)。CAN驅(qū)動(dòng)程序注冊(cè)表信息:

            WCHAR * szRegKey=L“DriversBuiltInCAN”;

            WCHAR * szPrefix=L“CAN”;

            WCHAR * szDLL=L“can.dll”;

            WCHAR * szFriendlyName=L“CANDriver”;

            DWORD * DrvIndex=1;

            DWORD * DrvOrder=0;

            通過(guò)以上代碼完成注冊(cè)之后,調(diào)用 ActivateDeviceEx()函數(shù)進(jìn)行加載驅(qū)動(dòng)。

            3.3 CAN總線驅(qū)動(dòng)通信流程

            CAN總線控制器驅(qū)動(dòng)程序主要用于設(shè)置MCP2515的波特率、MCP2515的驗(yàn)收過(guò)濾器、CAN消息傳送模式和CAN收發(fā)數(shù)據(jù)方式。驅(qū)動(dòng)程序是連接上位應(yīng)用程序和硬件的一個(gè)中間紐帶。系統(tǒng)在EVC++環(huán)境下進(jìn)行CAN總線開(kāi)發(fā)。

            流式驅(qū)動(dòng)以文件的方式打開(kāi)函數(shù)CreateFile( ):驅(qū)動(dòng)成功打開(kāi)后,CreateFile( )函數(shù)返回不為INVALID?HANDLE?VALUE的句柄,此句柄也是關(guān)閉驅(qū)動(dòng)函數(shù)CloseHandle( )的參數(shù)。CAN設(shè)置函數(shù)DeviceIoControl( )接收由CreateFile( )函數(shù)獲得的句柄及控制命令碼,設(shè)置輸入/輸出緩沖區(qū)以及緩沖區(qū)的大小。函數(shù)執(zhí)行完成后返回實(shí)際輸出的緩沖區(qū)大小等。CAN總線發(fā)送與接收函數(shù) WriteFile( )和ReadFile( ),利用驅(qū)動(dòng)文件句柄、發(fā)送和接收緩沖區(qū)等參數(shù)完成數(shù)據(jù)的發(fā)送和接收,操作成功后返回實(shí)際發(fā)送和接收的字節(jié)數(shù)。

            為了不讓主線程一直處于等待數(shù)據(jù)到來(lái)的狀態(tài),讓主線程擁有時(shí)間令牌來(lái)操作其他事情,程序采用多線程設(shè)計(jì),創(chuàng)建一個(gè)接收數(shù)據(jù)線程。接收數(shù)據(jù)線程是一個(gè)無(wú)限循環(huán),它不斷查詢CAN總線數(shù)據(jù)退出標(biāo)志,如果退出標(biāo)志有效,則該循環(huán)結(jié)束退出。驅(qū)動(dòng)程序流程如圖3所示。

            CAN總線驅(qū)動(dòng)通信流程

            圖3 CAN總線驅(qū)動(dòng)通信流程

            結(jié)語(yǔ)

            目前,基于嵌入式技術(shù)的車載儀表逐漸開(kāi)始流行。本文使用基于WinCE的ARM9微處理器作為開(kāi)發(fā)平臺(tái),處理速度快,功能強(qiáng)大;使用CAN總線技術(shù)進(jìn)行信號(hào)的相互傳輸,CAN總線實(shí)時(shí)接收汽車部件發(fā)送來(lái)的信息,并進(jìn)行處理與分析;使用WinCE操作系統(tǒng),界面友好。本系統(tǒng)可以節(jié)約成本、降低功耗,并且可維護(hù)性強(qiáng),便于擴(kuò)展和升級(jí)。


          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞: S3C2440 WinCE 智能車載儀表

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();