0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RTA-OS實時操作系統(tǒng)中的Task對象

汽車ECU開發(fā) ? 來源:CSDN技術(shù)社區(qū) ? 作者:initiallizer ? 2022-04-15 16:43 ? 次閱讀

?系列概述

OSEK是由歐洲自動化協(xié)會對汽車電氣制定的開放式系統(tǒng),全程為OSEK/VDX。RTA-OS是基于OSEK OS的符合AUTOSAR規(guī)范的OS,是一種靜態(tài)可配置、搶占式實時操作系統(tǒng)(RTOS),用于高性能、資源受限的應(yīng)用程序。AUTOSAR OS主要包含Task, ISRs, Events, Resources, Application, Counter, Alarms, Schedule Table等OS對象。后續(xù)將對如上提到的八個對象進(jìn)行分別介紹。本篇介紹的內(nèi)容為Task,下面進(jìn)入正題。

1.Task概述

任務(wù)調(diào)度分為靜態(tài)調(diào)度及動態(tài)調(diào)度,二者區(qū)別為,靜態(tài)調(diào)度是在調(diào)度前就已經(jīng)配置好,而動態(tài)調(diào)度是根據(jù)負(fù)載率自動去調(diào)度的。在OSEK的OS系統(tǒng)中,Task是主要部分,RTOS里是靜態(tài)調(diào)度。對于多任務(wù)并發(fā)行為,與其為每個任務(wù)使用單獨的處理器,一個更經(jīng)濟(jì)可行的方法是在單個處理器上一次只運(yùn)行一個任務(wù),不同任務(wù)之間進(jìn)行切換。

2. 基本概念

2.1 調(diào)度RTAOS提供了一種根據(jù)提前固定好的不同優(yōu)先級的任務(wù)間切換執(zhí)行的調(diào)度方式。優(yōu)先級排序的原則一般為:執(zhí)行時間越短,執(zhí)行頻率越快的優(yōu)先級越高。

但無論選擇如何分配優(yōu)先級,任務(wù)執(zhí)行的順序都由調(diào)度策略決定。調(diào)度策略確定任務(wù)實際運(yùn)行的時間。

AUTOSAR OS支持兩種調(diào)度策略:

2.1.1 搶占式調(diào)度

當(dāng)一個Task正在運(yùn)行,另一個更高優(yōu)先級的任務(wù)準(zhǔn)備運(yùn)行,此時高優(yōu)先級的任務(wù)會搶占執(zhí)行,這也被稱為任務(wù)切換,高優(yōu)先級任務(wù)執(zhí)行完畢后,原來的task繼續(xù)執(zhí)行。

對于所有任務(wù)都需要在運(yùn)行時滿足其最后期限的系統(tǒng),搶占式調(diào)度是最有效的調(diào)度策略,它將保證任務(wù)激活(準(zhǔn)備運(yùn)行)和終止之間的最短時間。此時間稱為任務(wù)的響應(yīng)時間。搶占式的系統(tǒng)需要考慮對共享數(shù)據(jù)的搶占效應(yīng),并可能需要引入并發(fā)控制機(jī)制。

2.1.2 非搶占式調(diào)度

與搶占式調(diào)度不同的是,如果高優(yōu)先級任務(wù)準(zhǔn)備就緒,那么它將保持準(zhǔn)備運(yùn)行狀態(tài),直到運(yùn)行任務(wù)終止—它不會搶占。這意味著開始運(yùn)行的非搶占式任務(wù)將始終運(yùn)行到完成,然后終止。

2.1.3 協(xié)作式調(diào)度

實際上,AUTOSAR OS提供了對第三種稱為協(xié)作調(diào)度的調(diào)度的支持,因為它允許非搶占式任務(wù)告訴OS何時可以搶占。我們之所以說AUTOSAR OS支持兩種策略,是因為只有兩種配置—第三種配置必須自己構(gòu)建。

操作系統(tǒng)運(yùn)行準(zhǔn)備運(yùn)行的最高優(yōu)先級任務(wù)。如果更高優(yōu)先級的任務(wù)準(zhǔn)備就緒,那么它將保持就緒,直到以下任一情況:1) 正在運(yùn)行的任務(wù)終止(就像非搶占式調(diào)度一樣);2) 或者正在運(yùn)行的任務(wù)發(fā)出Schedule()API調(diào)用,告訴操作系統(tǒng)它可以被搶占。當(dāng)發(fā)出Schedule()調(diào)用時,優(yōu)先級較高的任務(wù)會搶占正在運(yùn)行的任務(wù),任務(wù)切換被稱為已發(fā)生oc(就像搶占式調(diào)度一樣)。當(dāng)高優(yōu)先級任務(wù)完成后,搶占任務(wù)將恢復(fù)。通過精心設(shè)計,合作模式提供的系統(tǒng)雖然不如完全搶占式系統(tǒng)響應(yīng)快,但不會出現(xiàn)非搶占式調(diào)度缺乏響應(yīng)的情況。

