車輛前照燈控制系統(tǒng)實驗_第1頁
車輛前照燈控制系統(tǒng)實驗_第2頁
車輛前照燈控制系統(tǒng)實驗_第3頁
車輛前照燈控制系統(tǒng)實驗_第4頁
車輛前照燈控制系統(tǒng)實驗_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、一、實驗?zāi)康?)利用實驗平臺,模擬車輛照明控制系統(tǒng)工作2)學(xué)習嵌入式系統(tǒng)的裁剪與定制3)熟悉AD轉(zhuǎn)換器,鍵盤等設(shè)備的操作4)熟悉基于消息循環(huán)的事件處理機制5)理解操作系統(tǒng)對于嵌入式系統(tǒng)的意義二、本課題選題背景及國內(nèi)外研究動態(tài)(一)選題背景20世紀90年代中期以后,LED作為汽車尾燈已經(jīng)被人們廣泛接受。近年來,隨著LED亮度的逐漸增加,2003年高亮度LuxeonTM的市場投放,使LED開始在汽車前照燈領(lǐng)域嶄露頭角,它以體積小、壽命長、環(huán)保、聚焦距離短等優(yōu)勢受到人們普遍的關(guān)注和青睞。然而,氙氣和LED前照燈技術(shù)只能工作在一種模式下,即一種固定的類型下。但是,實際道路使用狀況、環(huán)境狀況、氣候狀況等

2、情況非常復(fù)雜。數(shù)據(jù)分析顯示,在夜間發(fā)生車禍的數(shù)量是白天車禍數(shù)量的兩倍,為了在夜間或者是惡劣天氣下能達到更好的視覺效果,要求前照燈光線隨著不同的駕駛環(huán)境而改變。這就需要設(shè)計一種靈活的前照燈系統(tǒng)。傳統(tǒng)的前照燈系統(tǒng)是由:近光燈、遠光燈、行駛燈和前霧燈組合而成。在城市道路行駛并且限速的情況下,主要采用近光;在鄉(xiāng)間道路或者高速公路上高速行駛的時候,主要采用遠光;霧天行駛的時候,應(yīng)該打開霧燈;白天行駛,應(yīng)該打開行駛燈(歐洲標準)。但是實際的使用中,傳統(tǒng)的前照燈系統(tǒng)存在著諸多問題。例如,現(xiàn)有近光燈在近距離上的照明效果很不好,特別是在交通狀況比較復(fù)雜的市區(qū),經(jīng)常會有很多司機在晚上將近光燈、遠光燈和前霧燈統(tǒng)統(tǒng)打

3、開;車輛在轉(zhuǎn)彎的時候也存在照明的暗區(qū),嚴重影響了司機對彎道上障礙的判斷;車輛在雨天行駛的時候,地面積水反射前燈的光線,產(chǎn)生反射眩光等等。歐洲汽車照明研究機構(gòu)曾經(jīng)就此作過做專項調(diào)查,結(jié)果顯示,歐洲司機們最希望改善的是陰雨天氣積水路面的照明,排在第二位的是鄉(xiāng)村公路的照明,接下來依次是彎道照明、高速公路照明和市區(qū)照明。上述這些問題的存在,就使得研制一種具有多種照明功能的前照燈成為必要,并且這些功能的切換,出于安全上的考慮,必須是自動實現(xiàn)的。所以歐洲和日本相繼研制了這種自動適應(yīng)車輛行駛狀態(tài)的前照燈系統(tǒng)AFS(自適應(yīng)前照燈系統(tǒng))。(二)國內(nèi)外研究現(xiàn)狀目前,在汽車前照燈的標準方面有歐洲標準和美國標準,兩者

