汽車ECU 標定系統CCP 軟件的實現
(1)中斷處理程序
中斷級程序的程序流程圖如圖 2 所示。首先根據不同的中斷類別進入不同的中斷級程序。若為接收完成中斷,則清除中斷源,將接收到的消息放入接收緩沖區;將該消息存入接收緩沖區存入指針所指向的地址,將該指針向下移動,接收緩沖區計數器加1,并發出信號量通知應用程序有新的消息已經接收到,若有任務正在等待CAN 上的新消息,則該任務進入就緒狀態等待OS 的調度。
圖2 中斷級程序的程序流程圖
若為發送完成中斷,則將發送緩沖區的待發送消息讀出;將有待發送消息且優先級最高的一個中讀取最舊的消息,發送緩沖區計數器減1,發出信號量通知應用程序有一個消息被發出,并匯報當前發送緩沖區的狀態;還應判斷是否為最后一個待發送的消息,若不是,則清除中斷源并將消息發送到總線上,若是最后一個,則禁止發送完成中斷后發送該消息,將這個發送完成中斷保留到應用程序下一次發送消息的時候允許并產生。
?。?)底層驅動模塊
底層驅動模塊主要是為應用程序提供了接收和發送消息的接口函數。當接收消息時[4],如圖3 實線所示,應用程序在信號量處等待;收到一個消息后,ISR從串行端口讀入消息,將其存入環狀緩沖區。然后ISR 發出信號量,通知在等待串口數據的任務已收到一個消息。等待任務收到信號量后,進入就緒狀態,準備被OS 調度器激活。當內核調度該任務運行時,該任務從環狀緩沖區中取出消息,完成接收消息的過程。
圖3 緩沖區接收發送消息
發送消息的方法如圖3 虛線所示。當發送環狀緩沖區已滿時,信號量作為指示,暫停發送任務。為發送消息,任務等待信號量。如果環狀緩沖區未滿,則任務繼續向環狀緩沖區存儲欲發送的消息。如果存儲的消息是緩沖區的第一個字節,則發送中斷允許,中斷程序準備啟動。CAN 發送ISR 從環行緩沖區中取出最舊的消息,同時發送信號量,通知發送任務,表明環狀緩沖區有空間接收另外的消息。接著ISR 將消息從CAN 端口發送到總線上。
4.2 CCP Driver
基于實時操作系統的CCP Driver,標定系統在這里是通過Command 處理機和DAQ 處理機兩部分來實現的。
Command 處理機由一個系統任務來完成[5]。該任務在OS 初始化后就啟動運行,識別CAN 網絡上的CCP 主設備發送給該從設備的會話命令。根據命令做相應動作,并回送命令應答,完成會話。DAQ 處理機由1~n 個系統任務來完成。本項目支持對不同時間要求的監視參數設定不同的DAQ 周期,不同時間要求的監視參數填入不同的DAQ_List,每個DAQ_List 由一個任務完成周期發送。
Command 處理機在收到主設備要求啟動某DAQ_List 命令時, 調用OS 函數OSTaskCreate()啟動相應的任務,該任務每完成一次發送就調用OS 函數OSTimeDlyHMSM( )掛起一定的時間,這個時間就是主設備對這個DAQ_List 要求的發送周期。在收到主設備要求停止某DAQ_List 命令時,調用OS 函數OSTaskDel( )函數刪除該任務。
?。?)Command 處理機
Command 處理機主要是獲取并解讀主設備的CCP 命令,并執行該命令;命令執行完成后,向主設備發送應答;若執行時出錯,應答中向主設備報錯;若主設備命令要求對DAQ進行操作,則將該操作傳達給DAQ 處理機,由DAQ 處理機完成DAQ 操作。
Command 處理機由一個RTOS 任務來完成,其示意性代碼如下,GetMsg 函數為CAN 驅動程序的接收消息函數,調用此函數則等待獲取CAN 端口接收到的消息幀。一旦接收到新的消息幀則函數返回,用戶可通過msg_command 獲取該消息幀的內容。
void task (void * data) {
for( ; ; ) {
GetMsg(msg_command); //等待并獲取一個CCP 命令
CCP_Command (msg_command); //將命令送給CCP 命令處理函數
}
}
評論