2.2 基礎(chǔ)任務(wù)與擴(kuò)展任務(wù)

當(dāng)前項目中配置的除SecOC外的Task都是配置的BASIC

2.2.1 基礎(chǔ)任務(wù)

狀態(tài):Running,Ready,Suspended。

基本任務(wù)開始、執(zhí)行和終止(這通常稱為單次任務(wù)模型)。只有當(dāng)基本任務(wù)終止或被更高優(yōu)先級的任務(wù)搶占時,它才會釋放處理器。這種行為使它們非常適合嵌入式控制功能。基本任務(wù)快速有效。

2.2.2 擴(kuò)展任務(wù)

擴(kuò)展任務(wù)啟動、執(zhí)行、等待事件(Wait event)和(可選)終止。擴(kuò)展任務(wù)在執(zhí)行期間自動掛起自身任務(wù)的能力為任務(wù)提供了一種具有同步點的方法。此功能使擴(kuò)展任務(wù)比基本任務(wù)更適合于需要中間執(zhí)行同步(例如,等待用戶交互)的功能。

擴(kuò)展任務(wù)時間響應(yīng)較快,但會一直占用Ram資源,相當(dāng)于以空間換時間。

2.2.3 Task State

Ready、Running 、(Waiting) 、Suspended

所有任務(wù)默認(rèn)的狀態(tài)都是Suspended狀態(tài),在被激活后才變成Ready狀態(tài),當(dāng)該任務(wù)為系統(tǒng)中的最高優(yōu)先級任務(wù)時即轉(zhuǎn)為Running狀態(tài),并開始執(zhí)行任務(wù),同時任務(wù)可能被更高優(yōu)先級的任務(wù)搶占,重新變成Ready狀態(tài)。

任務(wù)通過終止返回到掛起(Suspended)狀態(tài)。一項任務(wù)可以在以后再次準(zhǔn)備好,整個過程可以重復(fù)。

但是,擴(kuò)展任務(wù)也可以進(jìn)入Waiting狀態(tài)。當(dāng)擴(kuò)展任務(wù)通過等待事件自動掛起時,它將從Running狀態(tài)移動到Waiting狀態(tài)。

當(dāng)擴(kuò)展任務(wù)進(jìn)入Waiting狀態(tài)時,操作系統(tǒng)將分派準(zhǔn)備運(yùn)行的最高優(yōu)先級任務(wù)。設(shè)置事件后,任務(wù)將從Waiting狀態(tài)移動到Ready狀態(tài)。請注意,擴(kuò)展任務(wù)返回到Ready狀態(tài),而不是Running狀態(tài)。這是因為,在擴(kuò)展任務(wù)處于Waiting狀態(tài)期間,其他一些更高優(yōu)先級的任務(wù)可能已被激活,然后被調(diào)度。

Event只是用于為系統(tǒng)事件提供指示器的操作系統(tǒng)對象。事件示例包括數(shù)據(jù)準(zhǔn)備好使用或正在讀取傳感器值。

激活Task的方式有:調(diào)用ActivateTask() API,或Alarm到期或調(diào)度表。

2.2.4 任務(wù)優(yōu)先級

AUTOSAR-OS運(yùn)行任務(wù)可以享有同一優(yōu)先級,同一優(yōu)先級的任務(wù)以先進(jìn)先出FIFO(First In First Out)的原則從Ready狀態(tài)Release。

使用時需避免使用Share Priorities,實時性差,無法進(jìn)行調(diào)度可行性分析。

2.2.5 隊列任務(wù)激活

在大多數(shù)情況下,僅需任務(wù)處于掛起狀態(tài)時激活它。事實上,AUTOSAR OS將處于就緒、運(yùn)行或等待狀態(tài)的任務(wù)激活視為錯誤情況。

但是,在某些情況下,可能需要實現(xiàn)一個系統(tǒng),該系統(tǒng)必須多次激活同一任務(wù),但連續(xù)激活之間最短的時間可能小于運(yùn)行該任務(wù)所需的時間。例如,用戶可能正在任務(wù)中解包CAN總線幀,并且需要處理網(wǎng)絡(luò)上幀的瞬時突發(fā)。這意味著用戶需要在運(yùn)行時對任務(wù)激活進(jìn)行排隊。

