車輛前照燈控制系統(tǒng)實(shí)驗(yàn)_第1頁(yè)
車輛前照燈控制系統(tǒng)實(shí)驗(yàn)_第2頁(yè)
車輛前照燈控制系統(tǒng)實(shí)驗(yàn)_第3頁(yè)
車輛前照燈控制系統(tǒng)實(shí)驗(yàn)_第4頁(yè)
車輛前照燈控制系統(tǒng)實(shí)驗(yàn)_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

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

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

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

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

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

12、組車燈,對(duì)8個(gè)LED編號(hào)分別為1至8,1號(hào)和8號(hào)模擬側(cè)光燈,2號(hào)和7號(hào)模擬霧燈,3號(hào)和6號(hào)模擬外側(cè)遠(yuǎn)光燈,4號(hào)和5號(hào)模擬近光燈。示意圖如下:LED1LED2LED3LED4LED5LED6LED7LED8左側(cè)燈霧燈左遠(yuǎn)光燈左近光燈右近光燈右遠(yuǎn)光燈霧燈右側(cè)燈2、AD轉(zhuǎn)換器0模擬方向盤,居中為正向行駛3、AD轉(zhuǎn)化器1模擬車速傳感器4、鍵盤模擬駕駛員車內(nèi)控制按鈕。1號(hào)鍵和3號(hào)鍵為左右側(cè)的近光燈,4號(hào)鍵和6號(hào)鍵為左右側(cè)的遠(yuǎn)光燈,7號(hào)鍵和9號(hào)鍵為左右側(cè)光燈,5控制霧燈。NumLock鍵用于手動(dòng)控制和自動(dòng)控制的切換。5、AD轉(zhuǎn)換器2模擬空氣中霧氣數(shù)據(jù)采樣。(二)環(huán)節(jié)實(shí)驗(yàn)準(zhǔn)備根據(jù)上述分析,實(shí)驗(yàn)準(zhǔn)備階段需要熟

13、悉的環(huán)節(jié)實(shí)驗(yàn)有:1、AD轉(zhuǎn)換器實(shí)驗(yàn)主要目的是知道編程實(shí)現(xiàn)A/D功能的主要方法。AD轉(zhuǎn)換器實(shí)驗(yàn)是系統(tǒng)中有關(guān)AD轉(zhuǎn)換器的基礎(chǔ)模塊實(shí)現(xiàn)的基礎(chǔ)。1)新建工程,將Exp5中的文件添加到工程。2)編寫獲取轉(zhuǎn)換結(jié)果函數(shù)(main.c)主函數(shù)(main.c)2、鍵盤和LED實(shí)驗(yàn)?zāi)康氖菍W(xué)習(xí)鍵盤及LED驅(qū)動(dòng)原理,掌握鍵盤及LED驅(qū)動(dòng)芯片的使用方法。鍵盤和LED實(shí)驗(yàn)是系統(tǒng)中鍵盤和LED兩個(gè)基礎(chǔ)模塊實(shí)現(xiàn)的基礎(chǔ)。新建工程,將Exp3中的文件添加到工程。2)定義zlg7289寄存器(zlg7289.h)#defineZLG7289_CS(0 x20)/GPB5#defineZLG7289_KEY(0 x10)/GPG4#

14、defineZLG7289_ENABLE()doZlg7289SIOBand=rSBRDR;Zlg7289SIOCtrl=rSIOCON;rSIOCON=0 x31;rSBRDR=0 xff;rPDATB&=(ZLG7289_CS);while(0)#defineZLG7289_DISABLE()dorPDATB|=ZLG7289_CS;rSBRDR=Zlg7289SIOBand;rSIOCON=Zlg7289SIOCtrl;while(0)編寫zlg7289驅(qū)動(dòng)函數(shù)(zlg7289.c)定義鍵盤映射表:(Keyboard16.c)unsignedcharKeyBoard_Map=4,8,11