4、主要在近光配光上有較大的差別。歐洲標準特別注重對眩光的控制,因此在其配光上存在15°的截止線,并且照度也比較低。在美國,道路大多比較寬闊,因此對眩光沒什么特別的要求,只要前照燈能夠照得更遠更亮就可以了。隨著經(jīng)濟全球化進程的加快,人們迫切要求消除這2種標準之間的差別,建立一個統(tǒng)一的國際標準。一種方法是將兩種標準中合理的部分綜合起來形成一個雙方都能接受的標準;另外一種方法是建立一個包括多種功能的前照燈系統(tǒng),它能根據(jù)不同的路況、天氣而采用不同的照明方式,這就是AFS系統(tǒng)。對于AFS前照燈系統(tǒng)的研究在國外已經(jīng)取得了很大進展,日趨成熟。日本、歐洲等國的知名汽車制造商都紛紛推出自己的AFS,在高

5、檔轎車中標配AFS的同時,將其在中檔甚至中低檔轎車車型中作為選配列出。比如奧迪A8,寶馬5系,梅塞德斯CLS、E系、M系,大眾B6,雷克薩斯RX330,豐田皇冠等等。在國外,AFS已經(jīng)得到廣泛應(yīng)用,而國內(nèi)在這方面的研究還比較少。引進的AFS大多考慮生產(chǎn)商本國道路狀況,而國內(nèi)的道路狀況與日本和歐洲有較大不同,因此AFS并不能發(fā)揮最大的作用,對AFS在國內(nèi)的應(yīng)用帶來了阻力。國內(nèi)上海小糸公司已經(jīng)對天津豐田銳志AFS前照燈完成了國產(chǎn)化開發(fā)工作,用于新款豐田佳美AFS前照燈系統(tǒng)業(yè)已完成,但其主要是以技術(shù)引進為主。(三)AFS系統(tǒng)綜述1、AFS系統(tǒng)組成動態(tài)照明系統(tǒng)這一概念是20世紀90年代初提出的,經(jīng)過1

6、0多年的發(fā)展,智能化自適應(yīng)前照燈照明系統(tǒng)AFS正式亮相。該系統(tǒng)可以根據(jù)汽車行駛的速度、偏離速率以及轉(zhuǎn)向角等表示汽車運動狀態(tài)的參量來計算照明的方式。隨著2003年靜態(tài)轉(zhuǎn)彎照明系統(tǒng)在歐洲汽車市場上的投放,2004開始嘗試引入動態(tài)轉(zhuǎn)彎照明系統(tǒng),并很快受到歡迎和推廣。這種系統(tǒng)尤其在城鎮(zhèn)、鄉(xiāng)村、高速公路等不同復(fù)雜路況條件下以及惡劣天氣中的應(yīng)用,將有益于駕駛安全性的提高。AFS系統(tǒng)是由傳感器組、傳輸通路、電控單元和執(zhí)行機構(gòu)組成。由于需要對多種車輛行駛狀態(tài)做出綜合判斷,因此AFS系統(tǒng)是一個多輸入多輸出的復(fù)雜的系統(tǒng)。其主要部分包括:(1)前照燈鹵素車燈、HID燈或LED燈等。(2)傳感器包括角度傳感器和速度傳

7、感等。隨著速度和方向盤角度的改變,車身高度和傾斜度也會隨之改變,傳感器將這些參數(shù)的變化通過CAN(controller area network)總線傳輸給電控單元(ECU),電子控制單元收集所有傳感器傳來的數(shù)據(jù)控制執(zhí)行電機,在理論上給出最合理的光分布,用來改善燈光照明。(3)霧探測器該探測器能應(yīng)用在惡劣天氣尤其是濃霧條件下,給出真實的實際可視距離。自動霧探測器可根據(jù)霧濃度大小給出正確的判斷,并調(diào)整照明方式,以適應(yīng)惡劣天氣,提高霧天駕駛的安全性。(4)夜間可視系統(tǒng)作為一個獨立的可視增強系統(tǒng),該系統(tǒng)主要分為遠紅外線和近紅外線兩種特性,這兩種都能應(yīng)用在支持夜間可視的前照燈系統(tǒng)中。作為一個綜合系統(tǒng),

