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

          新聞中心

          EEPW首頁(yè) > 汽車電子 > 設(shè)計(jì)應(yīng)用 > 汽車ECU 標(biāo)定系統(tǒng)CCP 軟件的實(shí)現(xiàn)

          汽車ECU 標(biāo)定系統(tǒng)CCP 軟件的實(shí)現(xiàn)

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

            (1)中斷處理程序

            中斷級(jí)程序的程序流程圖如圖 2 所示。首先根據(jù)不同的中斷類別進(jìn)入不同的中斷級(jí)程序。若為接收完成中斷,則清除中斷源,將接收到的消息放入接收緩沖區(qū);將該消息存入接收緩沖區(qū)存入指針?biāo)赶虻牡刂罚瑢⒃撝羔樝蛳乱苿?dòng),接收緩沖區(qū)計(jì)數(shù)器加1,并發(fā)出信號(hào)量通知應(yīng)用程序有新的消息已經(jīng)接收到,若有任務(wù)正在等待 上的新消息,則該任務(wù)進(jìn)入就緒狀態(tài)等待OS 的調(diào)度。

          圖2 中斷級(jí)程序的程序流程圖

            若為發(fā)送完成中斷,則將發(fā)送緩沖區(qū)的待發(fā)送消息讀出;將有待發(fā)送消息且優(yōu)先級(jí)最高的一個(gè)中讀取最舊的消息,發(fā)送緩沖區(qū)計(jì)數(shù)器減1,發(fā)出信號(hào)量通知應(yīng)用程序有一個(gè)消息被發(fā)出,并匯報(bào)當(dāng)前發(fā)送緩沖區(qū)的狀態(tài);還應(yīng)判斷是否為最后一個(gè)待發(fā)送的消息,若不是,則清除中斷源并將消息發(fā)送到上,若是最后一個(gè),則禁止發(fā)送完成中斷后發(fā)送該消息,將這個(gè)發(fā)送完成中斷保留到應(yīng)用程序下一次發(fā)送消息的時(shí)候允許并產(chǎn)生。

           ?。?)底層驅(qū)動(dòng)模塊

            底層驅(qū)動(dòng)模塊主要是為應(yīng)用程序提供了接收和發(fā)送消息的接口函數(shù)。當(dāng)接收消息時(shí)[4],如圖3 實(shí)線所示,應(yīng)用程序在信號(hào)量處等待;收到一個(gè)消息后,ISR從串行端口讀入消息,將其存入環(huán)狀緩沖區(qū)。然后ISR 發(fā)出信號(hào)量,通知在等待串口數(shù)據(jù)的任務(wù)已收到一個(gè)消息。等待任務(wù)收到信號(hào)量后,進(jìn)入就緒狀態(tài),準(zhǔn)備被OS 調(diào)度器激活。當(dāng)內(nèi)核調(diào)度該任務(wù)運(yùn)行時(shí),該任務(wù)從環(huán)狀緩沖區(qū)中取出消息,完成接收消息的過(guò)程。

          圖3 緩沖區(qū)接收發(fā)送消息

            發(fā)送消息的方法如圖3 虛線所示。當(dāng)發(fā)送環(huán)狀緩沖區(qū)已滿時(shí),信號(hào)量作為指示,暫停發(fā)送任務(wù)。為發(fā)送消息,任務(wù)等待信號(hào)量。如果環(huán)狀緩沖區(qū)未滿,則任務(wù)繼續(xù)向環(huán)狀緩沖區(qū)存儲(chǔ)欲發(fā)送的消息。如果存儲(chǔ)的消息是緩沖區(qū)的第一個(gè)字節(jié),則發(fā)送中斷允許,中斷程序準(zhǔn)備啟動(dòng)。 發(fā)送ISR 從環(huán)行緩沖區(qū)中取出最舊的消息,同時(shí)發(fā)送信號(hào)量,通知發(fā)送任務(wù),表明環(huán)狀緩沖區(qū)有空間接收另外的消息。接著ISR 將消息從 端口發(fā)送到上。

            4.2 Driver

            基于實(shí)時(shí)操作系統(tǒng)的 Driver,在這里是通過(guò)Command 處理機(jī)和DAQ 處理機(jī)兩部分來(lái)實(shí)現(xiàn)的。

            Command 處理機(jī)由一個(gè)系統(tǒng)任務(wù)來(lái)完成[5]。該任務(wù)在OS 初始化后就啟動(dòng)運(yùn)行,識(shí)別CAN 網(wǎng)絡(luò)上的 主設(shè)備發(fā)送給該從設(shè)備的會(huì)話命令。根據(jù)命令做相應(yīng)動(dòng)作,并回送命令應(yīng)答,完成會(huì)話。DAQ 處理機(jī)由1~n 個(gè)系統(tǒng)任務(wù)來(lái)完成。本項(xiàng)目支持對(duì)不同時(shí)間要求的監(jiān)視參數(shù)設(shè)定不同的DAQ 周期,不同時(shí)間要求的監(jiān)視參數(shù)填入不同的DAQ_List,每個(gè)DAQ_List 由一個(gè)任務(wù)完成周期發(fā)送。

            Command 處理機(jī)在收到主設(shè)備要求啟動(dòng)某DAQ_List 命令時(shí), 調(diào)用OS 函數(shù)OSTaskCreate()啟動(dòng)相應(yīng)的任務(wù),該任務(wù)每完成一次發(fā)送就調(diào)用OS 函數(shù)OSTimeDlyHMSM( )掛起一定的時(shí)間,這個(gè)時(shí)間就是主設(shè)備對(duì)這個(gè)DAQ_List 要求的發(fā)送周期。在收到主設(shè)備要求停止某DAQ_List 命令時(shí),調(diào)用OS 函數(shù)OSTaskDel( )函數(shù)刪除該任務(wù)。

           ?。?)Command 處理機(jī)

            Command 處理機(jī)主要是獲取并解讀主設(shè)備的CCP 命令,并執(zhí)行該命令;命令執(zhí)行完成后,向主設(shè)備發(fā)送應(yīng)答;若執(zhí)行時(shí)出錯(cuò),應(yīng)答中向主設(shè)備報(bào)錯(cuò);若主設(shè)備命令要求對(duì)DAQ進(jìn)行操作,則將該操作傳達(dá)給DAQ 處理機(jī),由DAQ 處理機(jī)完成DAQ 操作。

            Command 處理機(jī)由一個(gè)RTOS 任務(wù)來(lái)完成,其示意性代碼如下,GetMsg 函數(shù)為CAN 驅(qū)動(dòng)程序的接收消息函數(shù),調(diào)用此函數(shù)則等待獲取CAN 端口接收到的消息幀。一旦接收到新的消息幀則函數(shù)返回,用戶可通過(guò)msg_command 獲取該消息幀的內(nèi)容。

            void task (void * data) {
            for( ; ; ) {
            GetMsg(msg_command); //等待并獲取一個(gè)CCP 命令
            CCP_Command (msg_command); //將命令送給CCP 命令處理函數(shù)
            }
            }

            



          評(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); })();