AUTOSAR OS允許對基本任務(wù)的激活進(jìn)行排隊,以幫助構(gòu)建此類應(yīng)用程序。與AUTOSAR OS中的其他功能一樣,任務(wù)隊列的大小是靜態(tài)配置的。必須指定任務(wù)可以掛起的最大激活次數(shù)。如果超過激活的最大次數(shù),激活將被忽略。

2.2.6 異步任務(wù)激活

AUTOSAR OS允許別的核激活當(dāng)前核的Task,而不是從任務(wù)實際運(yùn)行的核激活任務(wù)。雖然這可能很有用,但可能會影響性能.因為要完全符合AUTOSAR,所有任務(wù)激活(包括SetEvent)必須阻止調(diào)用方,直到任務(wù)狀態(tài)更新。在內(nèi)部,操作系統(tǒng)必須使用內(nèi)部自旋鎖來協(xié)調(diào)與所屬核的狀態(tài)更改。這會對所有核的性能產(chǎn)生重大影響。

2.3 一致性類

AUTOSAR OS對什么樣的功能可以一起使用有一些限制。這些被稱為一致性類,用于對任務(wù)特性進(jìn)行分組,以便于理解,支持標(biāo)準(zhǔn)的部分實現(xiàn),并為不同的應(yīng)用程序類提供可伸縮性。

AUTOSAR-OS分成如下四種類型,其對應(yīng)特性如下:

每個一致性類都需要更多的資源——BCC1系統(tǒng)比ECC2系統(tǒng)更快、更小。用戶無需擔(dān)心要使用哪個一致性類-RTA-OS支持所有一致性類,并將根據(jù)用戶的操作系統(tǒng)配置計算一致性類。

2.4 最大性能與最小內(nèi)存

RTA-OS在最小化目標(biāo)應(yīng)用程序上的代碼和數(shù)據(jù)使用方面設(shè)計得非常積極。它將分析應(yīng)用程序的特性,并生成一個僅包含所需特性的系統(tǒng)。

用戶對任務(wù)特征的選擇對最終應(yīng)用的規(guī)模和速度有重大影響?!皼]有免費(fèi)的午餐”,因此,當(dāng)用戶向應(yīng)用程序中添加使用更高級任務(wù)類型的任務(wù)時,系統(tǒng)將不可避免地變得稍大、稍慢。

為系統(tǒng)運(yùn)行更有效率,同時在使用過程中應(yīng)盡量使用BCC1,盡量少使用BCC2及擴(kuò)展任務(wù)。

因為:同優(yōu)先級的,隊列等待任務(wù);擴(kuò)展任務(wù)需要等待都會影響運(yùn)行效率。

3. Task 配置

包括:name、Priority、Scheduling、Activation及Autostart

優(yōu)先級:0是最低優(yōu)先級,

調(diào)度:任務(wù)可以完全搶占或非搶占地運(yùn)行。一般來說,為了獲得最佳的應(yīng)用程序性能,應(yīng)該選擇完全搶占式調(diào)度而不是非搶占式調(diào)度。

激活:在Ready狀態(tài)下可以排隊的最大任務(wù)激活數(shù)。對于BCC1、ECC1和ECC2任務(wù),激活次數(shù)始終為一次。這意味著這些類型的任務(wù)只有在處于掛起狀態(tài)時才能激活。在未掛起的情況下,嘗試激活此類任務(wù)將導(dǎo)致錯誤。大于1的值表示操作系統(tǒng)將對激活進(jìn)行排隊,任務(wù)結(jié)束時再次激活。

3.1 調(diào)度原則

低優(yōu)先級的任務(wù)會被高優(yōu)先級任務(wù)搶占;

對于協(xié)作式調(diào)度,低優(yōu)先級的任務(wù)可為低優(yōu)先級聲明一段時間,在該時間段內(nèi)不能被高優(yōu)先級任務(wù)搶占,但仍可能被中斷打斷。

通常,使用非搶占性任務(wù)的系統(tǒng)的響應(yīng)性比搶占性運(yùn)行的系統(tǒng)差。

經(jīng)常會發(fā)現(xiàn),不必使用不可搶占的任務(wù),因為用戶可以使用其他更合適的方法來實現(xiàn)更靈敏的系統(tǒng)??墒褂玫氖侄伟ǎ?/p>

?使用標(biāo)準(zhǔn)資源序列化對數(shù)據(jù)或設(shè)備的訪問。

?使用內(nèi)部資源精確指定哪些其他任務(wù)不會導(dǎo)致?lián)屨肌?/p>

3.2 隊列激活(僅針對BCC2)

在大多數(shù)情況下,用戶將僅在任務(wù)處于掛起狀態(tài)時激活它。但是,用戶可能需要實現(xiàn)一個系統(tǒng),在該系統(tǒng)中,同一任務(wù)必須被多次激活,并且連續(xù)激活之間的最短時間小于運(yùn)行該任務(wù)所需的時間。