8、可視光源和紅外線的綜合應(yīng)用能夠識別障礙物、步行者和其他物品。2、AFS系統(tǒng)功能(1)陰雨天氣的照明:陰雨天氣,地面的積水會將行駛車輛打在地面上的光線,反射至對面會車司機的眼睛中,使其目眩,進而可能造成交通事故。AFS有效的解決方法是:前燈發(fā)出特殊光型,減弱地面可能對會車產(chǎn)生眩光的區(qū)域的光強。(2)轉(zhuǎn)彎道路的照明:傳統(tǒng)前燈的光線因為和車輛行駛方向保持著一致,所以不可避免的存在照明的暗區(qū)。一旦在彎道上存在障礙物,極易因為司機對其準備不足,引發(fā)交通事故。AFS解決的方法是:車輛在進入彎道時,產(chǎn)生旋轉(zhuǎn)的光型,給彎道以足夠的照明。(3)高速公路的照明:車輛在高速公路上行駛,因為具有極高的車速,所以需要前

9、照燈比鄉(xiāng)村道路照得更遠,照得更寬。而傳統(tǒng)的前燈卻存在著高速公路上照明不足的問題,如圖5所示。AFS采用了更為寬廣的光型解決這一問題。(4)城市道路的照明:城市中道路復(fù)雜、狹窄。傳統(tǒng)前照燈近光如圖7所示,因為光型比較狹長,所以不能滿足城市道路照明的要求。AFS在考慮到車輛市區(qū)行駛速度受到限制的情況下,可以產(chǎn)生比較寬闊的光型,有效地避免了與岔路中突然出現(xiàn)的行人、車輛可能發(fā)生的交通事故。3、舉例:雷克薩斯自適應(yīng)照明系統(tǒng)(AFS)夜間行駛時,裝備自適應(yīng)照明系統(tǒng)的LEXUS雷克薩斯使駕駛員在轉(zhuǎn)彎時擁有良好視野。感應(yīng)器將監(jiān)控車速和前輪轉(zhuǎn)向角度,以估計駕駛員三秒后的位置,同時令前大燈照向此處。左、右前大燈可

10、依據(jù)轉(zhuǎn)彎角度進行不同程度的旋轉(zhuǎn),一個可旋轉(zhuǎn)5度,另一個可旋轉(zhuǎn)15度。當駛近彎道時,車燈將緊隨前方道路走向,而絕非簡單照亮道路邊緣。自適應(yīng)照明系統(tǒng)有助于緩解夜間行車疲勞,尤其在不熟悉的連續(xù)彎路當中行駛時。三、需求分析一款A(yù)FS車輛前照燈系統(tǒng)需要提供以下服務(wù):1、三種車燈照明基本狀態(tài):近光寬照明,遠光照明,轉(zhuǎn)彎死角照明;2、具備車速傳感器和天氣狀況傳感器;3、將速度劃分為三檔,由低到高分別為城市速度,鄉(xiāng)村速度和高速公路速度;4、城市照明時,采用近光燈照明;5、鄉(xiāng)村速度時,采用限制左側(cè)照明,即此時右側(cè)同時使用遠光燈和近光燈,而左側(cè)使用近光燈;6、高速路速度時,同時使用遠光燈和近光燈照明;7、通過傳感

11、器識別霧天,自動打開霧燈功能,并且,霧燈不影響其他燈的使用;8、轉(zhuǎn)向時,自動觸發(fā)轉(zhuǎn)向照明燈,將所轉(zhuǎn)向的區(qū)域中的死角照亮,轉(zhuǎn)向結(jié)束,關(guān)閉轉(zhuǎn)向燈;9、為應(yīng)付緊急情況,所有的燈均可通過鍵盤手動控制;10、出于安全性的考慮,車燈的變化需要在盡量短的時間內(nèi)完成,以盡可能的提高駕駛員的客觀的可視范圍。四、實驗的基本內(nèi)容(一)AFS系統(tǒng)模型抽象與資源模擬1、系統(tǒng)中具備多種傳感器,并且可以周期性采樣各傳感器數(shù)據(jù),綜合處理 2、 車燈作為系統(tǒng)的輸出設(shè)備,通過其組合表達系統(tǒng)的處理結(jié)果 3 模塊之間獨立性較強,需要有軟開關(guān)可以屏蔽模塊。 針對實驗室內(nèi)的條件,結(jié)合實驗平臺中的資源,對車輛前照燈控制系統(tǒng)中的設(shè)備作如下模

