0. 系列概述
OSEK是由歐洲自動化協(xié)會對汽車電氣制定的開放式系統(tǒng),全稱為OS-EK/VDX。
RTA-OS是基于OSEK OS的符合AUTOSAR規(guī)范的OS,是一種靜態(tài)可配置、搶占式、實時操作系統(tǒng)(RTOS),用于高性能、資源受限的應用程序。
AUTOSAR OS主要包含Task, ISRs, Events, Resources, Application, Counter, Alarms, Schedule Table等OS對象。后續(xù)將對如上提到的八個對象進行分別介紹,本篇介紹的內(nèi)容為Task,下面進入正題:
1.Task概述
任務調(diào)度分為靜態(tài)調(diào)度及動態(tài)調(diào)度,二者區(qū)別為,靜態(tài)調(diào)度是在調(diào)度前就已經(jīng)配置好,而動態(tài)調(diào)度是根據(jù)負載率自動去調(diào)度的。在OSEK的OS系統(tǒng)中,Task是主要部分,RTOS里是靜態(tài)調(diào)度,在單個處理器上一次只運行一個任務,不同任務之間通過調(diào)度表或者Alam進行切換。
2. 基本概念
2.1 基礎任務與擴展任務
當前項目中基本使用的都是BASIC類型。
2.1.1 基礎任務
狀態(tài):Running,Ready,Suspended。
基本任務開始、執(zhí)行和終止(這通常稱為單次任務模型)。只有當基本任務終止或被更高優(yōu)先級的任務搶占時,它才會釋放處理器。這種行為使它們非常適合嵌入式控制功能。基本任務快速有效。
2.1.2 擴展任務
擴展任務啟動、執(zhí)行、等待事件(Wait event)和(可選)終止。擴展任務在執(zhí)行期間自動掛起自身任務的能力為任務提供了一種具有同步點的方法。此功能使擴展任務比基本任務更適合于需要中間執(zhí)行同步的功能。
擴展任務時間響應較快,但會一直占用Ram資源,相當于以空間換時間。
2.2 任務狀態(tài)
任務的狀態(tài)包括:Ready、Running 、(Waiting) 、Suspended
所有任務默認的狀態(tài)都是Suspended狀態(tài),在被激活后才變成Ready狀態(tài),當該任務為系統(tǒng)中的最高優(yōu)先級任務時即轉為Running狀態(tài),并開始執(zhí)行任務,同時任務可能被更高優(yōu)先級的任務搶占,重新變成Ready狀態(tài)。
任務通過終止返回到掛起(Suspended)狀態(tài)。一項任務可以在以后再次準備好,整個過程可以重復。
但是,擴展任務也可以進入Waiting狀態(tài)。當擴展任務通過等待事件自動掛起時,它將從Running狀態(tài)移動到Waiting狀態(tài)。
當擴展任務進入Waiting狀態(tài)時,操作系統(tǒng)將分派準備運行的最高優(yōu)先級任務。設置事件后,任務將從Waiting狀態(tài)移動到Ready狀態(tài)。請注意,擴展任務返回到Ready狀態(tài),而不是Running狀態(tài)。這是因為,在擴展任務處于Waiting狀態(tài)期間,其他一些更高優(yōu)先級的任務可能已被激活,然后被調(diào)度。
Event只是用于為系統(tǒng)事件提供指示器的操作系統(tǒng)對象。事件示例包括數(shù)據(jù)準備好使用或正在讀取傳感器值。
激活Task的方式有:調(diào)用ActivateTask() API,或Alarm到期或調(diào)度表
2.3 任務優(yōu)先級
AUTOSAR-OS運行任務可以享有同一優(yōu)先級,同一優(yōu)先級的任務以先進先出FIFO(First In First Out)的原則從Ready狀態(tài)Release。
使用時需避免使用Share Priorities,實時性差,無法進行調(diào)度可行性分析。
2.4 任務激活
2.4.1 隊列任務激活
在大多數(shù)情況下,僅需任務處于掛起狀態(tài)時激活它。事實上,AUTOSAR OS將處于就緒、運行或等待狀態(tài)的任務激活視為錯誤情況。
但是,在某些情況下,可能需要實現(xiàn)一個系統(tǒng),該系統(tǒng)必須多次激活同一任務,但連續(xù)激活之間最短的時間可能小于運行該任務所需的時間。例如,用戶可能正在任務中解包CAN總線幀,并且需要處理網(wǎng)絡上幀的瞬時突發(fā),這意味著用戶需要在運行時對任務激活進行排隊。
AUTOSAR OS允許對基本任務的激活進行排隊,以幫助構建此類應用程序。與AUTOSAR OS中的其他功能一樣,任務隊列的大小是靜態(tài)配置的。必須指定任務可以掛起的最大激活次數(shù)。如果超過激活的最大次數(shù),激活將被忽略。
2.4.2 異步任務激活
AUTOSAR OS允許別的核激活當前核的Task,而不是從任務實際運行的核激活任務。雖然這可能很有用,但可能會影響性能.因為要完全符合AUTOSAR,所有任務激活(包括SetEvent)必須阻止調(diào)用方,直到任務狀態(tài)更新。在內(nèi)部,操作系統(tǒng)必須使用內(nèi)部自旋鎖來協(xié)調(diào)與所屬核的狀態(tài)更改。這會對所有核的性能產(chǎn)生重大影響。
2.5 任務調(diào)度
RTA-OS提供了一種根據(jù)提前固定好的不同優(yōu)先級的任務間切換執(zhí)行的調(diào)度方式。優(yōu)先級排序的原則一般為:執(zhí)行時間越短,執(zhí)行頻率越快的優(yōu)先級越高。但無論選擇如何分配優(yōu)先級,任務執(zhí)行的順序都由調(diào)度策略決定。調(diào)度策略確定任務實際運行的時間,AUTOSAR OS支持兩種調(diào)度策略:
2.5.1 搶占式調(diào)度
當一個Task正在運行,另一個更高優(yōu)先級的任務準備運行,此時高優(yōu)先級的任務會搶占執(zhí)行,這也被稱為任務切換,高優(yōu)先級任務執(zhí)行完畢后,原來的task繼續(xù)執(zhí)行。
2.5.2 非搶占式調(diào)度
與搶占式調(diào)度不同的是,如果高優(yōu)先級任務準備就緒,那么它將保持準備運行狀態(tài),直到運行任務終止—它不會搶占。這意味著開始運行的非搶占式任務將始終運行到完成,然后終止。
2.5.3 協(xié)作式調(diào)度
此外,AUTOSAR OS提供了對第三種稱為協(xié)作調(diào)度的調(diào)度的支持,因為它允許非搶占式任務告訴OS何時可以搶占。之所以說AUTOSAR OS支持兩種策略,是因為只有兩種配置—第三種配置必須自己構建。
操作系統(tǒng)運行準備運行的最高優(yōu)先級任務。如果更高優(yōu)先級的任務準備就緒,那么它將保持就緒,直到以下任一情況:
1) 正在運行的任務終止(就像非搶占式調(diào)度一樣);
2) 或者正在運行的任務發(fā)出Schedule()API調(diào)用,告訴操作系統(tǒng)它可以被搶占。
當發(fā)出Schedule()調(diào)用時,優(yōu)先級較高的任務會搶占正在運行的任務,當高優(yōu)先級任務完成后,搶占任務將恢復。這種合作模式提供的系統(tǒng)雖然不如完全搶占式系統(tǒng)響應快,但不會出現(xiàn)非搶占式調(diào)度缺乏響應的情況。
3. Task 配置
包括:name、Priority、Scheduling、Activation及Autostart
優(yōu)先級:0是最低優(yōu)先級,
調(diào)度:任務可以完全搶占或非搶占地運行。一般來說,為了獲得最佳的應用程序性能,應該選擇完全搶占式調(diào)度而不是非搶占式調(diào)度。
激活:在Ready狀態(tài)下可以排隊的最大任務激活數(shù)。對于BCC1、ECC1和ECC2任務,激活次數(shù)始終為一次。這意味著這些類型的任務只有在處于掛起狀態(tài)時才能激活。在未掛起的情況下,嘗試激活此類任務將導致錯誤。大于1的值表示操作系統(tǒng)將對激活進行排隊,任務結束時再次激活。
4. 堆棧管理
RTA-OS使用單棧模型,即所有的Task、ISRS在同一個堆棧區(qū)域上運行。
當任務運行時,其堆棧使用量會像正常情況一樣增減。當任務被搶占時,高優(yōu)先級任務的堆棧使用將在同一堆棧上繼續(xù)(就像標準函數(shù)調(diào)用一樣)。當任務終止時,它使用的堆棧空間將被回收,然后重新用于下一個優(yōu)先級最高的任務運行(同樣,與標準函數(shù)調(diào)用一樣)。下圖顯示了單堆棧在聲明、搶占和終止任務時的行為。
在單堆棧模型中,堆棧大小與系統(tǒng)中優(yōu)先級的數(shù)量成比例,而不是與任務/ISR的數(shù)量成比例。這意味著,直接或通過共享內(nèi)部資源,或通過被配置為非先發(fā)制人,共享優(yōu)先級的任務永遠不會同時出現(xiàn)在堆棧上。在硬件上共享優(yōu)先級的ISR也是如此。這意味著用戶可以通過簡單的配置更改來交換系統(tǒng)響應性,即任務或ISR完成所需的時間,以換取堆棧空間。
上圖顯示了同一任務集的執(zhí)行情況,具有與上上圖相同的到達模式,但這次任務是非搶占式調(diào)度的。可以看到,高優(yōu)先級任務的響應時間比搶占式調(diào)度時長得多,但總體堆棧消耗要低得多。
單堆棧模型還顯著簡化了鏈接時的堆棧空間分配,因為用戶只需為整個系統(tǒng)堆棧分配單個內(nèi)存部分,就像根本不使用操作系統(tǒng)一樣。
4.1 擴展任務的堆棧管理
RTA-OS獨特地擴展了單堆棧模型,在不影響基本任務性能的情況下為擴展任務提供支持。在RTA-OS中,擴展任務的生命周期如下:
Suspended→Ready:任務被添加到Ready 序列
Ready→Running:任務已調(diào)度,但與內(nèi)容位于堆棧頂部的基本任務不同,內(nèi)容位于堆棧空間中,所有低優(yōu)先級任務的預先計算的最壞情況搶占深度處。
Running→Ready:擴展任務被搶占。如果搶占任務是一個基本任務,那么它會像往常一樣在堆棧頂部調(diào)度;如果搶占任務是一個擴展任務,那么它將按照預先計算的所有低優(yōu)先級任務的最壞情況搶占深度進行調(diào)度。
Running→Waiting:任務的等待事件堆棧內(nèi)容(包括操作系統(tǒng)上下文、本地數(shù)據(jù)、函數(shù)調(diào)用的堆棧幀等)保存到內(nèi)部操作系統(tǒng)緩沖區(qū)中。
Waiting→Ready:任務添加到Ready 隊列。
Running→Suspended:任務的“等待事件堆棧”內(nèi)容將從內(nèi)部操作系統(tǒng)緩沖區(qū)復制回堆棧中所有低優(yōu)先級任務預先計算的最壞情況搶占深度。
擴展任務管理要求RTA-OS知道任務和ISR使用了多少堆棧。以下各節(jié)描述了各種配置參數(shù)。
4.2 處理堆棧溢出
如果用戶提供給RTA-OS的堆棧分配太小(運行時錯誤的潛在來源),有三種錯誤情況可能發(fā)生:
1.當RTA-OS嘗試調(diào)度擴展任務時,堆棧指針的當前值高于計算的最壞情況調(diào)度點,因此擴展任務無法啟動。這意味著堆棧上的一個(或多個)低優(yōu)先級任務占用了太多空間。
2.擴展任務無法從等待狀態(tài)恢復,因為堆棧指針高于它應該的值。當為擴展任務正在等待的事件調(diào)用SetEvent()并且擴展任務現(xiàn)在是系統(tǒng)中優(yōu)先級最高的任務時,可能會發(fā)生這種情況。
3.擴展任務無法進入等待狀態(tài),因為任務正在使用的堆棧的當前數(shù)量大于配置的“WaitEvent()堆棧”的大小。
當RTA-OS檢測到擴展任務堆棧管理出現(xiàn)問題時,它將調(diào)用ShutdownOS(),錯誤代碼為E_OS_STACKFAULT。如果要調(diào)試該問題,則可以啟用堆棧故障Hook。配置后,RTA-OS將在堆棧故障發(fā)生時調(diào)用用戶提供的回調(diào)OS_Cbk_StackOverflowHook(),而不是ShutdownOS()。回調(diào)傳遞了兩個參數(shù):溢出的字節(jié)數(shù)、溢出的原因。
5. 任務的控制
5.1 任務激活
任務激活后變?yōu)镽eady狀態(tài),當該任務的優(yōu)先級為所有Ready狀態(tài)的任務及當前處于Running的任務中最高時,開始(或搶占)變成Running狀態(tài)。
任務每次被激活后會運行一次,當激活的次數(shù)超過配置次數(shù)時會報E_OS_LIMIT錯誤。
任務可以通過Tasks或二類中斷激活。
5.1.1 直接激活
可以通過多種不同的方式激活任務。任務激活的基本機制是ActivateTask()API調(diào)用,它直接激活任務。ActivateTask(TaskID)調(diào)用將命名任務置于就緒狀態(tài)。ChainTask(TaskID)終止當前正在運行的任務,并將激活指定任務置于就緒狀態(tài)。
#include
TASK(Task1) {
/* Task1 functionality. */
ActivateTask(Task2);
TerminateTask();
}
TASK(Task2) {
/* Task2 functionality. */
ActivateTask(Task3);
TerminateTask();
}
TASK(Task3) {
/* Task3 functionality. */
TerminateTask();
}
5.1.2 間接激活
通過Alarm激活或通過調(diào)度表激活。
通過Alarm激活:對于系統(tǒng)中的每個Alarm,可以指定一個任務,該任務在每次Alarm過期時激活。
調(diào)度表激活:對于系統(tǒng)中的每個調(diào)度表,可以指定在表上的一個或多個到期點激活的任務。
5.2 任務執(zhí)行順序控制
許多情況下,需要控制任務執(zhí)行的順序,即某個任務的執(zhí)行需要基于前一個任務執(zhí)行的結果。時序的控制可以通過如下三種方式:
?直接激活鏈;
?優(yōu)先級;
?不可搶占的任務。
5.2.1 通過直接激活鏈
當使用直接激活鏈控制執(zhí)行順序時,任務對必須在發(fā)出調(diào)用的任務之后執(zhí)行的任務進行ActivateTask()調(diào)用。
5.2.2 通過任務優(yōu)先級
將需要優(yōu)先執(zhí)行的任務設置更高的優(yōu)先級,在執(zhí)行時即可按搶占式完成。
5.3 RTA-OS中的合作式調(diào)度
當任務以非搶占方式運行時,它會阻止任何任務(包括優(yōu)先級較高的任務)執(zhí)行。然而,有時對于非搶占式任務來說,提供可以進行重新調(diào)度的明確位置是很有用的。這比簡單地非搶占式運行更有效,因為高優(yōu)先級任務對系統(tǒng)刺激的響應時間更短。任務以非搶占方式運行并為重新調(diào)度提供點數(shù)
的系統(tǒng)稱為合作調(diào)度系統(tǒng)。
5.4 任務終止
在AUTOSAR操作系統(tǒng)中終止的任務必須進行API調(diào)用,以告知操作系統(tǒng)正在發(fā)生這種情況。AUTOSAR OS標準定義了兩個用于任務終止的API調(diào)用。其中之一必須用于終止任何任務。這些API調(diào)用是:
? TerminateTask()
? ChainTask(TaskID)
當任務完成時,它必須進行其中一個API調(diào)用。這確保RTA-OS可以正確地安排準備運行的下一個任務。
TerminateTask()強制調(diào)用任務進入掛起狀態(tài)。RTA-OS將在Ready狀態(tài)下運行下一個優(yōu)先級最高的任務。
ChainTask(TaskID)終止調(diào)用任務并激活任務TaskID。因此,該API類似于執(zhí)行TerminateTask(),然后立即執(zhí)行ActivateTask(TaskID)。鏈接任務會將命名任務置于就緒狀態(tài)。
5.5 任務的Idle機制
在任何搶占式OS中,當沒有Task或中斷運行時也必須要有些事情做。在AUTOSAR OS中是通過Idle 機制實現(xiàn)。在RTA-OS中當沒有Task或中斷執(zhí)行時,系統(tǒng)將處于繁忙的等待循環(huán)中。
用戶可以通過聲明一個名為Os_Cbk_idle的回調(diào)函數(shù)來提供自己的空閑機制實現(xiàn)方式,從而覆蓋默認行為。
Os_Cbk_idle的行為較普通Task外有如下不同:
. 不能被激活
. 不能被終止
. 不能被鏈(嵌套)調(diào)用
. 不能使用內(nèi)部資源
Os_Cbk_Idle的優(yōu)先級最低,即當沒有任何及中斷運行時才會Ready to Run。
Os_Cbk_Idle在退出時返回一個布爾值,告訴RTA-Os是否再次調(diào)用Os_Cbk_Idle。當返回TRUE時,RTA-OS將立即再次調(diào)用Os_Cbk_Idle。當返回FALSE時,RTA-OS停止調(diào)用Os_Cbk_Idle并進入繁忙等待循環(huán)的默認行為。
審核編輯 :李倩
-
處理器
+關注
關注
68文章
19160瀏覽量
229116 -
應用程序
+關注
關注
37文章
3243瀏覽量
57600 -
OSEK
+關注
關注
2文章
19瀏覽量
13015
原文標題:RTA OS系列介紹01-Task
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論