如果發(fā)生這種情況,用戶將在任務(wù)處于就緒狀態(tài)或正在運(yùn)行狀態(tài)時激活該任務(wù)。這意味著激活將丟失。要防止激活丟失,必須指定任務(wù)所需的最大多次激活次數(shù)。

根據(jù)AUTOSAR OS標(biāo)準(zhǔn),此功能僅適用于基本任務(wù)。不能指定 擴(kuò)展任務(wù)的多個激活。

當(dāng)指定多個激活時,RTA-OS會自動識別任務(wù)為BCC2。構(gòu)建應(yīng)用程序時,RTA-OS將計算每個BCC2任務(wù)所需的多激活隊列的最大大小。

當(dāng)BCC2任務(wù)共享優(yōu)先級時,RTA-OS使用FIFO隊列來保存掛起的激活。如果BCC2任務(wù)在AUTOSAR OS應(yīng)用程序中具有唯一的優(yōu)先級,則RTA-OS會自動優(yōu)化排隊策略,使其達(dá)到最佳優(yōu)先級激活。計數(shù)激活比FIFO激活更有效,應(yīng)盡可能使用。

3.3 自動開始的任務(wù)

自動啟動主要用于啟動Waiting Event的擴(kuò)展任務(wù),因為它不需要編寫代碼來激活任務(wù)。

4. 堆棧管理

RTA-OS使用單棧模型,即所有的Task、ISRS在同一個堆棧區(qū)域上運(yùn)行。

當(dāng)任務(wù)運(yùn)行時,其堆棧使用量會像正常情況一樣增減。當(dāng)任務(wù)被搶占時,高優(yōu)先級任務(wù)的堆棧使用將在同一堆棧上繼續(xù)(就像標(biāo)準(zhǔn)函數(shù)調(diào)用一樣)。當(dāng)任務(wù)終止時,它使用的堆??臻g將被回收,然后重新用于下一個優(yōu)先級最高的任務(wù)運(yùn)行(同樣,與標(biāo)準(zhǔn)函數(shù)調(diào)用一樣)。下圖顯示了單堆棧在聲明、搶占和終止任務(wù)時的行為。

在單堆棧模型中,堆棧大小與系統(tǒng)中優(yōu)先級的數(shù)量成比例,而不是與任務(wù)/ISR的數(shù)量成比例。這意味著,直接或通過共享內(nèi)部資源,或通過被配置為非先發(fā)制人,共享優(yōu)先級的任務(wù)永遠(yuǎn)不會同時出現(xiàn)在堆棧上。在硬件上共享優(yōu)先級的ISR也是如此。這意味著用戶可以通過簡單的配置更改來交換系統(tǒng)響應(yīng)性,即任務(wù)或ISR完成所需的時間,以換取堆棧空間。

上圖顯示了同一任務(wù)集的執(zhí)行情況,具有與上上圖相同的到達(dá)模式,但這次任務(wù)是非搶占式調(diào)度的??梢钥吹?,高優(yōu)先級任務(wù)的響應(yīng)時間比搶占式調(diào)度時長得多,但總體堆棧消耗要低得多。

單堆棧模型還顯著簡化了鏈接時的堆??臻g分配,因為用戶只需為整個系統(tǒng)堆棧分配單個內(nèi)存部分,就像根本不使用操作系統(tǒng)一樣。

4.1 擴(kuò)展任務(wù)的堆棧管理

RTA-OS獨特地擴(kuò)展了單堆棧模型,在不影響基本任務(wù)性能的情況下為擴(kuò)展任務(wù)提供支持。

在RTA-OS中,擴(kuò)展任務(wù)的生命周期如下:

Suspended→Ready:任務(wù)被添加到Ready 序列

Ready→Running:任務(wù)已調(diào)度,但與內(nèi)容位于堆棧頂部的基本任務(wù)不同,內(nèi)容位于堆棧空間中,所有低優(yōu)先級任務(wù)的預(yù)先計算的最壞情況搶占深度處。

Running→Ready:擴(kuò)展任務(wù)被搶占。如果搶占任務(wù)是一個基本任務(wù),那么它會像往常一樣在堆棧頂部調(diào)度;如果搶占任務(wù)是一個擴(kuò)展任務(wù),那么它將按照預(yù)先計算的所有低優(yōu)先級任務(wù)的最壞情況搶占深度進(jìn)行調(diào)度。

Running→Waiting:任務(wù)的等待事件堆棧內(nèi)容(包括操作系統(tǒng)上下文、本地數(shù)據(jù)、函數(shù)調(diào)用的堆棧幀等)保存到內(nèi)部操作系統(tǒng)緩沖區(qū)中