15、,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,鍵值映射表。通過查找鍵盤映射表來確定鍵盤掃描碼對(duì)應(yīng)的按鍵值。定義鍵盤讀取函數(shù):(Keyboard16.c)編寫主函數(shù),將按鍵值在數(shù)碼管上顯示。3、消息循環(huán)實(shí)驗(yàn)?zāi)康氖菍W(xué)習(xí)使用系統(tǒng)的消息循環(huán)。掌握如何通過系統(tǒng)的消息循環(huán)來響應(yīng)鍵盤的消息,同時(shí)學(xué)會(huì)使用圖形模式下的液晶屏文字顯示函數(shù)。最終實(shí)現(xiàn)按不同的鍵,在屏幕上顯示不同的文字;同時(shí),把鍵盤的

16、按鍵號(hào)碼輸出到PC機(jī)的終端顯示。消息循環(huán)實(shí)驗(yàn)部分是本系統(tǒng)的一個(gè)核心部分,是各個(gè)模塊之間的一個(gè)通信紐帶。1、新建工程,將Exp1中的文件加入工程。2、打開Main.c文件,仔細(xì)閱讀Key_Scan_Task函數(shù)系統(tǒng)的鍵盤掃描函數(shù)。理解系統(tǒng)中Main_Task任務(wù)消息隊(duì)列的創(chuàng)建和發(fā)送的過程。3、在Main_Task任務(wù)中加入代碼,實(shí)現(xiàn)消息循環(huán)。即:等待消息、處理(響應(yīng))消息、刪除消息。使用WaitMessage接收消息,通常等待時(shí)間設(shè)置為無限長(zhǎng)。如圖4-1所示,系統(tǒng)的消息循環(huán)是一個(gè)無限循環(huán)。系統(tǒng)的消息結(jié)構(gòu)定義如下:typedefstructPOS_CtrlpOSCtrl;/消息所發(fā)到的窗口(控件)

17、U32Message;U32WParam;U32LParam;OSMSG,*POSMSG;收到消息以后(即,WaitMessage函數(shù)返回),通過判斷消息結(jié)構(gòu)中Message的成員來判斷消息類型。如果是鍵盤消息,則Message的值為OSM_KEY,Wparam參數(shù)存儲(chǔ)的是按鍵的號(hào)碼,LParam參數(shù)存儲(chǔ)的是同時(shí)系統(tǒng)按下的功能鍵(如果沒有,則為0)。開始等待下一條消息之前必須使用DeleteMessage刪除消息,釋放系統(tǒng)的內(nèi)存空間。4、編寫鍵盤消息響應(yīng)函數(shù),處理鍵盤的消息。當(dāng)有鍵盤消息收到的時(shí)候,把按鍵號(hào)碼顯示在液晶屏上,同時(shí),發(fā)送給PC機(jī)的終端。4、操作系統(tǒng)移植實(shí)驗(yàn)?zāi)康氖钦莆蘸屠斫釻C/O

18、S-II內(nèi)核的主要結(jié)構(gòu)及UC/OS-II內(nèi)核移植到ARM7處理器上的基本方法。操作系統(tǒng)移植實(shí)驗(yàn)部分是系統(tǒng)中最核心的部分,控制、調(diào)度著其他模塊正常、協(xié)調(diào)地運(yùn)行。實(shí)驗(yàn)主要的內(nèi)容(1)、該實(shí)驗(yàn)的文件分為兩類,其一是STARTUP目錄下的系統(tǒng)初始化、配置等文件,其二是卩C/OSU的全部源碼,arch目錄下的3個(gè)文件是和處理器架構(gòu)相關(guān)的。設(shè)置os_cpu.h中與處理器和編譯器相關(guān)的代碼typedefunsignedcharBOOLEAN;typedefunsignedcharINT8U;typedefsignedcharINT8S;typedefunsignedintINT16U;typedefsign

19、edintINT16S;typedefunsignedlongINT32U;typedefsignedlongINT32S;typedeffloatFP32;typedefdoubleFP64;typedefunsignedintOS_STK;typedefunsignedintOS_CPU_SR;externintINTS_OFF(void);externvoidINTS_ON(void);#defineOS_ENTER_CRITICAL()cpu_sr=INTS_OFF();#defineOS_EXIT_CRITICAL()if(cpu_sr=0)INTS_ON();#defineOS_S