12、擬: 1、用8個LED分別模擬各組車燈,對8個LED編號分別為1至8,1號和8號模擬側(cè)光燈,2號和7號模擬霧燈,3號和6號模擬外側(cè)遠光燈,4號和5號模擬近光燈。示意圖如下:LED1LED2LED3LED4LED5LED6LED7LED8左側(cè)燈霧燈左遠光燈左近光燈右近光燈右遠光燈霧燈右側(cè)燈 2、AD轉(zhuǎn)換器0模擬方向盤,居中為正向行駛 3、AD轉(zhuǎn)化器1模擬車速傳感器 4、鍵盤模擬駕駛員車內(nèi)控制按鈕。1號鍵和3號鍵為左右側(cè)的近光燈,4號鍵和6號鍵為左右側(cè)的遠光燈,7號鍵和9號鍵為左右側(cè)光燈,5控制霧燈。NumLock鍵用于手動控制和自動控制的切換。 5、AD轉(zhuǎn)換器2模擬空氣中霧氣數(shù)據(jù)采樣。(二)環(huán)節(jié)

13、實驗準備 根據(jù)上述分析,實驗準備階段需要熟悉的環(huán)節(jié)實驗有:1、 AD轉(zhuǎn)換器實驗主要目的是知道編程實現(xiàn) A/D功能的主要方法。 AD轉(zhuǎn)換器實驗是系統(tǒng)中有關(guān)AD轉(zhuǎn)換器的基礎(chǔ)模塊實現(xiàn)的基礎(chǔ)。 1) 新建工程,將Exp5中的文件添加到工程。2)編寫獲取轉(zhuǎn)換結(jié)果函數(shù)( main.c) 3) 主函數(shù)(main.c)2、 鍵盤和LED實驗 目的是學(xué)習鍵盤及LED驅(qū)動原理,掌握鍵盤及LED驅(qū)動芯片的使用方法。鍵盤和LED實驗是系統(tǒng)中鍵盤和LED兩個基礎(chǔ)模塊實現(xiàn)的基礎(chǔ)。1) 新建工程,將Exp3中的文件添加到工程。2) 2)定義zlg7289寄存器(zlg7289.h) #define ZLG7289_CS (

14、0x20) /GPB5 #define ZLG7289_KEY (0x10) /GPG4 #define ZLG7289_ENABLE() doZlg7289SIOBand=rSBRDR; Zlg7289SIOCtrl=rSIOCON; rSIOCON=0x31; rSBRDR=0xff; rPDATB&=(ZLG7289_CS);while(0) #define ZLG7289_DISABLE() dorPDATB|=ZLG7289_CS;rSBRDR=Zlg7289SIOBand;rSIOCON=Zlg7289SIOCtrl;while(0)3)編寫zlg7289驅(qū)動函數(shù)(zlg7

15、289.c) 4)定義鍵盤映射表:(Keyboard16.c)unsigned char KeyBoard_Map=4,8,11,0,0,0,0,0,5,9,12,15,1,0,0,0,6,10,13,16,2,3,0,0,7,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; /64,鍵值映射表。通過查找鍵盤映射表來確定鍵盤掃描碼對應(yīng)的按鍵值。 5)定義鍵盤讀取函數(shù):(Keyboard16.c)6) 編寫主函數(shù),將按鍵值在數(shù)碼管上顯示。3、 消息循環(huán)實驗?zāi)康氖菍W(xué)習使用系統(tǒng)的消息循環(huán)。掌

