RTE是(shì)什(shén)麽
AU§×≠'TOSAR RTE(Run Time Environment)實現(∞>xiàn)了(le)AUTOSAR系統中的(de)虛拟功能(néng)總線(VFB>♠),提供了(le)SWC(Software Component)之間(j© iān)的(de)訪問(wèn)接口和(hé)SWC對(duì)于BSW資源的(de)≥✔♣訪問(wèn)接口。RTE為(wèi)SWC中的(de)Runnable提供與其他(tā)SWγπ™↑C或者BSW模塊通(tōng)信的(de)π•©接口,RTE将Runnable映射到(dào)¥♦♥OS Task中,并且管理(lǐ)Runnable的(de)觸發機(jī)制(>✘zhì),因此RTE功能(néng)主要(yào)可(kě)以分(fēn)為(wèi)兩個(gè) ✘部分(fēn):
- SWC間(jiān)的(de)通(tōng)信
- SWC的(de)調度
簡化(huà)的(de)AUTOSAR架構圖☆∏☆ 如(rú)下(xià):
RTE的(de)用(yòng)途或應用(yòng)
-
實現(xiàn)了(le)虛拟功能(néng)總線,連↓←•γ接ECU內(nèi)外(wài)部SWC的(de)通(tōng)信
-
實現(xiàn)了(le)SWC與BSW模塊™∑之間(jiān)通(tōng)信的(de)路(lù)徑,使用(yòng)ports和(hé)intγπγ✔erfaces
-
依據配置的(de)不(bù)同的(de)RTE Events觸發SWC中的(de)多(duō)個λ€¥(gè)Runnables
-
在配置期間(jiān)包括來(lái)自(zì)任何項目的(de)任何SWC,≥↓☆并按預期執行(xíng)操作(zuò)以實現(xiàn)AUTOSAR的(de)SWC重用(yò φng)能(néng)力和(hé)可(kě)移植性特性
-
支持SWC的(de)多(duō)實例化(huà)
-
由于RTE處理(lǐ)OS任務中Runnables的(de)執行(xíng),實現"₽¶(xiàn)了(le)一(yī)個(gè)激活偏移量,在時(shí)間(jiān)觸發的(de)可σ₹(kě)運行(xíng)對(duì)象映射到(dào)同一(yī)OS任務中的 §(de)情況下(xià)用(yòng)于優化(huà)CPU負載、內(nèi)存®δ₩等。因為(wèi)時(shí)間(jiān)觸發的(de)變量需要(yào)在配置的(de)時(s≈™♣εhí)間(jiān)執行(xíng),并且通(tōn¶¥g)過重疊避免可(kě)運行(xíng)的(de)沖突,RTE使用(yòng)激β®φ活偏移量。RTE通(tōng)過計(jì)算(s₹♠uàn)任務的(de)最大(dà)周期來(lái)處理(lǐ)這(zhèπ•)個(gè)問(wèn)題,這(zhè)是(shì)所有(yǒu)可(k♥ ě)運行(xíng)的(de)最大(dà)公約數(shù) ≥$(GCD),它假設任何可(kě)運行(xíng)的(de)最大(d✔♦¶∑à)執行(xíng)周期都(dōu)低(dī)于GCD
-
RTE還(hái)通(tōng)知(zhī)Runnab♦σles在較低(dī)層發生(shēng)的(de)任何中斷(如(rú)果已配置),但(d♦♣àn)這(zhè)并不(bù)意味著(zhe)♦↓&Runnables将在ISR中執行(xíng)。™¶Runnables是(shì)SWC的(de)子(zǐ)集,SWC完全獨立于較低(♥♥∏✘dī)層
-
RTE在同一(yī)個(gè)SWC的(de)Runnables之間(jiān)共享變量時(s₹♠φ hí),或者分(fēn)區(qū)間(jiān)SWC或分(fēn)區(qū)內(nèi)÷ΩSWC,甚至在不(bù)同ECU的(de)SWC之間(jiān)的(de)通(♥₹tōng)信時(shí),必須保證數(shù)據的(de)一(y<'ī)緻性。
-
SWC之間(jiān)的(de)通(tōng)信(在Sender-re≥¶ ceiver通(tōng)信中)不(bù)僅限于點對(duì)點通(tōng)信,還 ←∞(hái)包括1:N(一(yī)個(gè)SWC與多(duō)個(gè)SWC通(¥★tōng)信)或N:1(多(duō)個(gè)SWC與一(yī)個(gè)SWC通(tōng)信)"®✔≥組合。如(rú)果發送者同時(shí)向一(yī)個(gè)接收者發送數(shù)據,RTE會(h§≈uì)注意防止任何沖突,反之亦然
-
如(rú)果發送方請(qǐng)求TransmissionAcknowledgementRe¥≥quest,RTE通(tōng)知(zhī)發送方信号傳輸成功。此通(tōng)知(zh≈♥§€ī)不(bù)保證接收器(qì)已成功接收到(dào)信α©号。
RTE通(tōng)信
通(tōng)信範例
RTE為(wèi)SWC實例之間(jiān)的(de)通(tōng)信提供不(bù)同的(♠<de)通(tōng)信範例:
- sender-receiver(信号傳遞)↔®★
- client-server(函數(shù)調用(yò≥₩₩ng))
- mode switch
- NvBlockSwComponentType交互
通(tōng)信模式
對(duì)于sender-receiver通(tōng)信,RTE支持2種模式
- Explicit——調用(yòng)顯示RTE API收發數(shù)據單元
- Implicit——RTE在runnable被調用(yòng)前自(zì)動讀(dú) ¥ 取指定數(shù)據集單元,在runnable被終止後自(zì)動寫數(s≥£<€hù)據集單元。隐式指的(de)是(shì)runnable不(bù)會(huì)主動發起數(s€φhù)據的(de)接收或傳輸
通(tōng)信多(duō)樣性
除了(le)支持點對(duì)點的(de)通(tōng)信,RTE支持多(duō)個(gè)pr♥✔oviders或者requires的(de)連接
-
當使用(yòng)sender-rece∏→iver通(tōng)信時(shí),RTE支持1:N(single sender with m∞$ >ultiple receivers)和(hé)N:1(multiple send"↕ers and a single receiver)的(de)通(tōng)信,部β≠↓™分(fēn)N:1的(de)通(tōng)信有(yǒu)限制(zhì)。
多(duō)個(gè)sender或者receiver的(de)執行(xíng)不(bù)由±¥"∞RTE來(lái)協調。這(zhè)意味著(z★£♠he)不(bù)同軟件(jiàn)組件(jiàn)的(de)操作(zuò)是(shì)∏☆獨立的(de),RTE不(bù)能(néng)确保不(bù)同的(de)發送方同時(↑Ω♦shí)傳輸數(shù)據,不(bù)确保>所有(yǒu)接收者同時(shí)讀(dú)取數¶ ↓$(shù)據或接收事(shì)件(jiàn)。
-
當使用(yòng)client-server通(tōng)信時(shí),RTE支持N:1(多(₽§duō)個(gè)clients和(hé)單個(gè)$×δ$server)通(tōng)信,RTE不(bù)支持1:N(單個(gè)clie¥♥®πnt和(hé)多(duō)個(gè)servers)的(de)通(tōng)信。
RTE的(de)生(shēng)成
RTE的(de)生(shēng)成是(shì)任何基于AUTOSAR的(de)項目中最重要§α©∑(yào)和(hé)最棘手的(de)一(yī)步。π₽RTE生(shēng)成的(de)結果是(shì)各種文↔β→(wén)件(jiàn),但(dàn)我們隻±≈考慮兩個(gè)重要(yào)的(de)文(wén)件(jiàn):1. Rε≥te.c 文(wén)件(jiàn),2. Rte.h 文(wén)件(≠→jiàn)。這(zhè)是(shì)最常見(jiàn)的(de)RTE<< 生(shēng)成結果,但(dàn)一(yī)≥∏ >些(xiē)集成商也(yě)更喜歡為(wèi)每個(gè)SWC生(shēng)成單獨的(♠'★•de)RTE文(wén)件(jiàn)(.c 和(hé) .♣§h),這(zhè)些(xiē)文(wén)件(jiàn)進一(yī)步包含在主RTE文($$λ©wén)件(jiàn)中,隻是(shì)為(wèi)了₽←♣(le)便于管理(lǐ)項目的(de)RTE文(wén)件(jiàn),這(zh≈₹ è)樣的(de)生(shēng)成選項可(kě)☆'≠能(néng)因AUTOSAR GUI工(gōng)具而異。RTE生(shēng)成器(qì)↓↑₹可(kě)以是(shì)單獨的(de)工(gōng)具,也(yě)可(kě)以是£☆φ(shì)完全取決于您使用(yòng)的(de)工(gōng)具供應商的(de₽≠¥)集成工(gōng)具。例如(rú),在Vector DaVinci的(de)情況€α♦下(xià),DaVinci developer用(yòng)于SWC、Runnable✘€s、IDT 創建等,而DaVinci configurator用(yòng☆ ©)于配置BSW和(hé)生(shēng)成λ★RTE。在任何基于AUTOSAR的(de)系統中,RTE↕₩₩是(shì)為(wèi)每個(gè)ECU單獨生(shēng)成的(de),≠δ因為(wèi)每個(gè)ECU的(de)SWC可(kě &)能(néng)有(yǒu)自(zì)己 獨特的(de)要(yào)求,因此RTE是(shì)為(wèi)滿足這(zhè)些(xi'♠δē)要(yào)求而定制(zhì)的(de)。
image-202206101052356©×88
上(shàng)圖給出了(le)關于SWC和(hé)RTE生(shēng)成器(qì↑∑)軟件(jiàn)的(de)RTE生(shē ☆ng)成步驟。讓我們詳細了(le)解每個(gè)步驟:
- 收集可(kě)用(yòng)SWC實現(xiàn) 此步驟包括收集SWC描述文(wén)件(jiàn)(如(rú←♦™∑)果打算(suàn)重用(yòng)舊(jiù)SWC)及其各自(zì♣✔π)的(de)Composition SWCs并進一(yφ¥ī)步使用(yòng)它們。或者我們也(yě)可(kě)以創建新的(de)SWC實現(xiàn¥≥)并将其用(yòng)于進一(yī)步的(de)步驟。
- 配置系統 本步驟結合了(le)舊(jiù)步驟中的(de)SWC,并配置了(le)系統(整∑×車(chē)ECU網絡),該系統具有(yǒu)不(bù)同ECU和(hé)其他(tā)系統約束的♦☆(de)不(bù)同組成SWC。在此步驟中,所有(㶥yǒu)SWC都(dōu)映射到(dào)各自(zì)的(de)ECU。
- 系統配置說(shuō)明(míng) arxml文(wén)件(jiàn),其中✔π>€包含整個(gè)系統(車(chē)輛(liàng))的(de)ECU的(de)詳細信¶✘∏<息,該文(wén)件(jiàn)在系統配置後←↕☆♥生(shēng)成。
- 提取ECU特定信息 提取單個(gè)ECU的(de)SWC描述和(hé)其他(tā)詳細信息,不(bù)同于包含車(∏✘'∞chē)輛(liàng)中所有(yǒu)ECUδ&信息的(de)系統配置描述文(wén)件(jiàn)。
- 生(shēng)成ECU配置 此步驟涉及配置RTE下(xià)層BSW中模塊比如(rú)COM Service等模™Ω♥ 塊的(de)配置,這(zhè)一(yī)步生(shēng)成的(de)也(yě)是$©(shì)一(yī)個(gè)arxml文(wén)件(jiàn)其包含所有(yǒ'ε§∑u)ECU的(de)信息,比如(rú)BSW的(de₹±>)配置,SWC的(de)配置等。
- 生(shēng)成RTE 此步驟中,所有(yǒu)Runnables映射到(dào)操作(zuò)系統任務,所有(yǒuλ↑↑₩)connetions連接到(dào)實際的(de)信号。此步驟的(de)輸出為(wèi)Rte.c和(hé)Rte.h文(wén)件(jiàn),大(dà)緻可(kě)以∞'♦稱為(wèi)AUTOSAR的(de)RTE層。此步驟還(€→✔hái)生(shēng)成BSWMD(基本軟件(jiàn)模塊描述)文(wén)件(jiàn♦λ♣≤),其中包含RTE不(bù)同功能(néng)的(de)信息。
- 編譯RTE 顧名思義,在這(zhè)一(yī)步中,将編譯RTE文(↓¶φ♠wén)件(jiàn),并生(shēng)成目标文(wén)件(jiàn),然後将這(zhè)些('∏★xiē)文(wén)件(jiàn)與其他(tā)已編←☆∞譯的(de)BSW和(hé)SWC文(wén)件(jiàn)鏈接,以生§£(shēng)成可(kě)刷寫到(dào)β≠MCU的(de)可(kě)執行(xíng)文(wén)件(jiàn)。
對(duì)于系統的(♦♦↔™de)每個(gè)ECU,都(dōu)會(huì)重複以上(shàng)步驟。除了(le)RTE文(w ∑én)件(jiàn)外(wài),還(hái)會(huì)為(wè™&✔€i)每個(gè)SWC生(shēng)成SWC文(wén)件(jiàn)(.h和(↔¥₹"hé).c),一(yī)些(xiē)軟件(jiàn)還≠₹(hái)會(huì)在SWC.c文(wén)件(jiàn)中生(shēng)成可(kě)運行(x ¶íng)的(de)框架,在SWC.h文(wén)件(&&×jiàn)中生(shēng)成函數(shù)原型。所有(yǒu)>♣₩RTE文(wén)件(jiàn)均按照(zhào)[MISRA]生(shēn♥"$&g)成(https://en.wikipedia.org/wα♦iki/MISRA_C)-C标準,雖然允許一(yī)些(xiē)MISRA*違規行(x>≥íng)為(wèi),但(dàn)此類情況記錄在評論中。RTE源文(wén)件(jiàn)具有 ↑≈♥(yǒu)應用(yòng)程序和(hé)其他(t>₽ ā)層所需的(de)RTE調用(yòng),R±☆TE頭文(wén)件(jiàn)具有(yǒu)這(zhα♣λè)些(xiē)調用(yòng)的(de)原型。
由于AUTO•£★SAR的(de)主要(yào)目标是(shì)SWC的(de)“重用(yòng)能(né ₩♠ng)力”,因此RTE支持不(bù)同AUTOSAR版本的(d'↕•e)SWC兼容性,前提是(shì)SWC在其源文(wén)件(jiàn)中可(kě)用(♦ Ωyòng),而不(bù)是(shì)在目标代碼中可(kě)用(yòng)。Sπ>✘WC的(de)兼容性和(hé)重用(yòng)能(néng)λβ®∏力不(bù)僅限于AUTOSAR版本,還(h≥≈φ÷ái)包括工(gōng)具供應商的(de)獨立¥ 性,即可(kě)以使用(yòng)來(lái)自(zì)不(bù)同工(gōng)具供應商$✔的(de)SWC,前提是(shì)其源代碼可(kě)用(yòng)。
RTE API
RTE提供多(duō)種API以便SWC使±®ββ用(yòng)從(cóng)其他(tā)SWC或者低(dī)層訪問(wèn)數(shù)據。RTα∑™≠E APIs可(kě)以簡單的(de)根據任何函數(shù)的(de)Rte_prefix識别,通(tōng)常分(fēn)為(wèi)2種類型:
- Direct API:在需要(yào)高(gāo)效(零運行(xíng)時($β∞shí)開(kāi)銷)調用(yòng)時(shí£₽)使用(yòng)。這(zhè)些(xiē)API是(shì)為(wèi)每個(gè)端口生(↑λ∞≈shēng)成的(de),應用(yòng)程序可(×&kě)以通(tōng)過在Runnable♦Ω中調用(yòng)API名稱直接使用(yòng)它。在映射Aλπ€PI時(shí),可(kě)以針對(duì)SWC優化(huà)此類API。通×¥(tōng)常,Direct API實現(xiàn)為(wèi)宏。因此,不(bù∑♠₹∞)可(kě)能(néng)獲得(de)RTE API的(de)地απ(dì)址來(lái)與C中的(de)函數(shù)指針一(yī)起使用(yòng)。
- Indirect API:使用(yòng)端口句柄間(jiān)接調用(yòng)API。這(zhè)種形式效率較低(d'♣ī)(間(jiān)接尋址無法優化(huà)),但(d'βàn)支持一(yī)種可(kě)能(néng)更方便≈♠的(de)不(bù)同編程風(fēng)格。
直接和(hé)間(jiān)接API調用("<εyòng)都(dōu)将生(shēng)成相(xiàng)同的 ±σ(de)結果,隻是(shì)調用(yòng)方式不(bù)同。在SWC中'×,我們可(kě)以使用(yòng)間(jiān)接或直接API實現(xiàn")。
RTE生(shēng)成的(de)文(wén)件(jiàn)關系
在RTE生(shēng)成之後,RTE生(shē ₹₽ng)成器(qì)工(gōng)具會(huì)生(shēng)成許γ§多(duō)文(wén)件(jiàn),其中的(de)頭文(wé→>→n)件(jiàn)與其他(tā)文(wén)件(j>☆±iàn)有(yǒu)關系,即這(zhè)些(xiē)≤$文(wén)件(jiàn)被#included到(dào)不(bù)同♣<→的(de)文(wén)件(jiàn)中。這(z&±₽£hè)些(xiē)文(wén)件(jiàn)以及它們與其他(tā)文(wén)件(jiàn)的Ω↓£♠(de)關系如(rú)下(xià):
- Rte.h:這(zhè)個(gè)文(wén)件(jiàn)定義了₩'(le)不(bù)需要(yào)為(wèi)每個(gè)ECU生(shēng)成的(de)固定元素×,因為(wèi)這(zhè)個(gè)RTE生(shē£↑ng)成器(qì)軟件(jiàn)不(bù)會(huì)一$¥↔(yī)次又(yòu)一(yī)次地(dì₽∑↑)生(shēng)成這(zhè)個(gè)文(w< ↔én)件(jiàn)。但(dàn)是(shì),如(rú)果需要(yào),我們可≈₩∑(kě)以定制(zhì)此文(wén)件(jiàn)以滿足我們的(d↑ ☆×e)應用(yòng)程序。該文(wén)件(jiàn)包括S∑¥Ωφtd_Types.h文(wén)件(jiàn)。
- Std_Types.h:該文(wén)件(jiàn)是(shì)标準的(de)AUTOS♠←AR文(wén)件(jiàn),它定義了(le)基本數(shù→★)據類型,如(rú)無符号和(hé)有(yǒu)符号整數(shù)的(φ§♥"de)平台特定實現(xiàn),并提供了(le)訪問(wèn)編譯器(qì)抽象的(dγφγe)方法。
- Rte_Main.h:這(zhè)是(shì)生(shēng)命周期頭文(wén)件(≥λjiàn),其中包含RTE生(shēng)命 ↔γ周期API的(de)函數(shù)原型,如(rú)Rte_Start和(hé)Rte_Stε$op 。有(yǒu)些(xiē)軟件(jiàn)還(hái)增加了(le)更多(duō©γ)的(de)生(shēng)命周期API,用($λyòng)于RTE內(nèi)存的(de)初始化(huà)等。這(zhè)個(g♠λ'♠è)文(wén)件(jiàn)包括Rte.h文(wén)件(j§φ≈iàn)。
- Rte.h:這(zhè)是(shì)特定于↔∑§≤應用(yòng)程序的(de)RTE頭文(wén)件(jiàn),因為(wèi)名稱說(shuō♠¶↔→)明(míng)文(wén)件(jiàn) φ↕φ名的(de)前綴始終是(shì)Rte_,後綴是(shì)與此RTE應用(yòng)程序文(wén)件(™¶←♦jiàn)關聯的(de) SWC 名稱。σ©←該文(wén)件(jiàn)包含與 SW↔♠∞C 相(xiàng)關的(de) SWC 中使用(yòng)的(de)R∏®¥TE API的(de)函數(shù)原型、數(shù)據結構和(hé)Runnable的($γde)函數(shù)原型。該文(wén)件(jiàn)∑★$ 包括Rte_Type.h和(hé)Rte_DataHandle.h 文(wén)件('β≈♥jiàn)
- Rte_Type.h:此文(wén)件(jiàn)包含從(cóng)在§Ω∞SWC配置期間(jiān)配置的(de)實現(xiàn)數(shù)據類型派生₹∑(shēng)的(de)RTE特定類型聲明(mí>↓ng)。此文(wén)件(jiàn)還(há→✔i)包含對(duì)RTE API有(yǒu)用(yònδδg)的(de)AUTOSAR數(shù)據類型。該文(σwén)件(jiàn)包括 Rte.h 文(wén)件(jiàn)。
- Rte_DataHandleType.h:此文(wén)件(jiàn)包含SWC數(shù)據結構 >所需的(de)數(shù)據句柄類型聲明(míng)。該文(wén)件('↓ jiàn)不(bù)包含任何會(huì)占用(yòng)內(nèi)存的(de)符号。
- Rte__Type.h:這(zhè)也(yě)稱為(wèi)應用(yòng)程序類型頭文(wén±¥↕)件(jiàn),它包含與應用(yòng)程序相(xiàng)關的(δ"de)常量,如(rú)SWC中使用(yòng)的∏☆(de)範圍值或枚舉值。該文(wén)件(j↕✘δiàn)包括Rte_Type.h文(wén)件(jiàn)。
轉自(zì)汽車(chē)電(diàn)子(zǐ)與軟件(jiàn)