基于LPC2119和μC/OSII 的CAN中繼器設(shè)計(jì)
2.3 系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)
嵌入式CAN中繼器主要實(shí)現(xiàn)兩路CAN總線數(shù)據(jù)之間相互轉(zhuǎn)發(fā),并且可以根據(jù)實(shí)際需要,改變某一路CAN控制器的波特率。采用μC/OSII實(shí)時(shí)操作系統(tǒng),整個(gè)設(shè)計(jì)由操作系統(tǒng)和一系列用戶應(yīng)用程序構(gòu)成。
主函數(shù)是程序首先執(zhí)行的一個(gè)函數(shù)。該函數(shù)永遠(yuǎn)不會(huì)返回,主要實(shí)現(xiàn)系統(tǒng)的硬件和操作系統(tǒng)的初始化。硬件包括中斷、鍵盤、顯示等初始化;操作系統(tǒng)包括任務(wù)控制快和事件控制快的初始化,而且在啟動(dòng)多任務(wù)調(diào)度之前,必須至少創(chuàng)建一個(gè)任務(wù)。在此系統(tǒng)中創(chuàng)建了一個(gè)啟動(dòng)任務(wù),主要負(fù)責(zé)時(shí)鐘的初始化和啟動(dòng),中斷的啟動(dòng),CAN控制器的初始化及啟動(dòng)及任務(wù)的劃分等。在交出CPU的使用權(quán)之后,只做一些空閑處理。
(1) 任務(wù)的劃分
要完成實(shí)時(shí)多任務(wù)的各種功能,必須對(duì)任務(wù)進(jìn)行劃分。本程序根據(jù)各個(gè)任務(wù)的重要性和實(shí)時(shí)性,把程序分成六個(gè)具有不同優(yōu)先級(jí)的任務(wù),包括系統(tǒng)監(jiān)控、數(shù)據(jù)轉(zhuǎn)發(fā)、鍵盤輸入、LED顯示、接收隊(duì)列監(jiān)視和波特率設(shè)置。表1為任務(wù)劃分表。
除了6個(gè)主要應(yīng)用任務(wù)之外,還有兩個(gè)中斷服務(wù)子程序:一個(gè)時(shí)鐘節(jié)拍中斷,用于提供周期性信號(hào)源;一個(gè)CAN接收中斷,用于把接收數(shù)據(jù)寫入環(huán)形緩沖區(qū)。
(2) 任務(wù)的同步與調(diào)度
通常多任務(wù)操作系統(tǒng)的任務(wù)不同于一般的函數(shù),它是一個(gè)無限循環(huán),而且沒有返回值。如果沒有更高優(yōu)先級(jí)的任務(wù)進(jìn)入就緒態(tài),當(dāng)前任務(wù)是不會(huì)放棄對(duì)CPU的使用權(quán)的。為了實(shí)現(xiàn)操作系統(tǒng)的正常運(yùn)行和有關(guān)事件的同步,必須正確處理任務(wù)間的通信和事件標(biāo)志的設(shè)置。整個(gè)系統(tǒng)的功能結(jié)構(gòu)如圖2所示。
圖2系統(tǒng)功能結(jié)構(gòu)
各個(gè)任務(wù)具有不同的優(yōu)先級(jí),通過調(diào)用系統(tǒng)掛起函數(shù)或延時(shí)函數(shù),可以啟動(dòng)具有更高優(yōu)先級(jí)的進(jìn)入就緒態(tài)的任務(wù)。在嵌入式CAN中繼器的設(shè)計(jì)中,通過對(duì)延時(shí)參數(shù)的設(shè)置,系統(tǒng)每隔一定的時(shí)鐘節(jié)拍,就啟動(dòng)接收隊(duì)列監(jiān)視任務(wù),定期掃描環(huán)形緩沖區(qū)。一旦發(fā)現(xiàn)讀指針與寫指針不相等時(shí),就將環(huán)形緩沖區(qū)中新接收到的數(shù)據(jù)存入TEMPBUF中,同時(shí)發(fā)送信號(hào)量SendSem。數(shù)據(jù)轉(zhuǎn)發(fā)任務(wù)接收到信號(hào)量,啟動(dòng)運(yùn)行,完成數(shù)據(jù)轉(zhuǎn)發(fā)功能。
數(shù)據(jù)轉(zhuǎn)發(fā)任務(wù)如下:void CANDATA_ExchangeTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3/* 給CPU狀態(tài)寄存器分配存儲(chǔ)器*/
OS_CPU_SRcpu_sr;
#endif
INT8U err;
pdata=pdata;/*避免編譯器警告*/
for(;;) {
OSSemPend (SendSem,0,err);/*等待發(fā)送信號(hào)量,若無信號(hào)則將本函數(shù)掛起,并啟動(dòng)其他任務(wù),如系統(tǒng)監(jiān)控或鍵盤輸入或LED顯示等*/
if (CANNUM == CAN1) {/*判斷是哪一路總線接收到數(shù)據(jù),如是CAN1,則向CAN2發(fā)送數(shù)據(jù)*/
ToSendData (TEMPBUF,FORTXBUF );/*將存放在TEMPBUF中的數(shù)據(jù)轉(zhuǎn)換成可用于發(fā)送的數(shù)據(jù)格式,存放在FORTXBUF中*/
CanSendData (CAN2,0x00,FORTXBUF);/*向另一路總線發(fā)送數(shù)據(jù)*/
}
else {
ToSendData (TEMPBUF,FORTXBUF );
CanSendData (CAN1,0x00,TXBUF);
}
}
}同樣,其他模塊功能——波特率的設(shè)置、系統(tǒng)的監(jiān)控、信息的顯示等,也是通過任務(wù)間的通信—信號(hào)量的傳遞來實(shí)現(xiàn)的,以此來保證時(shí)間與任務(wù)的同步。
結(jié)語
μC/OSII實(shí)時(shí)操作系統(tǒng)在嵌入式硬件平臺(tái)的基礎(chǔ)上,用μC/OSII實(shí)時(shí)操作系統(tǒng)開發(fā)應(yīng)用程序有其獨(dú)到之處,用戶可以直接利用系統(tǒng)的接口函數(shù)編寫自己的應(yīng)用程序,不需另行開發(fā),大大方便了用戶編程,縮短了軟件的開發(fā)周期,提高了開發(fā)效率?;?mu;C/OSII和LPC2119的CAN中繼器,在實(shí)驗(yàn)調(diào)試過程中,運(yùn)行狀況良好,工作穩(wěn)定。
評(píng)論