16、握如何通過系統(tǒng)的消息循環(huán)來響應(yīng)鍵盤的消息,同時學(xué)會使用圖形模式下的液晶屏文字顯示函數(shù)。最終實現(xiàn)按不同的鍵,在屏幕上顯示不同的文字;同時,把鍵盤的按鍵號碼輸出到 PC機的終端顯示。消息循環(huán)實驗部分是本系統(tǒng)的一個核心部分,是各個模塊之間的一個通信紐帶。 1、新建工程,將 Exp1中的文件加入工程。 2、打開 Main.c文件,仔細閱讀 Key_Scan_Task函數(shù)系統(tǒng)的鍵盤掃描函數(shù)。理解系統(tǒng)中 Main_Task任務(wù)消息隊列的創(chuàng)建和發(fā)送的過程。3、在 Main_Task任務(wù)中加入代碼,實現(xiàn)消息循環(huán)。即:等待消息、處理(響應(yīng))消息、刪除消息。 使用 WaitMessage接收消息,通常等待時間設(shè)置

17、為無限長。 如圖 4-1所示,系統(tǒng)的消息循環(huán)是一個無限循環(huán)。 系統(tǒng)的消息結(jié)構(gòu)定義如下:typedef struct POS_Ctrl pOSCtrl; /消息所發(fā)到的窗口(控件) U32 Message; U32 WParam; U32 LParam;OSMSG, *POSMSG;收到消息以后(即, WaitMessage函數(shù)返回),通過判斷消息結(jié)構(gòu)中 Message的成員來判斷消息類型。如果是鍵盤消息,則 Message的值為 OSM_KEY,Wparam參數(shù)存儲的是按鍵的號碼,LParam參數(shù)存儲的是同時系統(tǒng)按下的功能鍵(如果沒有,則為 0)。 開始等待下一條消息之前必須使用 Delete

18、Message刪除消息,釋放系統(tǒng)的內(nèi)存空間。 4、編寫鍵盤消息響應(yīng)函數(shù),處理鍵盤的消息。當有鍵盤消息收到的時候,把按鍵號碼顯示在液晶屏上,同時,發(fā)送給 PC機的終端。4、 操作系統(tǒng)移植實驗?zāi)康氖钦莆蘸屠斫釻C/OS-II內(nèi)核的主要結(jié)構(gòu)及UC/OS-II內(nèi)核移植到 ARM7處理器上的基本方法。操作系統(tǒng)移植實驗部分是系統(tǒng)中最核心的部分,控制、調(diào)度著其他模塊正常、協(xié)調(diào)地運行。實驗主要的內(nèi)容(1)、該實驗的文件分為兩類,其一是 STARTUP目錄下的系統(tǒng)初始化、配置等文件,其二是µC/OS-的全部源碼,arch目錄下的 3個文件是和處理器架構(gòu)相關(guān)的。(2)設(shè)置 os_cpu.h中與處理器和編

19、譯器相關(guān)的代碼 typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef signed char INT8S; typedef unsigned int INT16U; typedef signed int INT16S; typedef unsigned long INT32U; typedef signed long INT32S; typedef float FP32; typedef double FP64; typedef unsigned int OS_STK; typedef unsigned int

20、OS_CPU_SR; extern int INTS_OFF(void); extern void INTS_ON(void); #define OS_ENTER_CRITICAL() cpu_sr = INTS_OFF(); #define OS_EXIT_CRITICAL() if(cpu_sr = 0) INTS_ON(); #define OS_STK_GROWTH 11)與編譯器相關(guān)的數(shù)據(jù)類型因為不同的微處理器有不同的字長,所以 µC/OS-的移植包括了一系列的類型定義以確保其可移植性。尤其是µC/OS-代碼從不使用 C的 short,int和 long等數(shù)據(jù)類型

21、,因為它們是與編譯器相關(guān)的,不可移植。相反的,我們定義的整形數(shù)據(jù)結(jié)構(gòu)既是可移植的又是直觀的。為了方便,雖然µC/OS-不使用浮點數(shù)據(jù),但我們還是定義了浮點數(shù)據(jù)類型。例如,INT16U數(shù)據(jù)類型總是代表 16位的無符號整數(shù)。現(xiàn)在, µC/OS-和用戶的應(yīng)用程序就可以估計出聲明為該數(shù)據(jù)類型的變量的取值范圍是 065535。將µC/OS-移植到 32位的處理器上也就意味著 INT16U實際被聲明為無符號短整形數(shù)據(jù)結(jié)構(gòu)而不是無符號整數(shù)數(shù)據(jù)結(jié)構(gòu)。但是,µC/OS-所處理的仍然是 INT16U。用戶必須將任務(wù)堆棧的數(shù)據(jù)類型告訴給µC/OS-。這個過程是通過為