Waiting→Ready:任務(wù)添加到Ready 隊列

Running→Suspended:任務(wù)的“等待事件堆?!眱?nèi)容將從內(nèi)部操作系統(tǒng)緩沖區(qū)復(fù)制回堆棧中所有低優(yōu)先級任務(wù)預(yù)先計算的最壞情況搶占深度。

擴(kuò)展任務(wù)管理要求RTA-OS知道任務(wù)和ISR使用了多少堆棧。以下各節(jié)描述了各種配置參數(shù)。

4.2 強(qiáng)制堆棧信息

計算出的最壞情況分派點定義了需要啟動擴(kuò)展任務(wù)的字節(jié)數(shù),該字節(jié)數(shù)與調(diào)用StartOS()時堆棧指針的地址有關(guān)。這些偏移量作為ROM數(shù)據(jù)存儲在擴(kuò)展任務(wù)控制塊中,并在運(yùn)行時添加到堆棧的基址。

4.3 指定任務(wù)分配Task

在僅包含基本任務(wù)的系統(tǒng)中,除非用戶正在進(jìn)行堆棧監(jiān)控,否則無需告知RTA-OS任何堆棧分配。只需在鏈接器/定位器中為應(yīng)用程序分配足夠大的堆棧部分。這是單堆棧體系結(jié)構(gòu)的優(yōu)點之一。

對于使用擴(kuò)展任務(wù)的應(yīng)用程序,用戶可以像以前一樣分配Linker部分,但用戶還必須為RTA-OS中每個優(yōu)先級低于最高優(yōu)先級擴(kuò)展任務(wù)的任務(wù)分配堆棧,即使它們是基本任務(wù)。RTA-OS使用堆棧分配信息為每個離線擴(kuò)展任務(wù)計算最壞情況下的搶占點。

雖然RTA-OS使用單堆棧模型,但在某些端口上,這并不一定意味著只使用一個物理堆棧。可能是編譯器或硬件自動將數(shù)據(jù)強(qiáng)制到不同的堆棧上。例如,TriCore設(shè)備使用CSA內(nèi)存快速保存調(diào)用context。

即使有多個物理堆棧,RTA-OS仍然提供了單堆棧體系結(jié)構(gòu)的好處——當(dāng)任務(wù)和/或ISR共享優(yōu)先級時,每個物理堆棧上所需的堆??臻g可以重疊。但是,要使堆棧分配正常工作,需要指定每個堆棧上所需的空間。如果用戶配置,RTA-OS將要求用戶提供多個堆棧值

4.4 處理堆棧溢出

如果用戶提供給RTA-OS的堆棧分配太小(運(yùn)行時錯誤的潛在來源),有三種錯誤情況可能發(fā)生:

1.當(dāng)RTA-OS嘗試調(diào)度擴(kuò)展任務(wù)時,堆棧指針的當(dāng)前值高于計算的最壞情況調(diào)度點,因此擴(kuò)展任務(wù)無法啟動。這意味著堆棧上的一個(或多個)低優(yōu)先級任務(wù)占用了太多空間。

2.擴(kuò)展任務(wù)無法從等待狀態(tài)恢復(fù),因為堆棧指針高于它應(yīng)該的值。當(dāng)為擴(kuò)展任務(wù)正在等待的事件調(diào)用SetEvent()并且擴(kuò)展任務(wù)現(xiàn)在是系統(tǒng)中優(yōu)先級最高的任務(wù)時,可能會發(fā)生這種情況。

3.擴(kuò)展任務(wù)無法進(jìn)入等待狀態(tài),因為任務(wù)正在使用的堆棧的當(dāng)前數(shù)量大于配置的“WaitEvent()堆棧”的大小。

當(dāng)RTA-OS檢測到擴(kuò)展任務(wù)堆棧管理出現(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. 任務(wù)的控制

5.1任務(wù)執(zhí)行

任務(wù)類似于C函數(shù),在RTA-OS調(diào)用它們時實現(xiàn)某種形式的系統(tǒng)功能。

當(dāng)任務(wù)開始運(yùn)行時,從任務(wù)輸入函數(shù)開始執(zhí)行。任務(wù)輸入函數(shù)是使用示例4.2中的C語法編寫的。

注意,基本任務(wù)是一次性完成的。這意味著他們從固定的任務(wù)入口點開始執(zhí)行,并在完成時終止。

5.2 任務(wù)激活

任務(wù)激活后變?yōu)镽eady狀態(tài),當(dāng)該任務(wù)的優(yōu)先級為所有Ready狀態(tài)的任務(wù)及當(dāng)前處于Running的任務(wù)中最高時,開始(或搶占)變成Running狀態(tài)。