20、TK_GROWTH1與編譯器相關(guān)的數(shù)據(jù)類型因?yàn)椴煌奈⑻幚砥饔胁煌淖珠L(zhǎng),所以卩C/OSU的移植包括了一系列的類型定義以確保其可移植性。尤其是卩C/OSU代碼從不使用C的short,int和long等數(shù)據(jù)類型,因?yàn)樗鼈兪桥c編譯器相關(guān)的,不可移植。相反的,我們定義的整形數(shù)據(jù)結(jié)構(gòu)既是可移植的又是直觀的。為了方便,雖然卩C/OSU不使用浮點(diǎn)數(shù)據(jù),但我們還是定義了浮點(diǎn)數(shù)據(jù)類型。例如,INT16U數(shù)據(jù)類型總是代表16位的無符號(hào)整數(shù)?,F(xiàn)在,卩C/OSII和用戶的應(yīng)用程序就可以估計(jì)出聲明為該數(shù)據(jù)類型的變量的取值范圍是C/OS065535。將卩C/OSI移植到32位的處理器上也就意味著INT16U實(shí)際被聲明為

21、無符號(hào)短整形數(shù)據(jù)結(jié)構(gòu)而不是無符號(hào)整數(shù)數(shù)據(jù)結(jié)構(gòu)。但是,卩-I所處理的仍然是INT16U。用戶必須將任務(wù)堆棧的數(shù)據(jù)類型告訴給卩C/OSI。這個(gè)過程是通過為OS_STK聲明正確的C數(shù)據(jù)類型來完成的。我們的處理器上的堆棧成員是16位的,所以將OS_TSK聲明為無符號(hào)整形數(shù)據(jù)類型。所有的任務(wù)堆棧都必須用OS_TSK聲明數(shù)據(jù)類型。OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()與所有的實(shí)時(shí)內(nèi)核一樣,卩-1需要先禁止中斷再訪問代碼的臨界區(qū),并且在訪問完畢后重新允許中斷。這就使得卩C/OSI能夠保護(hù)臨界區(qū)代碼免受多任務(wù)或中斷服務(wù)例程(ISR)的破壞。在S3C44B0X上是通過兩個(gè)函

22、數(shù)(OS_CPU_A.S)實(shí)現(xiàn)開關(guān)中斷的。INTS_OFFmrsr0,cpsr;當(dāng)前CSRmovr1,r0;復(fù)制屏蔽orrr1,r1,#0 xC0;屏蔽中斷位msrCPSR,r1;關(guān)中斷(IRQandFIQ)movpc,lr;返回INTS_ONmrsr0,cpsr;當(dāng)前CSRbicr0,r0,#0 xC0;屏蔽中斷msrCPSR,r0;開中斷(IRQandFIQ)movpc,lr;返回3)OS_STK_GROWTHandr0,r0,#0 x80絕大多數(shù)的微處理器和微控制器的堆棧是從上往下長(zhǎng)的。但是某些處理器是用另外一種方式工作的。卩-nC/OS+成兩種情況都可以處理,只要在結(jié)構(gòu);從初始CSR返

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

