Autosar Os overview
Autosar Os 在Autosar 框架中上至RTE 下至驅(qū)動,中間可以和BSW 基礎(chǔ)模塊進(jìn)行交互。是整個autosar 框架下最重要的組成部分。
其中Syser Services 為一些系統(tǒng)服務(wù),不屬于操作系統(tǒng)。下文僅對 Os 進(jìn)行描述
OS 與 BSW 各模塊關(guān)系
雖然說OS 是整個框架的靈魂,但是也有極少數(shù)的BSW 模塊不與OS 直接交互。換句話說,其他BSW 模塊在改動的時候,是需要考慮一下OS 對其的影響,和它對OS 的影響。
這里可以看到除了cdd 都是無限制的與os交互。只有cdd 是有限制的和os 進(jìn)行交互。
OS 的類別與其功能
AUTOSAR OS 和 OSEK OS 都是為汽車領(lǐng)域而開發(fā)的實時操作系統(tǒng)。雖然它們都致力于提供實時性能、可靠性和穩(wěn)定性,但其設(shè)計理念和實現(xiàn)方式有所不同。AUTOSAR OS 旨在提供更高級的軟件體系結(jié)構(gòu)和更多的配置選項,以支持更復(fù)雜的汽車軟件系統(tǒng);而 OSEK OS 更加簡單和輕量級,適用于較小規(guī)模的汽車電子系統(tǒng)。兩者可以共存,也可以相互補充,以滿足不同汽車應(yīng)用的需求。
TASK
OS 的task 分為兩種。
-- 基本任務(wù)
-- 擴展任務(wù)
其主要的區(qū)別就是有無waiting狀態(tài)。這里先表示一下基本狀態(tài),下面對其使用棧詳細(xì)描述可以按需在實際架構(gòu)中設(shè)計,使用。
TASK - 搶占機制
01非搶占
這里可以看出,當(dāng)任務(wù)被設(shè)定為非搶占的時候,當(dāng)任務(wù)沒有完成時,即使高優(yōu)先級的任務(wù)到來,也無法將其搶占。
一般情況下我們可以把初始化的任務(wù),以及一些模式切換時候,必須進(jìn)行的一些操作,這類任務(wù)設(shè)計成非搶占的任務(wù)。
02搶占
為了更好的利用OS 來壓榨硬件資源,大部分的任務(wù)都會被設(shè)計成搶占式任務(wù)。一般的原則,重要的任務(wù)優(yōu)先級高,需要運行時間較短的任務(wù)優(yōu)先級高。
03合作
這里就很靈活,但是需要在代碼過程中設(shè)計好什么時候讓出CPU。但是處理得好的話,會拖慢CPU, 無法最大限度的壓榨硬件,高優(yōu)先級的任務(wù)被耽誤。
#includeTASK(Cooperative) {Function1(); Schedule();/* Allow preemption */ Function2(); Schedule();/* Allow preemption */ Function3(); Schedule();/* Allow preemption */ Function4(); TerminateTask(); }
任務(wù)在配置過程中最重要的下面幾個參數(shù),需要注意。這里尤其要注意使用棧的大小。因為這個真的有可能會讓軟件運行奔潰。其他的參數(shù)最多是運行不正常。
TASK - 棧的使用
Autosar os的棧使用是單一棧策略。假設(shè)定義了32k的棧。那么所有的task都使用這一個大的??臻g。那就是說,當(dāng)有任務(wù)搶占的時候,棧是疊加使用的。下面是
搶占時候使用的棧情況。
這里可以看出來,當(dāng)有高優(yōu)先級的任務(wù)運行的時候,棧的使用空間是一直增大的。這時候就需要注意上面定義的32k 夠不夠用了。因為他們所有的task公用一個棧。
下面是非搶占時候使用棧的情況。
這里就相對簡單多了,棧的使用就是和當(dāng)前運行的task所需要的棧的情況是一樣的。
前面說到擴展任務(wù)的情況呢。
這里操作系統(tǒng)會根據(jù)靜態(tài)配置的任務(wù)使用的棧,進(jìn)行預(yù)留。換句話說就是配置完擴展任務(wù)后,os 根據(jù)優(yōu)先級比擴展任務(wù)優(yōu)先級高的任務(wù)使用棧的最大總和,預(yù)留一下。把擴展任務(wù)的棧至于棧底 + 最大使用量。當(dāng)擴展任務(wù)到running狀態(tài)后,直接就在規(guī)定的棧地方運行。所以這里很考驗前面的所有task的棧,如果是使用超了,這時候程序必然就崩了。
中斷
Interrupt
Category 1
?Os 無法給一類中斷提供服務(wù)
?一類中斷不與Os交互
?一類中斷優(yōu)先級高于Os 以及所有的二類中斷
?可以通過Os 接口對一類中斷進(jìn)行enable/disable
Category 2
?二類中斷受到Os管控
?硬件中斷向量指向Os內(nèi)部
?有限制使用os 接口不允許 TerminateTask, WaitEvent, ClearEvent, Schedule, ChainTask
下圖可以看出來一類中斷時獨立于os的,高于os的。根據(jù)不同的芯片是不同的,有的芯片的中斷優(yōu)先級是組類別,有的是獨立的。也就是說中斷是否可以嵌套。
下面是當(dāng)二類中斷發(fā)生,這時候我們的os將會怎么處理呢。
當(dāng)硬件終端觸發(fā),并且ICU模塊處理完成之后,到達(dá)了OS 。這時候OS 根據(jù)靜態(tài)配置進(jìn)行操作,對上下文進(jìn)行切換與保存現(xiàn)場。
在配置過程中很簡單,但是對于實際的操作我們需要注意優(yōu)先級,一般情況我們都會使用二類中斷。這樣會減少os的影響。減少系統(tǒng)的不可控性。
如何有效率的使用中斷。
#includeISR(InefficientHandler) { /* Long handler code. */ } #include ISR(EfficientHandler) { ActivateTask(Task1); } TASK(Task1) { /* Long handler code. */ TerminateTask(); } #include ISR(Interrupt1) { /* Dismiss the interrupt where required */ /* Rest of the handler */ }
異步處理,不將中斷的回調(diào)一直處理完。而是激活一個task,進(jìn)行處理,當(dāng)然這也是要根據(jù)實際場景進(jìn)行設(shè)計。
resource
Resource 基礎(chǔ)介紹
?Standard resource 標(biāo)準(zhǔn)的二進(jìn)制狀態(tài)
?Linked resource 可以嵌套的二進(jìn)制狀態(tài)
?Internal resource 以任務(wù)為基礎(chǔ)的二進(jìn)制狀態(tài)
Standard resource 標(biāo)準(zhǔn)的二進(jìn)制狀態(tài) 具體使用
#includeTASK(Task1) { ... GetResource(Resource1); /* Critical section. */ ReleaseResource(Resource1); ... TerminateTask(); }
代碼片段:可切換語言,無法單獨設(shè)置文字格式
可以看出這類是最簡單的,一個get 一個 release. 中間的 就是會被鎖住的資源。其他地方無法進(jìn)行訪問。需要這個release之后才可以。
Linked resource 可以嵌套的二進(jìn)制狀態(tài)
#includeGetResource(Resource1); GetResource(Resource2); GetResource(Resource3); ReleaseResource(Resource3); ReleaseResource(Resource2); ReleaseResource(Resource1); }
代碼片段:可切換語言,無法單獨設(shè)置文字格式
和上面很相似,不過必須是一個對應(yīng)一個。一個解開一個。
舉個例子錯誤使用
#includeTASK(Write){ /* Highest priority .*/ WriteBuffer(); GetResource(Guard); BufferNotEmpty = True; ReleaseResource(Guard); ChainTask(Read); } TASK(Read){ /* Lowest priority. */ ReadBuffer(); GetResource(Guard); if( BufferNotEmpty ) { ReleaseResource(Guard); ChainTask(Read); } else { ReleaseResource(Guard); TerminateTask(); } }
tips: 任務(wù)結(jié)束前,沒有release.
Schedule table
區(qū)別于rtos, 這里有調(diào)度表,屬于靜態(tài)配置的調(diào)度器。可以說是一系列的event的組合。
下面也給了schedule table 和 event的對比。用起來相當(dāng)?shù)姆奖恪?/p>
這里簡單介紹兩個schedule table 的api
?Start absolute point
?Start relative point
一般情況下我們系統(tǒng)里只需要一條schedule table即可。所以這些api 在外部用的也很少。這里只需要直到,如果當(dāng)架構(gòu)設(shè)計需要多條schedule table的時候,我們可以通過一系列條件,手動的調(diào)度起來。讓這上面的point 內(nèi)部的task 以此運行。
配置
配置也相對比較簡單。也基本不需要配置,因為在左外SWC 設(shè)計,完成RTE 的配置之后。這個table的屬性就已經(jīng)被定義好了。只是通過OS 將其生成代碼。
stack monitor 棧監(jiān)控
最上面提到task的一個配置參數(shù),棧的使用。
這里面就是可以激活OS 對棧使用的監(jiān)控。os將會自動monitor
下面截取一段代碼,解釋了一下os如何獲取棧的使用情況。在使用過程中,我們用戶可以利用這個api進(jìn)行一些自己的monitor.
當(dāng)然實現(xiàn)方式千千萬,我們還是要了解一下實際的原理。
下圖可以看出來。不同地方調(diào)用 GetStackUsage結(jié)果可能是不同的。
所以一般來說,我們可以選擇高優(yōu)先級的任務(wù)進(jìn)行執(zhí)行該api. 進(jìn)而獲取
time protection 時間保護(hù)
對于時間保護(hù)我們一般采類似于下面的時間約束。
這是什么意思呢。
1ms的任務(wù) 如果在5ms內(nèi) 沒有被執(zhí)行完,則認(rèn)為有問題。
3ms的任務(wù) 如果在10ms內(nèi)沒有被執(zhí)行完,則認(rèn)為有問題。
5ms的任務(wù) 如果在15ms內(nèi)沒有被執(zhí)行完,則認(rèn)為有問題。
下面有個例子。
看似是C 沒有執(zhí)行完。確實os 報錯 應(yīng)該報的是C 任務(wù)沒有規(guī)定時間內(nèi)完成。
但是原因缺失上面的A 和 B。所以實際情況,還是需要根據(jù)調(diào)度關(guān)系進(jìn)行分析。問題不一定處在報錯的任務(wù)。
關(guān)于配置方面也很簡單。
memory protection 內(nèi)存保護(hù)
內(nèi)存保護(hù)的機制通過os-application 的 trust 和 non-trust 進(jìn)行隔離開。
對讀寫的限制,對運行的隔離。
當(dāng)其中一個os-application 發(fā)生故障,可以獨立的關(guān)閉其中一個os-application ,其他的os-application 不受影響。
對外設(shè)的訪問,對內(nèi)存特殊區(qū)域的訪問的約束??梢酝ㄟ^trust non-trust 來約束。
這樣可以一定程度上減少 讓os崩潰的可能發(fā)生
審核編輯:湯梓紅
-
模塊
+關(guān)注
關(guān)注
7文章
2788瀏覽量
50362 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7147瀏覽量
125572 -
OS
+關(guān)注
關(guān)注
0文章
93瀏覽量
35116 -
AUTOSAR
+關(guān)注
關(guān)注
10文章
379瀏覽量
22656 -
BSW
+關(guān)注
關(guān)注
0文章
15瀏覽量
3598
原文標(biāo)題:Autosar Os 一文入門
文章出處:【微信號:談思實驗室,微信公眾號:談思實驗室】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
TC397如何同時運行CP Autosar OS和FreeRTOS?
TC387配置Autosar OS后主核跑飛了怎么解決?
AUTOSAR是什么
CP AUTOSAR EcuM的相關(guān)資料下載
介紹AUTOSAR支持的四種功能安全機制
AUTOSAR功能安全機制之內(nèi)存分區(qū)與實現(xiàn)
可以在S32DS的S32K144-Q100板上運行的AUTOSAR OS演示程序在哪里?
“E:\NXP\AUTOSAR\S32K_AUTOSAR_OS_4_0_98_RTM_1_0_0sample\standard\sc1”編譯時無法生成sample1_cfg.o怎么解決?
LLCE driver是否可以在非autosar os中運行?
AUTOSAR入門

搞一下CP AUTOSAR 入門 | 04 CP AUTOSAR EcuM 詳解

RIOT-OS入門 Windows系統(tǒng)下在STM32上運行RIOT OS

一文讀懂DDS和AUTOSAR Adaptive的集成
如何在AUTOSAR OS系統(tǒng)運行時使用事件Event呢?

評論