任務(wù)每次被激活后會運(yùn)行一次,當(dāng)激活的次數(shù)超過配置次數(shù)時會報E_OS_LIMIT錯誤。

任務(wù)可以通過Tasks或二類中斷激活。

5.2.1 直接激活

可以通過多種不同的方式激活任務(wù)。任務(wù)激活的基本機(jī)制是ActivateTask()API調(diào)用,它直接激活任務(wù)。ActivateTask(TaskID)調(diào)用將命名任務(wù)置于就緒狀態(tài)。ChainTask(TaskID)終止當(dāng)前正在運(yùn)行的任務(wù)(參見第4.11節(jié)),并將激活指定任務(wù)置于就緒狀態(tài)。

#include  TASK(Task1)  {  /*  Task1  functionality.  */  ActivateTask(Task2);  TerminateTask();}TASK(Task2)  {  /*  Task2  functionality.  */  ActivateTask(Task3);  TerminateTask();}TASK(Task3)  {  /*  Task3  functionality.  */  TerminateTask();}

5.2.2 間接激活

通過Alarm激活或通過調(diào)度表激活。

通過Alarm激活:對于系統(tǒng)中的每個Alarm,可以指定一個任務(wù),該任務(wù)在每次Alarm過期時激活。

調(diào)度表激活:對于系統(tǒng)中的每個調(diào)度表,可以指定在表上的一個或多個到期點激活的任務(wù)。

5.3 任務(wù)執(zhí)行順序控制

許多情況下,需要控制任務(wù)執(zhí)行的順序,即某個任務(wù)的執(zhí)行需要基于前一個任務(wù)執(zhí)行的結(jié)果。時序的控制可以通過如下三種方式:

?直接激活鏈;

?優(yōu)先級;

?不可搶占的任務(wù)。

5.3.1 直接激活鏈

當(dāng)使用直接激活鏈控制執(zhí)行順序時,任務(wù)對必須在發(fā)出調(diào)用的任務(wù)之后執(zhí)行的任務(wù)進(jìn)行ActivateTask()調(diào)用。

5.3.2 通過任務(wù)優(yōu)先級

將需要優(yōu)先執(zhí)行的任務(wù)設(shè)置更高的優(yōu)先級,在執(zhí)行時即可按搶占式完成。

5.4 RTA-OS中的合作式調(diào)度

當(dāng)任務(wù)以非搶占方式運(yùn)行時,它會阻止任何任務(wù)(包括優(yōu)先級較高的任務(wù))執(zhí)行。然而,有時對于非搶占式任務(wù)來說,提供可以進(jìn)行重新調(diào)度的明確位置是很有用的。這比簡單地非搶占式運(yùn)行更有效,因為高優(yōu)先級任務(wù)對系統(tǒng)刺激的響應(yīng)時間更短。任務(wù)以非搶占方式運(yùn)行并為重新調(diào)度提供點數(shù)的系統(tǒng)稱為合作調(diào)度系統(tǒng)。

#include  TASK(Cooperative){  Function1();  Schedule();/*  Allow  preemption  */  Function2();  Schedule();/*  Allow  preemption  */  Function3();  Schedule();/*  Allow  preemption  */  Function4();  TerminateTask();}

注:該應(yīng)用形式,在搶占式調(diào)度中Schedule();沒有意義。

5.5.任務(wù)終止

在AUTOSAR操作系統(tǒng)中終止的任務(wù)必須進(jìn)行API調(diào)用,以告知操作系統(tǒng)正在發(fā)生這種情況。AUTOSAR OS標(biāo)準(zhǔn)定義了兩個用于任務(wù)終止的API調(diào)用。其中之一必須用于終止任何任務(wù)。這些API調(diào)用是:

? TerminateTask()

? ChainTask(TaskID)

當(dāng)任務(wù)完成時,它必須進(jìn)行其中一個API調(diào)用。這確保RTA-OS可以正確地安排準(zhǔn)備運(yùn)行的下一個任務(wù)。

TerminateTask()強(qiáng)制調(diào)用任務(wù)進(jìn)入掛起狀態(tài)。RTA-OS將在Ready狀態(tài)下運(yùn)行下一個優(yōu)先級最高的任務(wù)。

ChainTask(TaskID)終止調(diào)用任務(wù)并激活任務(wù)TaskID。因此,該API類似于執(zhí)行TerminateTask(),然后立即執(zhí)行ActivateTask(TaskID)。鏈接任務(wù)會將命名任務(wù)置于就緒狀態(tài)。

5.5.1 RTA-OS中的終端優(yōu)化