24、的地址,pdata指針,任務(wù)的堆棧棧頂和任務(wù)的優(yōu)先級(jí)給OSTaskCreate()和OSTaskCreateExt()。一旦用戶初始化了堆棧,OSTaskStkInit()就需要返回堆棧指針?biāo)傅牡刂?。OSTaskCreate()和OSTaskCreateExt()會(huì)獲得該地址并將它保存到任務(wù)控制塊(OS_TCB)中。OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT16Uopt)unsignedint*stk;stk=(unsignedint*)ptos;/*裝載堆棧指針*/opt+;/*為新任務(wù)建立堆棧*

25、/*-stk=(unsignedint)task;/*pc*/*-stk=(unsignedint)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=3;/*r3*/*-stk=2;/*r2*/*-stk=1;/*r1*/*-stk=(unsignedint)pdata;/*r0*/*-stk=(SUPMODE);/*cpsr*/*-stk=(SUP

26、MODE);/*spsr*/return(OS_STK*)stk);OSTaskCreateHook當(dāng)用OSTaskCreate()和OSTaskCreateExt()建立任務(wù)的時(shí)候就會(huì)調(diào)用c/osnOSTaskCreateHook()。該函數(shù)允許用戶或使用移植實(shí)例的用戶擴(kuò)展功能。當(dāng)卩C/OSU設(shè)置完了自己的內(nèi)部結(jié)構(gòu)后,會(huì)在調(diào)用任務(wù)調(diào)度程序之前調(diào)用OSTaskCreateHook()。該函數(shù)被調(diào)用的時(shí)候中斷是禁止的。因此用戶應(yīng)盡量減少該函數(shù)中的代碼以縮短中斷的響應(yīng)時(shí)間。當(dāng)OSTaskCreateHook()被調(diào)用的時(shí)候,它會(huì)收到指向已建立任務(wù)的OS_TCB的指針,這樣它就可以訪問所有的結(jié)構(gòu)成員

27、了。函數(shù)原型:voidOSTaskCreateHook(OS_TCB*ptcb)OSTaskDelHook當(dāng)任務(wù)被刪除的時(shí)候就會(huì)調(diào)用OSTaskDelHook()。該函數(shù)在把任務(wù)從卩C/OSU的內(nèi)部任務(wù)鏈表中解開之前被調(diào)用。當(dāng)OSTaskDelHook()被調(diào)用的時(shí)候,它會(huì)收到指向正被刪除任務(wù)的OS_TCB的指針,這樣它就可以訪問所有的結(jié)構(gòu)成員了。OSTaskDelHook()可以來檢驗(yàn)TCB擴(kuò)展是否被建立(一個(gè)非空指針)并進(jìn)行一些清除操作。函數(shù)原型:voidOSTaskDelHook(OS_TCB*ptcb)4.)OSTaskSwHook當(dāng)發(fā)生任務(wù)切換的時(shí)候就會(huì)調(diào)用OSTaskSwHook(

28、)。OSTaskSwHook()可以直接訪問OSTCBCur和OSTCBHighRdy,因?yàn)樗鼈兪侨肿兞?。OSTCBCur指向被切換出去的任務(wù)OS_TCB,而OSTCBHighRdy指向新任務(wù)OS_TCB。注意在調(diào)用OSTaskSwHook()期間中斷一直是被禁止的。因此用戶應(yīng)盡量減少該函數(shù)中的代碼以縮短中斷的響應(yīng)時(shí)間。函數(shù)原型:voidOSTaskSwHook(void)5)OSTaskStatHookOSTaskStatHook()每秒鐘都會(huì)被OSTaskStat()調(diào)用一次。用戶可以用OSTaskStatHook()來擴(kuò)展統(tǒng)計(jì)功能。例如,用戶可以保持并顯示每個(gè)任務(wù)的執(zhí)行時(shí)間,每個(gè)任務(wù)所

29、用的CPU份額,以及每個(gè)任務(wù)執(zhí)行的頻率等。函數(shù)原型:voidOSTaskStatHook(void)6)OSTimeTickHookOSTimeTickHook()在每個(gè)時(shí)鐘節(jié)拍都會(huì)被OSTaskTick()調(diào)用。實(shí)際上,OSTimeTickHook()是在節(jié)拍被卩C/OSU真正處理,并通知用戶的移植實(shí)例或應(yīng)用程序之前被調(diào)用的。函數(shù)原型:voidOSTimeTickHook(void)后5個(gè)函數(shù)為鉤子函數(shù),可以不加代碼。只有當(dāng)OS_CFG.H中的OS_CPU_HOOKS_EN被置為1時(shí)才會(huì)產(chǎn)生這些函數(shù)的代碼。用匯編語(yǔ)言編寫4個(gè)與處理器相關(guān)的函數(shù)(OS_CPU.ASM)1)OSStartHigh

