基于LPC2292的汽車智能組合儀表設(shè)計
每個任務(wù)在建立時均分配一個優(yōu)先級(范圍為0 ~63, 0為最高,63為最低)。這6個任務(wù)的優(yōu)先級依次分配為1, 2, 3, 4, 5, 6;報警任務(wù)需要及時響應(yīng),具有最高的優(yōu)先級;而里程顯示、存儲任務(wù)優(yōu)先級最低。較高優(yōu)先級的任務(wù)必須調(diào)用至少一項系統(tǒng)服務(wù)而暫時放棄CPU的使用權(quán),否則低優(yōu)先級任務(wù)無法得到運行。
任務(wù)的一般結(jié)構(gòu)如下:
void UserTask (void *pdata)
{ for(;;)
{調(diào)用μC /OS II的某種系統(tǒng)服務(wù):
OSMboxPend ( )/OSMboxPost ( );(1)
OSQPend ( )/OSQPost ( ); (2)
OSSemPend ( )/OSSemPend ( ): (3)
OSTaskDel (OS PRIG SELF);(4)
OSTaskSuspend (OS_ PR工OSELF); (5)
OSTimeDly( )/OSTimeDlyHMSM(); (6)
}}
(1)-(6)是一些主要的系統(tǒng)服務(wù)函數(shù),這些函數(shù)里均進行一次任務(wù)調(diào)度,或者可能會使當前任務(wù)放棄CPU使用權(quán)而運行其他的任務(wù)。用戶任務(wù)必須至少調(diào)用一個服務(wù)函數(shù)。
另外程序還有5個用C語言編寫的用戶中斷服務(wù)程序:一個CAN接收中斷(用于接收總線信息)、4個定時器輸出比較中斷(用于產(chǎn)生驅(qū)動步進電機的周期性脈沖)。
因此本例程序可以這樣規(guī)劃,首先調(diào)用OSInit(),對μC /OS-II做初始化,然后創(chuàng)建一個信號量,因為后面的任務(wù)都要用到Printp( )函數(shù),而Printp( )是一個不可重入函數(shù),調(diào)用前要防止多個任務(wù)同時調(diào)用,這個信號量用于保護Printp()函數(shù)。接著創(chuàng)建6個任務(wù),并對這6個任務(wù)分配優(yōu)先級,最后調(diào)用OSStart ( )以啟動內(nèi)核,于是任務(wù)在操作系統(tǒng)的管理和調(diào)度下運行和切換。圖2是程序的簡要流程圖。
圖2 程序流程圖
4 結(jié)束語
隨著汽車電氣系統(tǒng)的總線化,高集成、嵌入式、總線化是汽車儀表發(fā)展的必然趨勢。基于LPC2292的汽車智能組合儀表,實時顯示和保存車速、發(fā)動機轉(zhuǎn)速、水溫、油位、總里程、子里程等車況參數(shù),使汽車具有“黑匣子”功能。并且采用CAN總線建立通信網(wǎng)絡(luò),集車輛儀表、視頻監(jiān)控、語音輸出于一體,解決了分開安裝不便、可靠性差的缺陷,提高了系統(tǒng)的可靠性。
評論