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