22、 OS_STK聲明正確的 C數(shù)據(jù)類型來完成的。我們的處理器上的堆棧成員是 16位的,所以將 OS_TSK聲明為無符號整形數(shù)據(jù)類型。所有的任務(wù)堆棧都必須用 OS_TSK聲明數(shù)據(jù)類型。2)OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()與所有的實時內(nèi)核一樣,µC/OS-需要先禁止中斷再訪問代碼的臨界區(qū),并且在訪問完畢后重新允許中斷。這就使得 µC/OS-能夠保護臨界區(qū)代碼免受多任務(wù)或中斷服務(wù)例程(ISR)的破壞。在 S3C44B0X上是通過兩個函數(shù)( OS_CPU_A.S)實現(xiàn)開關(guān)中斷的。INTS_OFFmrsr0, cpsr; 當前 CSRmov

23、r1, r0; 復(fù)制屏蔽orrr1, r1, #0xC0; 屏蔽中斷位msrCPSR, r1; 關(guān)中斷(IRQ and FIQ)andr0, r0, #0x80; 從初始 CSR返回 FIQ位movpc,lr; 返回INTS_ON mrs r0, cpsr; 當前 CSRbicr0, r0, #0xC0; 屏蔽中斷msrCPSR, r0; 開中斷 (IRQ and FIQ)movpc,lr; 返回3)OS_STK_GROWTH絕大多數(shù)的微處理器和微控制器的堆棧是從上往下長的。但是某些處理器是用另外一種方式工作的。µC/OS-被設(shè)計成兩種情況都可以處理,只要在結(jié)構(gòu)常量 OS_STK_G

24、ROWTH中指定堆棧的生長方式就可以了。置 OS_STK_GROWTH為 0表示堆棧從下往上長。置 OS_STK_GROWTH為 1表示堆棧從上往下長。(3)用 C語言編寫 6個操作系統(tǒng)相關(guān)的函數(shù)(OS_CPU_C.C)1)OSTaskStkInitOSTaskCreate()和 OSTaskCreateExt()通過調(diào)用 OSTaskStkInit()來初始化任務(wù)的堆棧結(jié)構(gòu)。因此,堆棧看起來就像剛發(fā)生過中斷并將所有的寄存器保存到堆棧中的情形一樣。圖 12-2顯示了 OSTaskStkInt()放到正被建立的任務(wù)堆棧中的東西。這里我們定義了堆棧是從上往下長的。在用戶建立任務(wù)的時候,用戶傳遞任務(wù)

25、的地址, pdata指針,任務(wù)的堆棧棧頂和任務(wù)的優(yōu)先級給 OSTaskCreate()和 OSTaskCreateExt()。一旦用戶初始化了堆棧,OSTaskStkInit()就需要返回堆棧指針所指的地址。 OSTaskCreate()和 OSTaskCreateExt()會獲得該地址并將它保存到任務(wù)控制塊(OS_TCB)中。OS_STK * OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt) unsigned int * stk; stk = (unsigned int *)ptos;

26、/* 裝載堆棧指針 */ opt+;/*為新任務(wù)建立堆棧 */ *-stk = (unsigned int) task; /* pc */ *-stk = (unsigned int) task; /* lr */ *-stk = 12; /* r12 */ *-stk = 11; /* r11 */ *-stk = 10; /* r10 */ *-stk = 9; /* r9 */ *-stk = 8; /* r8 */ *-stk = 7; /* r7 */ *-stk = 6; /* r6 */ *-stk = 5; /* r5 */ *-stk = 4; /* r4 */ *-stk