30、Rdy();運(yùn)行優(yōu)先級(jí)最高的就緒任務(wù)OSStartHighRdyLDRr4,addr_OSTCBCur;得至U當(dāng)前任務(wù)TCB地址LDRr5,addr_OSTCBHighRdy;得到旳高優(yōu)先級(jí)任務(wù)TCB地址LDRr5,r5;獲得堆棧指針LDRsp,r5;轉(zhuǎn)移至新的堆棧中STRr5,r4;設(shè)置新的當(dāng)前任務(wù)TCB地址LDMFDsp!,r4;MSRSPSR,r4;LDMFDsp!,r4;從棧頂獲得新的狀態(tài)MSRCPSR,r4;CPSR處于SVC32Mode模式LDMFDsp!,r0-r12,lr,pc;運(yùn)行新的任務(wù)2)OS_TASK_SW();任務(wù)級(jí)的任務(wù)切換函數(shù)OS_TASK_SWSTMFDsp!,

31、lr;保存pcSTMFDsp!,lr;保存lrSTMFDsp!,r0-r12;保存寄存器和返回地址MRSr4,CPSRSTMFDsp!,r4;保存當(dāng)前的PSRMRSr4,SPSRSTMFDsp!,r4;保存SPSR;OSPrioCur=OSPrioHighRdyLDRr4,addr_OSPrioCurLDRr5,addr_OSPrioHighRdyLDRBr6,r5STRBr6,r4;得到當(dāng)前任務(wù)TCB地址LDRr4,addr_OSTCBCurLDRr5,r4STRsp,r5;保存sp在被占先的任務(wù)的TCB;得到最高優(yōu)先級(jí)任務(wù)TCB地址LDRr6,addr_OSTCBHighRdyLDRr6,

32、r6LDRsp,r6;得到新任務(wù)堆棧指針;OSTCBCur=OSTCBHighRdySTRr6,r4;設(shè)置新的當(dāng)前任務(wù)的TCB地址;保存任務(wù)方式寄存器LDMFDsp!,r4MSRSPSR,r4LDMFDsp!,r4MSRCPSR,r4;返回到新任務(wù)的上下文LDMFDsp!,r0-r12,lr,pcOSIntCtxSw();中斷級(jí)的任務(wù)切換函數(shù)OSIntCtxSwaddr7,sp,#16;保存寄存器指針LDRsp,=IRQStack;FIQ_STACKmrsr1,SPSRorrr1,r1,#0 xC0msrCPSR_cxsf,r1;得到暫停的PSR;關(guān)閉IRQ,FIQ.;轉(zhuǎn)換模式(應(yīng)該是SVC_

33、MODE)ldrr0,r7,#52;從IRQ堆棧中得到IRQsLR(任務(wù)PC)subr0,r0,#4當(dāng)前PC地址是(saved_LR-4)STMFDsp!,r0;保存任務(wù)PC;保存LRSTMFDsp!,lrmovlr,r7;保存FIQ堆棧ptrinLR(轉(zhuǎn)到nuker7)ldmfdlr!,r0-r12;從FIQ堆棧中得到保存的寄存器STMFDsp!,r0-r12;在任務(wù)堆棧中保存寄存器;在任務(wù)堆棧上保存PSR和任務(wù)PSRMRSr4,CPSRbicr4,r4,#0 xC0;使中斷位處于使能態(tài)STMFDsp!,r4;保存任務(wù)當(dāng)前PSRMRSr4,SPSRSTMFDsp!,r4;SPSR;OSPrioCur=OSPrioHighRdy/改變當(dāng)前程序LDRr4,addr_OSPrioCurLDRr5,addr_OSPrioHighRdyLDRBr6,r5STRBr6,r4;得到被占先的任務(wù)TCBLDRr4,addr_OSTCBCurLDRr5,r4STRsp,r5;保存sp在被占先的任務(wù)的TCB;得到新任務(wù)TCB地址LDRr6,addr_OSTCBHighRdyLDRr6,r6LDRsp,r6;得到新任務(wù)堆棧指針;OSTCBCur=OSTCBHighRdySTRr6,r4;設(shè)置新的當(dāng)前任務(wù)的TCB地址LDMFDsp!,r4MSRSPSR,r4

溫馨提示

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

評(píng)論

0/150

提交評(píng)論