AUTOSAR OS標(biāo)準(zhǔn)允許任務(wù)在任何時候調(diào)用任務(wù)終止API調(diào)用,包括在一組深度嵌套的函數(shù)調(diào)用中。這是一種糟糕的編程實踐,相當(dāng)于使用goto。在運(yùn)行時,RTA-OS必須存儲信息,以便在任務(wù)終止于entry函數(shù)以外的其他位置時清除堆棧。這通常是使用setjmp/longjmp對完成的。

然而,單堆棧體系結(jié)構(gòu)的一個關(guān)鍵好處是,在其entry函數(shù)中終止的任務(wù)可以簡單地返回TerminateTask()而無需執(zhí)行任何操作。

RTA-OS允許用戶使用快速終止優(yōu)化(Optimizations?fast Terminate)利用良好的應(yīng)用程序設(shè)計。當(dāng)所有執(zhí)行TerminateTask()或ChainTask()API的任務(wù)僅在其entry函數(shù)中執(zhí)行時,可以啟用此優(yōu)化。優(yōu)化告訴RTA-OS不要生成代碼來保存不必要的上下文,從而節(jié)省堆??臻g。

5.6 任務(wù)的Idle機(jī)制

在任何搶占式OS中,當(dāng)沒有Task或中斷運(yùn)行時也必須有些事情要做。在AUTOSAR OS中是通過Idle 機(jī)制實現(xiàn)。在RTA-OS中當(dāng)沒有Task或中斷執(zhí)行時,系統(tǒng)將處于繁忙的等待循環(huán)中。

用戶可以通過聲明一個名為Os_Cbk_idle的回調(diào)來提供自己的空閑機(jī)制實現(xiàn),從而覆蓋默認(rèn)行為。

Os_Cbk_idle的行為較普通Task外有如下不同:

不能被激活

不能被終止

不能被鏈(嵌套)調(diào)用

不能使用內(nèi)部資源

Os_Cbk_Idle的優(yōu)先級最低,即當(dāng)沒有任何任何及中斷運(yùn)行時才會Ready to Run。

Os_Cbk_Idle在退出時返回一個布爾值,告訴RTA-Os是否再次調(diào)用Os_Cbk_Idle。當(dāng)返回TRUE時,RTA-OS將立即再次調(diào)用Os_Cbk_Idle。當(dāng)返回FALSE時,RTA-OS停止調(diào)用Os_Cbk_Idle并進(jìn)入繁忙等待循環(huán)的默認(rèn)行為。

6. 任務(wù)前與任務(wù)后Hooks

假設(shè)用戶需要在每個任務(wù)開始之前和/或在每個任務(wù)結(jié)束之后執(zhí)行一些代碼,例如,以提供執(zhí)行跟蹤。用戶可以使用AUTOSAR OS提供的PreTask和PostTask Hook來實現(xiàn)這一點。

每當(dāng)任務(wù)進(jìn)入運(yùn)行狀態(tài)時,RTA-OS就會調(diào)用預(yù)任務(wù)Hook。這意味著在搶占后,每當(dāng)任務(wù)恢復(fù)時,也會調(diào)用預(yù)任務(wù)Hook。

每當(dāng)任務(wù)移出運(yùn)行狀態(tài)時,RTA-OS就會調(diào)用PostTaskHook。任務(wù)終止時,每次任務(wù)被搶占時,都會調(diào)用PostTaskHook。

需要配置后才能使用該功能,用于在運(yùn)行時對應(yīng)用程序進(jìn)行配置。

原文標(biāo)題:RTA-OS系列介紹-Task

文章出處:【微信公眾號:汽車ECU開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • RTOS
    +關(guān)注

    關(guān)注

    20

    文章

    804

    瀏覽量

    119112
  • 實時操作系統(tǒng)
    +關(guān)注

    關(guān)注

    1

    文章

    194

    瀏覽量

    30681
  • 對象
    +關(guān)注

    關(guān)注

    1

    文章

    38

    瀏覽量

    17340

原文標(biāo)題:RTA-OS系列介紹-Task

