|
0 引言
近年來,隨著汽車工業和電子工業的不斷發展,汽車線控轉向技術成為了研究的熱點,並提出了包括路感模擬、轉(zhuan)向(xiang)穩(wen)定(ding)性(xing)以(yi)及(ji)總(zong)線(xian)技(ji)術(shu)等(deng)諸(zhu)多(duo)關(guan)鍵(jian)性(xing)問(wen)題(ti)並(bing)加(jia)以(yi)研(yan)究(jiu)。其(qi)中(zhong)的(de)總(zong)線(xian)技(ji)術(shu),已(yi)經(jing)得(de)到(dao)了(le)眾(zhong)多(duo)知(zhi)名(ming)汽(qi)車(che)公(gong)司(si)的(de)積(ji)極(ji)研(yan)究(jiu)與(yu)應(ying)用(yong)。一(yi)些(xie)汽(qi)車(che)製(zhi)造(zao)商(shang)目(mu)前(qian)計(ji)劃(hua)采(cai)用(yong)FlexRayzongxian,zheshiyizhongtebieshihexiayidaiqicheyingyongdewangluotongxinzongxian,juyourongcuogongnenghequedingdexiaoxichuanshushijian,nenggoumanzuqichekongzhixitongdegaosulvtongxinyaoqiu。
FlexRaY是時間觸發的通信總線,對實時性要求較高,因此僅僅依靠由簡單循環和中斷服務程序組成的嵌入式程序將無法滿足要求。同時,FlexRay通tong信xin在zai啟qi動dong和he運yun行xing過guo程cheng中zhong,需xu要yao利li用yong循xun環huan對dui總zong線xian狀zhuang態tai進jin行xing查zha詢xun,既ji浪lang費fei大da量liang的de係xi統tong資zi源yuan,又you容rong易yi造zao成cheng程cheng序xu死si鎖suo,成cheng為wei應ying用yong中zhong的de難nan點dian問wen題ti。
基於上述問題,本文基於μC/OS-II操作係統,設計了線控轉向中FlexRayzongxiandetongxinbufen。zaimanzushishixingyaoqiudejichushang,liyongqiduorenwudetedian,jieyuelexitongziyuan,bimianlesisuowentidechuxian,bingzengjialetongxinguzhangjiancebaojinggongneng,weijinhoukaifaxiankongzhuanxiangxitongdiandinglejichu。
1 FlexRay總線技術
為了滿足汽車線控技術的需求,FlexRay聯盟於2005年發布了FlexRay總線協議。其主要特點有:雙通道傳輸,每個通道的傳輸速率高達lO Mb/s;具有靈活的使用方式,支持多種網絡拓撲結構;負載率高;提供冗餘機製。
從開放式係統互連參考模型角度來看,FlexRay通信協議定義了四層結構:物理層、傳輸層、表示層和應用層,各層功能描述見表1。表示層中,通信狀態切換控製整個FlexRay通信的運行過程,具有十分重要的作用。

FlexRay協議操作控製(Proposal Operation Control,POC)將通信狀態分為幾種狀態,分別為:配置狀態(默認配置、配置);就緒狀態;喚醒狀態;啟動狀態;正常狀態(正常主動、正常被動);暫停狀態。其狀態轉換圖如圖1所示。當控製器主機接口(Controller Host InteRFace,CHI)給通訊控製器(CC)發送命令後,CC從暫停狀態進入默認配置狀態,滿足配置條件後進入配置狀態,完成網絡初始化和節點通信任務初始化;之後可以進入就緒狀態,完成節點內部通信設置,如果沒有滿足通信就緒條件,就返回配置狀態繼續配置;在就緒狀態,CC可以發送喚醒幀,喚醒網絡中沒有在通信的節點,也可以獲得CPU的啟動通信命令,完成與FlexRay網絡時鍾同步;啟動成功後進入正常狀態,完成數據的收發;當出現錯誤時,可由正常狀態進入暫停狀態,重新等待CHI命令。

