新聞中心

EEPW首頁 > 汽車電子 > 設計應用 > 汽車ECU 標定系統(tǒng)CCP 軟件的實現(xiàn)

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

作者: 時間:2010-07-17 來源:網(wǎng)絡 收藏

 ?。?)中斷處理程序

  中斷級程序的程序流程圖如圖 2 所示。首先根據(jù)不同的中斷類別進入不同的中斷級程序。若為接收完成中斷,則清除中斷源,將接收到的消息放入接收緩沖區(qū);將該消息存入接收緩沖區(qū)存入指針所指向的地址,將該指針向下移動,接收緩沖區(qū)計數(shù)器加1,并發(fā)出信號量通知應用程序有新的消息已經(jīng)接收到,若有任務正在等待 上的新消息,則該任務進入就緒狀態(tài)等待OS 的調度。

圖2 中斷級程序的程序流程圖

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

  (2)底層驅動模塊

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

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

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

  4.2 Driver

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

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

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

 ?。?)Command 處理機

  Command 處理機主要是獲取并解讀主設備的CCP 命令,并執(zhí)行該命令;命令執(zhí)行完成后,向主設備發(fā)送應答;若執(zhí)行時出錯,應答中向主設備報錯;若主設備命令要求對DAQ進行操作,則將該操作傳達給DAQ 處理機,由DAQ 處理機完成DAQ 操作。

  Command 處理機由一個RTOS 任務來完成,其示意性代碼如下,GetMsg 函數(shù)為CAN 驅動程序的接收消息函數(shù),調用此函數(shù)則等待獲取CAN 端口接收到的消息幀。一旦接收到新的消息幀則函數(shù)返回,用戶可通過msg_command 獲取該消息幀的內容。

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

  



評論


相關推薦

技術專區(qū)

關閉