文章出處:【微信號:eng2mot,微信公眾號:汽車ECU開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    高效實時操作系統(tǒng)原理以及實踐

    高效實時操作系統(tǒng)原理以及實踐大致具體的書的內(nèi)容:(初定義,會不定時修改)1 raw os基于vc++ 的仿真模擬環(huán)境Vc 仿真有什么好處?運(yùn)行一些具體的實例。(lwip 協(xié)議棧, ucgui)2
    發(fā)表于 01-28 15:19

    【圖書分享】嵌入式實時操作系統(tǒng)μC/OS-II經(jīng)典實例

    /OS-II與嵌入式圖形系統(tǒng)~C/GUI的設(shè)計與應(yīng)用。本書主要以ARM Cortex-M3內(nèi)核的STM32F103處理器、嵌入式實時操作系統(tǒng)μC/O
    發(fā)表于 03-13 10:26

    什么是嵌入式實時操作系統(tǒng)ARTs-OS?

    什么是嵌入式實時操作系統(tǒng)ARTs-OS?有什么特點?
    發(fā)表于 08-12 08:09

    嵌人式實時操作系統(tǒng)uC/OS有什么應(yīng)用?

    uC/OS的特點是什么?嵌人式實時操作系統(tǒng)uC/OS有什么應(yīng)用?
    發(fā)表于 04-26 06:46

    嵌入式實時操作系統(tǒng)μc/os-Ⅱ?qū)W習(xí)心得分享

    學(xué)習(xí)μc/os-Ⅱ操作系統(tǒng)一周時間,本來信心滿滿的打算一周搞定μc/os-Ⅱ嵌入式實時操作系統(tǒng),可能是我太年輕想的太簡單了,等我接觸了才知道
    發(fā)表于 12-14 08:09

    操作系統(tǒng)(OS),什么是操作系統(tǒng)(OS)

    操作系統(tǒng)(OS),什么是操作系統(tǒng)(OS) 操作系統(tǒng)(Operating System,簡稱 OS
    發(fā)表于 03-26 15:21 ?2737次閱讀

    嵌入式實時操作系統(tǒng)uC/OS-II內(nèi)核_英版

    嵌入式實時操作系統(tǒng)uC/OS-II內(nèi)核_英版資料。
    發(fā)表于 10-29 16:58 ?0次下載

    米爾科技嵌入式實時操作系統(tǒng)介紹

    -Ⅱ的設(shè)計與應(yīng)用。本書主要以ARMCortex-M3內(nèi)核的STM32F103處理器、嵌入式實時操作系統(tǒng)μC/OS-Ⅱ及嵌入式圖形系統(tǒng)μC/OS
    的頭像 發(fā)表于 11-25 09:02 ?2190次閱讀
    米爾科技嵌入式<b class='flag-5'>實時</b><b class='flag-5'>操作系統(tǒng)</b>介紹

    嵌入式實時操作系統(tǒng)的應(yīng)用詳細(xì)教程說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是嵌入式實時操作系統(tǒng)的應(yīng)用詳細(xì)教程說明包括了:1 嵌入式系統(tǒng)與嵌入式操作系統(tǒng) ,2 用于8051內(nèi)核單片機(jī)的常見嵌入式操作
    發(fā)表于 12-05 08:00 ?2次下載
    嵌入式<b class='flag-5'>實時</b><b class='flag-5'>操作系統(tǒng)</b>的應(yīng)用詳細(xì)教程說明

    實時操作系統(tǒng)和非實時操作系統(tǒng)的區(qū)別

    本文主要闡述了實時操作系統(tǒng)和非實時操作系統(tǒng)的區(qū)別。
    發(fā)表于 09-02 15:58 ?1.1w次閱讀

    實時操作系統(tǒng)mC/OS Ⅱ分析

    學(xué)習(xí)一種實時操作系統(tǒng)RTOS,如uc/OS,掌握實時系 統(tǒng)的概念和設(shè)計方法; l 嵌入式系統(tǒng)以應(yīng)用為中心,應(yīng)用時選擇“適用”的操 作
    發(fā)表于 09-27 14:27 ?0次下載

    RTA OS系列介紹01-Task

    AUTOSAR OS主要包含Task, ISRs, Events, Resources, Application, Counter, Alarms, Schedule Table等OS對象
    的頭像 發(fā)表于 12-21 14:13 ?1916次閱讀

    Linux是實時系統(tǒng)還是分時操作系統(tǒng)?

    我們平時分享的μC/OS、FreeRTOS、RT-Thread、ThreadX這些都是實時操作系統(tǒng)(RTOS),那么有讀者問:什么是分時操作系統(tǒng),Linux屬于
    的頭像 發(fā)表于 12-28 11:39 ?1419次閱讀

    Events(事件)概述、配置及使用方法

    的Events(事件),當(dāng)系統(tǒng)Task或ISR設(shè)置事件后,等待的任務(wù)將轉(zhuǎn)到Ready狀態(tài)。當(dāng)它成為最高優(yōu)先級就緒任務(wù)時,RTA-OS將選擇運(yùn)行該
    的頭像 發(fā)表于 01-12 10:27 ?4827次閱讀

    簡析符合AUTOSAR標(biāo)準(zhǔn)的RTA-OS功能

    RTA-OS是一種靜態(tài)可配置的搶占式實時操作系統(tǒng)(RTOS),用于高性能、資源受限的應(yīng)用程序。
    的頭像 發(fā)表于 02-10 10:44 ?4706次閱讀