27、= 3; /* r3 */ *-stk = 2; /* r2 */ *-stk = 1; /* r1 */ *-stk = (unsigned int) pdata; /* r0 */ *-stk = (SUPMODE); /* cpsr */ *-stk = (SUPMODE); /* spsr */return (OS_STK *)stk); 2)OSTaskCreateHook當用 OSTaskCreate()和 OSTaskCreateExt()建立任務(wù)的時候就會調(diào)用 OSTaskCreateHook()。該函數(shù)允許用戶或使用移植實例的用戶擴展 µC/OS-功能。當 

28、1;C/OS-設(shè)置完了自己的內(nèi)部結(jié)構(gòu)后,會在調(diào)用任務(wù)調(diào)度程序之前調(diào)用 OSTaskCreateHook()。該函數(shù)被調(diào)用的時候中斷是禁止的。因此用戶應(yīng)盡量減少該函數(shù)中的代碼以縮短中斷的響應(yīng)時間。當 OSTaskCreateHook()被調(diào)用的時候,它會收到指向已建立任務(wù)的 OS_TCB的指針,這樣它就可以訪問所有的結(jié)構(gòu)成員了。函數(shù)原型:void OSTaskCreateHook (OS_TCB *ptcb)3)OSTaskDelHook當任務(wù)被刪除的時候就會調(diào)用 OSTaskDelHook()。該函數(shù)在把任務(wù)從 µC/OS-的內(nèi)部任務(wù)鏈表中解開之前被調(diào)用。當 OSTaskDelHoo

29、k()被調(diào)用的時候,它會收到指向正被刪除任務(wù)的 OS_TCB的指針,這樣它就可以訪問所有的結(jié)構(gòu)成員了。 OSTaskDelHook()可以來檢驗 TCB擴展是否被建立(一個非空指針)并進行一些清除操作。函數(shù)原型:void OSTaskDelHook (OS_TCB *ptcb)4.)OSTaskSwHook當發(fā)生任務(wù)切換的時候就會調(diào)用 OSTaskSwHook()。OSTaskSwHook()可以直接訪問 OSTCBCur和 OSTCBHighRdy,因為它們是全局變量。OSTCBCur指向被切換出去的任務(wù) OS_TCB,而 OSTCBHighRdy指向新任務(wù) OS_TCB。注意在調(diào)用 OST

30、askSwHook()期間中斷一直是被禁止的。因此用戶應(yīng)盡量減少該函數(shù)中的代碼以縮短中斷的響應(yīng)時間。函數(shù)原型:void OSTaskSwHook (void)5)OSTaskStatHookOSTaskStatHook()每秒鐘都會被 OSTaskStat()調(diào)用一次。用戶可以用 OSTaskStatHook()來擴展統(tǒng)計功能。例如,用戶可以保持并顯示每個任務(wù)的執(zhí)行時間,每個任務(wù)所用的 CPU份額,以及每個任務(wù)執(zhí)行的頻率等。函數(shù)原型:void OSTaskStatHook (void)6)OSTimeTickHook OSTimeTickHook()在每個時鐘節(jié)拍都會被 OSTaskTick(

31、)調(diào)用。實際上,OSTimeTickHook()是在節(jié)拍被µC/OS-真正處理,并通知用戶的移植實例或應(yīng)用程序之前被調(diào)用的。函數(shù)原型:void OSTimeTickHook (void)后 5個函數(shù)為鉤子函數(shù),可以不加代碼。只有當 OS_CFG.H中的 OS_CPU_HOOKS_EN被置為 1時才會產(chǎn)生這些函數(shù)的代碼。(4)用匯編語言編寫 4個與處理器相關(guān)的函數(shù)(OS_CPU.ASM)1)OSStartHighRdy ();運行優(yōu)先級最高的就緒任務(wù)OSStartHighRdy LDR r4, addr_OSTCBCur ; 得到當前任務(wù) TCB地址 LDR r5, addr_OSTC