由此可見,控製器需要按照POC狀態進行相應操作,因此會出現對POC狀態的循環檢測,容易造成程序死鎖以及占用大量係統資源。按照操作係統的介紹,其任務是以循環的形式存在的,因此可以將檢測POC狀態放入任務中單獨執行,通過操作係統進行任務調度,可以避免影響到其他任務中程序的運行,並且提高程序的執行效率。
2 基於MC9S12XF512的μC/OS-Ⅱ移植
μC/OS-Ⅱ是源碼公開的操作係統,具有執行效率高、占用空間小和實時性能優良等特點。利用該操作係統的任務機製,設計實現Flex-Ray協議,可以大大提高係統的實時性和穩定性,並且可以避免檢測POC狀態時的死鎖現象。
目前市場上支持FlexRay通信的單片機較少,隻有Freescale公司的技術比較成熟。考慮到成本問題,選擇16位單片機MC9S12XF512作為係統控製器芯片。操作係統的使用首先要解決的就是移植問題。根據μC/OS-Ⅱ的文件結構,移植時需要對OS_CPU.H,(OS_CPU_A.ASM和OS_CPUC.C三個文件進行修改,以適合MC9S12xF512芯片的需要。
2.1 修改OS_CPU.H文件
OS_CPU.H文件定義與CPU相關的硬件信息,包括各種數據類型對應的存儲長度等。針對MC9S12xF512中的堆棧是由高地址向低地址增長的,所以常量OS_STK_GROWTH必須設置為1。同時,定義任務調度函數OS_TASK_SW()設置為軟中斷源。
2.2 修改OS_CPU_A.ASM文件
OS_CPU_A.ASM文件是使用彙編語言編寫與任務調度部分有關的代碼。包括任務級任務切換函數OSCtxSw()、中斷級任務切換函數OSIntCtxSw()、以及讓優先級最高的就緒態任務開始運行的函數OS-StartHighRdy()。
MC9S12XF512芯片不僅設有FLASH頁麵管理寄存器PPage,也有RAM頁麵管理寄存器RPage、E2PROM頁麵管理寄存器EPage以及全程寄存器GPage。當時鍾節拍中斷發生時,芯片會自動把CPU寄存器推入堆棧,但是並不包括上述各寄存器,因此在OS_CPU_A.ASM文件三個函數中,均需要加入將寄存器入棧和出棧的語句。由於篇幅有限,僅以PPage代碼為例:

寄存器的入棧必須按照GPage,EPage,RPage,PPage的順序,出棧則相反。
2.3 修改OS_CPUC.C文件
OS_CPUC.C文件是使用C語言編寫與任務調度部分有關的代碼,包括任務堆棧初始化函數OSTaskStklnit()和時鍾節拍中斷服務子程序OSTicklSR()。
2.3.1 修改任務堆棧初始化函數0STaskStkInit()
由於μC/OS-Ⅱ是利用中斷方式來實現任務調度的,因此需要使用函數OSTaskStklnit()來lai模mo擬ni發fa生sheng一yi次ci中zhong斷duan後hou的de堆dui棧zhan結jie構gou,按an照zhao中zhong斷duan後hou的de進jin棧zhan次ci序xu預yu留liu各ge個ge寄ji存cun器qi存cun儲chu空kong間jian,而er中zhong斷duan返fan回hui地di址zhi指zhi向xiang任ren務wu代dai碼ma的de起qi始shi地di址zhi。編bian寫xie時shi需xu要yao根gen據ju芯xin片pian的de中zhong斷duan後hou,X,Y,A,B,SP等寄存器入棧順序來進行代碼編寫。首先在例程OSTaskStkInit()函數處設置斷點,然後單步執行程序,觀察X,Y,A,B,SP等寄存器狀態是否與程序編寫的存儲值對應。發現對應於堆棧指針SP值(zhi)的(de)存(cun)儲(chu)區(qu)地(di)址(zhi)是(shi)模(mo)擬(ni)中(zhong)斷(duan)時(shi)進(jin)棧(zhan)的(de)存(cun)儲(chu)地(di)址(zhi),而(er)其(qi)中(zhong)保(bao)存(cun)任(ren)務(wu)程(cheng)序(xu)指(zhi)針(zhen)地(di)址(zhi)的(de)內(nei)容(rong)是(shi)錯(cuo)誤(wu)的(de),即(ji)不(bu)是(shi)任(ren)務(wu)的(de)指(zhi)針(zhen)地(di)址(zhi),因(yin)此(ci)每(mei)次(ci)在(zai)需(xu)要(yao)調(tiao)用(yong)任(ren)務(wu)執(zhi)行(xing)時(shi)都(dou)進(jin)入(ru)了(le)錯(cuo)誤(wu)的(de)地(di)址(zhi)進(jin)行(xing)執(zhi)行(xing),並(bing)沒(mei)有(you)找(zhao)到(dao)任(ren)務(wu)的(de)代(dai)碼(ma)。通(tong)過(guo)單(dan)步(bu)執(zhi)行(xing)OSTaskStkI-nit()函數,可以發現原程序在存儲任務代碼指針PC值時,隻存儲了PC指針的高8位,但後8位未存,導致指針指向錯誤。因此修改程序為:
*--wstk=(INTl6U)((INT32U)task);
2.3.2 修改時鍾節拍中斷服務子程序OSTickISR()
時鍾節拍中斷服務子程序OSTickISR()負責處理所有與定時相關的工作,如任務的延時、等待操作等。在時鍾中斷中將查詢處於等待狀態的任務,判斷是否延時結束,否則將重新進行任務調度。可以通過調用OSIntEnter()。OS_SAVE_SP(),OSTimeTick()和OSIntExit()四個函數進行實現。OSintEnter()函數通知μC/OS-Ⅱ進入中斷服務子程序,OS_SAVE_SP()函數用來保存堆棧指針,OSTimeTick()函數給要求延時若幹時鍾節拍的任務延遲計數器減1,當反複運行該程序後,計數器為0時,則表明該任務進入了就緒狀態,OSintExit()函數標誌時鍾節拍中斷服務子程序結束。
之後最重要的一點,就是要將中斷服務子程序OSTickISR()與任務級任務切換函數OSCtxSw()添加到係統中斷向量表的相應位置中。這裏使用的是實時時鍾中斷模塊(RTI)來實現時鍾中斷的產生,因此要將OSTickISR()連接到向量表RTI位置。OSCtxSw()函數是利用軟中斷來實現任務的切換功能的,因此軟中斷服務子程序的向量地址必須指向OSCtxSw()。
在進行上述程序編寫後,下載代碼到硬件中,μC/OS-Ⅱ就可以在本係統上實現運行了。
|