32、BHighRdy ; 得到昀高優(yōu)先級任務(wù) TCB地址LDR r5, r5 ; 獲得堆棧指針 LDR sp, r5 ; 轉(zhuǎn)移到新的堆棧中STR r5, r4 ; 設(shè)置新的當前任務(wù) TCB地址LDMFD sp!, r4 ; MSR SPSR, r4 ;LDMFD sp!, r4 ; 從棧頂獲得新的狀態(tài)MSR CPSR, r4 ; CPSR 處于 SVC32Mode模式 LDMFD sp!, r0-r12, lr, pc ; 運行新的任務(wù)2)OS_TASK_SW ();任務(wù)級的任務(wù)切換函數(shù)OS_TASK_SWSTMFDsp!, lr; 保存 pcSTMFDsp!, lr; 保存 lrSTMFDsp!

33、, r0-r12; 保存寄存器和返回地址 MRS r4, CPSR STMFD sp!, r4 ; 保存當前的 PSRMRS r4, SPSR STMFD sp!, r4 ; 保存 SPSR; OSPrioCur = OSPrioHighRdy LDR r4, addr_OSPrioCur LDR r5, addr_OSPrioHighRdy LDRB r6, r5 STRB r6, r4; 得到當前任務(wù) TCB地址 LDR r4, addr_OSTCBCur LDR r5, r4 STR sp, r5 ; 保存 sp在被占先的任務(wù)的 TCB; 得到最高優(yōu)先級任務(wù) TCB地址 LDR r6,

34、addr_OSTCBHighRdy LDR r6, r6 LDR sp, r6 ; 得到新任務(wù)堆棧指針; OSTCBCur = OSTCBHighRdy STR r6, r4 ; 設(shè)置新的當前任務(wù)的 TCB地址;保存任務(wù)方式寄存器 LDMFD sp!, r4 MSR SPSR, r4 LDMFD sp!, r4 MSR CPSR, r4;返回到新任務(wù)的上下文 LDMFD sp!, r0-r12, lr, pc3)OSIntCtxSw() ;中斷級的任務(wù)切換函數(shù) OSIntCtxSw add r7, sp, #16 ; 保存寄存器指針 LDR sp, =IRQStack ;FIQ_STACK m

35、rsr1, SPSR; 得到暫停的 PSR orrr1, r1, #0xC0; 關(guān)閉 IRQ, FIQ. msrCPSR_cxsf, r1; 轉(zhuǎn)換模式 (應(yīng)該是 SVC_MODE) ldrr0, r7, #52 ; 從 IRQ堆棧中得到 IRQ's LR (任務(wù) PC) subr0, r0, #4; 當前 PC地址是(saved_LR - 4) STMFDsp!, r0; 保存任務(wù) PC STMFDsp!, lr; 保存 LR mov lr, r7 ; 保存 FIQ 堆棧 ptr in LR (轉(zhuǎn)到 nuke r7) ldmfd lr!, r0-r12 ; 從 FIQ堆棧中得到保存的寄

36、存器 STMFD sp!, r0-r12 ;在任務(wù)堆棧中保存寄存器;在任務(wù)堆棧上保存 PSR 和任務(wù) PSR MRS r4, CPSR bic r4, r4, #0xC0 ; 使中斷位處于使能態(tài) STMFD sp!, r4 ; 保存任務(wù)當前 PSR MRS r4, SPSR STMFD sp!, r4 ; SPSR ; OSPrioCur = OSPrioHighRdy / 改變當前程序 LDR r4, addr_OSPrioCur LDR r5, addr_OSPrioHighRdy LDRB r6, r5 STRB r6, r4 ; 得到被占先的任務(wù) TCB LDR r4, addr_OSTCBCur LDR r5, r4 STR sp, r5 ; 保存 sp 在被占先的任務(wù)的 TCB ; 得到新任務(wù) TCB 地址 LDR r6, addr_OSTCBHighRdy LDR r6, r6 LDR sp, r6 ; 得到新任務(wù)堆棧指針 ; OSTCBCur = OSTCBHighRdy STR r6, r4 ; 設(shè)置新的當前任務(wù)的 TCB地址 LDM

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論