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

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

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

符合AUTOSAR標(biāo)準(zhǔn)的RTA-OS-Resources詳解

832065824 ? 來(lái)源:汽車(chē)電子嵌入式 ? 2023-05-06 09:28 ? 次閱讀

正文

4.資源Resources

訪問(wèn)需要在任務(wù)和ISR之間共享的硬件或數(shù)據(jù)可能是不可靠和不安全的。這是因?yàn)楫?dāng)較低優(yōu)先級(jí)的任務(wù)或ISR正在更新共享數(shù)據(jù)時(shí),可能會(huì)發(fā)生任務(wù)或ISR搶占。這種情況被稱(chēng)為競(jìng)態(tài)條件,非常難以測(cè)試。

訪問(wèn)共享數(shù)據(jù)的語(yǔ)句序列稱(chēng)為臨界區(qū)。為了提供對(duì)臨界區(qū)中引用的代碼和數(shù)據(jù)的安全訪問(wèn),需要強(qiáng)制互斥。換句話說(shuō),必須確保在臨界段期間,系統(tǒng)中沒(méi)有其他任務(wù)或二類(lèi)中斷能夠搶占正在執(zhí)行的任務(wù)。

在Task章節(jié)中,看到可以將任務(wù)聲明為非搶占式可以防止出現(xiàn)互斥問(wèn)題。然而,這種方法是治標(biāo)不治本的,因?yàn)樗ㄟ^(guò)防止出現(xiàn)搶占來(lái)防止搶占帶來(lái)的問(wèn)題。

操作系統(tǒng)提供基于資源的互斥機(jī)制。資源Resources只是一個(gè)二進(jìn)制信號(hào)量。當(dāng)一個(gè)任務(wù)或二類(lèi)ISR獲得資源時(shí),其他任務(wù)或ISR無(wú)法獲得該資源。這可以防止任何其他任務(wù)或ISR同時(shí)進(jìn)入相同的臨界區(qū)。當(dāng)臨界區(qū)結(jié)束時(shí),任務(wù)或ISR釋放資源,另一個(gè)任務(wù)/ISR可以進(jìn)入臨界區(qū)。

當(dāng)高優(yōu)先級(jí)任務(wù)被低優(yōu)先級(jí)任務(wù)阻止執(zhí)行時(shí),這稱(chēng)為優(yōu)先級(jí)反轉(zhuǎn),因?yàn)楦邇?yōu)先級(jí)任務(wù)比低優(yōu)先級(jí)任務(wù)需要更長(zhǎng)的時(shí)間來(lái)完成它的執(zhí)行。較低優(yōu)先級(jí)的任務(wù)似乎優(yōu)先于較高優(yōu)先級(jí)的任務(wù)運(yùn)行,這與實(shí)際優(yōu)先級(jí)分配的預(yù)期相反。高優(yōu)先級(jí)的任務(wù)被低優(yōu)先級(jí)的任務(wù)阻塞。

由于優(yōu)先級(jí)反轉(zhuǎn)會(huì)在系統(tǒng)中引入無(wú)界阻塞,二進(jìn)制信號(hào)量在傳統(tǒng)操作系統(tǒng)中經(jīng)常有不好的名聲。例如,如果低優(yōu)先級(jí)任務(wù)阻止高優(yōu)先級(jí)任務(wù)執(zhí)行,但它本身被一個(gè)不需要訪問(wèn)共享資源的中等優(yōu)先級(jí)任務(wù)搶占,那么高優(yōu)先級(jí)任務(wù)也將被中等優(yōu)先級(jí)任務(wù)的執(zhí)行阻塞。由于低優(yōu)先級(jí)任務(wù)在持有共享資源時(shí)可能會(huì)被搶占多次,因此高優(yōu)先級(jí)任務(wù)遭受的阻塞可能是無(wú)限的,如果需要確定任務(wù)響應(yīng)所需的最長(zhǎng)時(shí)間,則會(huì)帶來(lái)嚴(yán)重的問(wèn)題。在極端情況下,任務(wù)可能會(huì)達(dá)到一種被稱(chēng)為“死鎖”的狀態(tài),在這種狀態(tài)下,每個(gè)任務(wù)都在等待進(jìn)入一個(gè)臨界區(qū),而這個(gè)臨界區(qū)正在被其他任務(wù)使用。

在AUTOSAR OS中,避免了通常與優(yōu)先級(jí)反轉(zhuǎn)和死鎖相關(guān)的問(wèn)題,因?yàn)橘Y源是根據(jù)鎖定協(xié)議鎖定的。這個(gè)鎖協(xié)議稱(chēng)為優(yōu)先級(jí)上限協(xié)議(優(yōu)先級(jí)天花板協(xié)議),特別是稱(chēng)為立即繼承優(yōu)先級(jí)上限協(xié)議(或堆棧資源協(xié)議)的版本。

優(yōu)先級(jí)上限協(xié)議使用了優(yōu)先級(jí)上限的概念。系統(tǒng)中的每個(gè)資源都被分配了一個(gè)上限優(yōu)先級(jí),該優(yōu)先級(jí)等于需要訪問(wèn)該資源的任何任務(wù)或ISR的最高優(yōu)先級(jí)。當(dāng)任務(wù)或ISR獲得資源時(shí),任務(wù)/ISR的運(yùn)行優(yōu)先級(jí)將增加到資源的最高優(yōu)先級(jí)(當(dāng)且僅當(dāng)該優(yōu)先級(jí)高于任務(wù)/ISR當(dāng)前的運(yùn)行優(yōu)先級(jí))。當(dāng)資源被釋放時(shí),任務(wù)或ISR的優(yōu)先級(jí)恢復(fù)到該任務(wù)或ISR發(fā)出呼叫之前的優(yōu)先級(jí)。如圖4.1所示。

d6dc091a-eb7b-11ed-90ce-dac502259ad0.png

圖4.1 提升至最高優(yōu)先級(jí)

立即繼承優(yōu)先級(jí)上限協(xié)議提供了兩個(gè)主要優(yōu)點(diǎn):

1)優(yōu)先級(jí)反轉(zhuǎn)被最小化。

每次高優(yōu)先級(jí)任務(wù)或ISR準(zhǔn)備就緒時(shí),它的執(zhí)行最多只能被一個(gè)已經(jīng)持有資源的低優(yōu)先級(jí)任務(wù)或ISR延遲一次。這意味著沒(méi)有累積阻塞,因此可以對(duì)任務(wù)遭受的阻塞設(shè)置上限-最大阻塞時(shí)間是低優(yōu)先級(jí)任務(wù)/ISR持有共享資源的最長(zhǎng)時(shí)間。此外,這種阻塞總是在執(zhí)行開(kāi)始時(shí)發(fā)生。這樣做的結(jié)果是,資源在需要鎖定時(shí)總是處于空閑狀態(tài)。在AUTOSAR操作系統(tǒng)中不需要等待資源被釋放。

2)它保證沒(méi)有死鎖。

一個(gè)任務(wù)或ISR必須在執(zhí)行中才能產(chǎn)生鎖。假設(shè)一個(gè)任務(wù)(或ISR)試圖獲取資源。如果另一個(gè)任務(wù)或ISR已經(jīng)擁有資源,那么由于該任務(wù)或ISR必須以最高優(yōu)先級(jí)運(yùn)行,因此發(fā)出請(qǐng)求的任務(wù)不會(huì)執(zhí)行(它不會(huì)是系統(tǒng)中最高優(yōu)先級(jí)的任務(wù)或ISR),因此不能?chē)L試鎖定資源。

4.1 配置資源Resource Configuration

在最基本的級(jí)別上,資源只需要命名和分配類(lèi)型。AUTOSAR OS中有三種類(lèi)型的資源:

1)標(biāo)準(zhǔn)資源Standard Resources是普通的操作系統(tǒng)信號(hào)量。配置標(biāo)準(zhǔn)資源將創(chuàng)建具有指定名稱(chēng)的資源。

2)鏈接資源Linked Resources允許為標(biāo)準(zhǔn)(或另一個(gè)鏈接的)資源設(shè)置別名,以便可以對(duì)同一資源進(jìn)行嵌套鎖定。這些將在第4.4節(jié)中詳細(xì)討論。

2)內(nèi)部資源Internal Resources是在進(jìn)入任務(wù)時(shí)自動(dòng)鎖定并在任務(wù)結(jié)束時(shí)自動(dòng)釋放的資源。這些將在第4.5節(jié)中詳細(xì)討論。

d6f176f6-eb7b-11ed-90ce-dac502259ad0.png

圖4.2:在rtaoscfg上配置資源

RTA-OS需要知道哪些任務(wù)和ISRs使用了哪些資源。然后,它可以計(jì)算優(yōu)先級(jí)上限協(xié)議所使用的上限優(yōu)先級(jí)。

#include 
TASK(Task1) {
  ...
  GetResource(Resource1);
  /* Critical section. */
  ReleaseResource(Resource1);
...
  TerminateTask();
}

Example 4.1: Using Resources

可以在任務(wù)或ISR配置期間配置每個(gè)任務(wù)或ISR的其他資源使用信息。

圖4.2顯示了已經(jīng)聲明了一個(gè)名為Resource1的資源。在程序中引用此資源時(shí),必須使用相同的名稱(chēng)。

4.2 中斷級(jí)別的資源Resources on Interrupt Level

在AUTOSAR OS中,任務(wù)和中斷之間共享的資源是可選的。RTA-OS支持這個(gè)可選特性。

RTA-OS將自動(dòng)識(shí)別組合資源,因此您不需要進(jìn)行任何特殊配置。

當(dāng)任務(wù)獲得與ISR共享的資源時(shí),RTA-OS將屏蔽所有中斷,中斷優(yōu)先級(jí)小于或等于共享資源的最高優(yōu)先級(jí)中斷。

這只是優(yōu)先級(jí)上限協(xié)議的擴(kuò)展。在任務(wù)和ISR之間共享資源意味著提供了比啟用/禁用和暫停/恢復(fù)API調(diào)用更大的對(duì)內(nèi)部中斷屏蔽的控制,因?yàn)樗鼈兛梢詫⒅袛嘧蛹帘蔚教囟ǖ膬?yōu)先級(jí)級(jí)別。因此,當(dāng)使用支持嵌套中斷的RTA-OS端口時(shí),中斷級(jí)別的資源特別有用。

4.3 使用資源Using Resources

可以使用GetResource() API調(diào)用獲取資源。然后,您可以使用ReleaseResource()調(diào)用釋放資源。一個(gè)任務(wù)或ISR必須在釋放了它所鎖定的所有資源之后才能終止。

任務(wù)或ISR只能使用在RTA-OS配置過(guò)程中指定的資源。例4.1展示了如何在Task1中使用資源。

對(duì)GetResource()和ReleaseResource()的調(diào)用必須匹配。無(wú)法獲取已鎖定的資源。無(wú)法釋放尚未鎖定的資源。

d71355be-eb7b-11ed-90ce-dac502259ad0.png

圖4.3:執(zhí)行具有資源鎖的任務(wù)

當(dāng)執(zhí)行GetResource()時(shí),它將調(diào)用任務(wù)或ISR的優(yōu)先級(jí)提升到資源的最高優(yōu)先級(jí)。資源的上限優(yōu)先級(jí)是共享該資源的所有任務(wù)或ISR的最高優(yōu)先級(jí),由RTA-OS自動(dòng)計(jì)算。如果任何優(yōu)先級(jí)低于上限優(yōu)先級(jí)的任務(wù)準(zhǔn)備好運(yùn)行,那么它將被阻止執(zhí)行(它將被阻塞),直到正在運(yùn)行的任務(wù)的優(yōu)先級(jí)恢復(fù)正常。

圖4.3通過(guò)以下配置顯示了此效果:

d7393b30-eb7b-11ed-90ce-dac502259ad0.png

Task 2的第一次激活被阻塞,因?yàn)門(mén)ask 1已經(jīng)鎖定了R2。Task 2的第二次激活也被阻塞,但這次是因?yàn)門(mén)ask 1鎖定了R1。Task 3的第一次激活同樣被阻塞,因?yàn)門(mén)ask 1持有R1。當(dāng)Task 1釋放R1時(shí),操作系統(tǒng)運(yùn)行優(yōu)先級(jí)最高的就緒任務(wù)Task 3。在Task 3終止時(shí),執(zhí)行Task 2,最后,當(dāng)Task 2終止時(shí),繼續(xù)執(zhí)行Task 1。

4.3.1 嵌套資源調(diào)用Nesting Resource Calls

可以同時(shí)獲得多個(gè)資源,但是API調(diào)用必須嚴(yán)格嵌套。我們來(lái)看兩個(gè)例子;一個(gè)顯示嵌套錯(cuò)誤的調(diào)用,另一個(gè)顯示嵌套正確的API調(diào)用。

例4.2顯示Resource1和Resource2以錯(cuò)誤的順序被釋放。

例4.3展示了一個(gè)正確嵌套的示例。所有的資源都被保留,然后按正確的順序釋放。

GetResource(Resource1);
  GetResource(Resource2);
ReleaseResource(Resource1);/*Illegal!*/
/* You must release Resource2 before Resource1 */
  ReleaseResource(Resource2);

Example 4.2: Illegal Nesting of Resource Calls

GetResource(Resource1);
  GetResource(Resource2);
    GetResource(Resource3);
    ReleaseResource(Resource3);
  ReleaseResource(Resource2);
ReleaseResource(Resource1);

Example 4.3: Correctly Nested Resource Calls

4.4 鏈接資源Linked Resources

在AUTOSAR操作系統(tǒng)中,對(duì)相同資源的GetResource() API調(diào)用不能嵌套。但是,有時(shí)可能需要嵌套資源鎖。

應(yīng)用程序可能使用在多個(gè)任務(wù)之間共享的函數(shù)。如果共享函數(shù)需要獲得一個(gè)任務(wù)使用的資源,而其他任務(wù)不需要,會(huì)發(fā)生什么情況?看一下例4.4。

#include 
void SomeFunction(void) {
  GetResource(Resource1); /* !!! Not allowed if caller is Task1 !!! */
  ...
  ReleaseResource(Resource1); /* !!! Not allowed if caller is Task1 !!! */
}




TASK(Task1) {
  GetResource(Resource1);
  /* Critical section. */
  SomeFunction();
  ReleaseResource(Resource1);
}




TASK(Task2) {
  SomeFunction();
}

Example 4.4: Illegal locking of previously locked resource

在這些情況下,(可能)持有的資源的嵌套必須使用鏈接的資源。鏈接資源是現(xiàn)有資源的別名,并保護(hù)相同的共享對(duì)象。

圖4.4顯示了如何使用rtaoscfg聲明鏈接的資源。

d7515b7a-eb7b-11ed-90ce-dac502259ad0.png

圖4.4:配置鏈接資源

使用鏈接的資源,例4.4將被重寫(xiě)為例4.5所示。

#include 
void SomeFunction(void) {
  GetResource(LinkedToResource1); /* Okay */
  ...
  ReleaseResource(LinkedToResource1); /* Okay */
}


TASK(Task1) {
  GetResource(Resource1);
/* Critical section. */
  SomeFunction();
  ReleaseResource(Resource1);
}
TASK(Task2) {
  SomeFunction();
}

Example 4.5: Using Linked Resources

鏈接的資源使用與標(biāo)準(zhǔn)資源相同的API調(diào)用來(lái)保持和釋放(這些將在4.3節(jié)中解釋)。

也可以創(chuàng)建鏈接資源到已有的鏈接資源。

4.5 內(nèi)部資源Internal Resources

如果一組任務(wù)非常緊密地共享數(shù)據(jù),那么就運(yùn)行時(shí)成本而言,使用標(biāo)準(zhǔn)資源來(lái)保護(hù)對(duì)每個(gè)數(shù)據(jù)項(xiàng)的每次訪問(wèn)可能過(guò)于昂貴。甚至可能無(wú)法確定需要保存資源的所有位置。

可以通過(guò)使用內(nèi)部資源來(lái)防止對(duì)共享數(shù)據(jù)的并發(fā)訪問(wèn)。內(nèi)部資源是為任務(wù)的生命周期分配的資源。使用rtaoscfg離線配置內(nèi)部資源。然而,與普通資源不同的是,無(wú)法獲取和釋放它們。

從概念上講,RTA-OS在啟動(dòng)任務(wù)之前立即鎖定內(nèi)部資源,并在任務(wù)結(jié)束后立即釋放資源。

當(dāng)任務(wù)進(jìn)入運(yùn)行狀態(tài)時(shí),RTA-OS中內(nèi)部資源的實(shí)現(xiàn)不會(huì)產(chǎn)生運(yùn)行時(shí)成本,因?yàn)閞taosgen會(huì)計(jì)算任務(wù)脫機(jī)運(yùn)行的優(yōu)先級(jí),并按此優(yōu)先級(jí)簡(jiǎn)單地調(diào)度任務(wù)。共享內(nèi)部資源的任務(wù)集在配置時(shí)使用rtaoscfg靜態(tài)定義。

注意:在AUTOSAR OS中,內(nèi)部資源僅對(duì)任務(wù)可用。但是,也沒(méi)有理由不能由第一類(lèi)和第二類(lèi)ISR共享內(nèi)部資源。RTA-OS提供了AUTOSAR OS的擴(kuò)展,允許ISR使用內(nèi)部資源。當(dāng)任務(wù)鎖定與ISR共享的內(nèi)部資源時(shí),則任務(wù)在中斷的IPL處執(zhí)行,并且在任務(wù)期間阻塞所有同等或更低優(yōu)先級(jí)的中斷。

圖4.5顯示了一個(gè)內(nèi)部資源(稱(chēng)為InternalResource)的聲明,它在任務(wù)t1和任務(wù)t3之間共享。

d7645342-eb7b-11ed-90ce-dac502259ad0.png

圖4.5 使用rtaoscfg聲明內(nèi)部資源

如果任務(wù)使用內(nèi)部資源,RTA-OS將在調(diào)用任務(wù)的入口函數(shù)之前自動(dòng)獲取內(nèi)部資源。然后,在任務(wù)終止、調(diào)用Schedule()或WaitEvent()之后,資源將自動(dòng)釋放。

在任務(wù)執(zhí)行過(guò)程中,所有其他共享內(nèi)部資源的任務(wù)將被阻止運(yùn)行,直到內(nèi)部資源釋放。

圖4.6顯示了共享相同內(nèi)部資源的三個(gè)任務(wù)的執(zhí)行情況。

d78a5786-eb7b-11ed-90ce-dac502259ad0.png

圖4.6 內(nèi)部資源的執(zhí)行

重要的是要注意,當(dāng)一個(gè)擁有內(nèi)部資源的任務(wù)完成時(shí),操作系統(tǒng)會(huì)根據(jù)就緒任務(wù)的正常(基本)優(yōu)先級(jí)做出調(diào)度決策。如果一個(gè)任務(wù)正在運(yùn)行,并且共享相同內(nèi)部資源的多個(gè)任務(wù)已經(jīng)激活,那么在運(yùn)行的任務(wù)終止時(shí),將選擇優(yōu)先級(jí)最高的就緒任務(wù)來(lái)運(yùn)行,然后按內(nèi)部資源的最高優(yōu)先級(jí)調(diào)度。

任何優(yōu)先級(jí)低于內(nèi)部資源優(yōu)先級(jí)上限的任務(wù)(包括不共享內(nèi)部資源的任務(wù))在執(zhí)行共享內(nèi)部資源的任務(wù)時(shí)將被阻塞??梢栽趫D4.6中看到一個(gè)示例,其中優(yōu)先級(jí)為1的Task1與優(yōu)先級(jí)為3的Task共享內(nèi)部資源。如果Task1在Task2或Task3啟動(dòng)之前開(kāi)始運(yùn)行,那么這兩個(gè)任務(wù)將被延遲(阻塞),直到Task1完成。

然而,所有不共享內(nèi)部資源的高優(yōu)先級(jí)任務(wù)仍然可以搶占。圖4.7顯示,Task 1最初以優(yōu)先級(jí)3運(yùn)行,因?yàn)樗c優(yōu)先級(jí)3的任務(wù)共享一個(gè)內(nèi)部資源。當(dāng)Task 1運(yùn)行時(shí),Task 2就可以運(yùn)行了。task2的優(yōu)先級(jí)低于Task1的活動(dòng)優(yōu)先級(jí),因此它不能搶占。當(dāng)Task4被激活時(shí),它可以搶占Task1,因?yàn)樗膬?yōu)先級(jí)是4,即它的優(yōu)先級(jí)高于Task1的活動(dòng)優(yōu)先級(jí)。任務(wù)2只能在任務(wù)1終止時(shí)運(yùn)行。

d79d426a-eb7b-11ed-90ce-dac502259ad0.png

圖4.7 內(nèi)部資源阻塞了不共享資源的任務(wù)

從這種行為可以清楚地看出,鎖定內(nèi)部資源的任務(wù)將阻止任何優(yōu)先級(jí)高于自身但優(yōu)先級(jí)低于內(nèi)部資源最高優(yōu)先級(jí)的任務(wù)在整個(gè)任務(wù)期間運(yùn)行。當(dāng)?shù)蛢?yōu)先級(jí)任務(wù)阻止高優(yōu)先級(jí)任務(wù)執(zhí)行時(shí),稱(chēng)為阻塞。共享內(nèi)部資源的任務(wù)相對(duì)于彼此非搶占性地運(yùn)行。

一旦共享內(nèi)部資源的集合中的任務(wù)獲得了對(duì)CPU的訪問(wèn)權(quán),它將在不被集合中的任何其他任務(wù)搶占的情況下運(yùn)行。這樣做的結(jié)果是,與完全搶占式系統(tǒng)相比,高優(yōu)先級(jí)任務(wù)可能需要更長(zhǎng)的時(shí)間才能訪問(wèn)CPU。

4.6 使用資源以最小化堆棧使用Using Resources to Minimize Stack Usage

資源在應(yīng)用程序中的主要作用是在關(guān)鍵部分上提供互斥。然而,RTA-OS的單堆棧模型意味著資源有一個(gè)有用的次要角色——最小化堆棧使用?;叵胍幌拢蚕碣Y源的任務(wù)不會(huì)相互搶占。在RTA-OS使用的單堆棧模型中,這意味著它們的堆棧使用是有效覆蓋的。

可以利用這個(gè)特性來(lái)權(quán)衡系統(tǒng)中的時(shí)間和堆棧使用情況。下面幾節(jié)介紹對(duì)應(yīng)用程序的簡(jiǎn)單修改如何減少堆棧使用。所有這些修改都會(huì)在系統(tǒng)中引入額外的阻塞因素。

這些阻礙因素的影響取決于系統(tǒng)?;叵胍幌?,優(yōu)先級(jí)上限協(xié)議確保任務(wù)或ISR在執(zhí)行期間最多被阻塞一次。最壞阻塞時(shí)間是任何低優(yōu)先級(jí)任務(wù)或ISR可以占用相同資源的最大時(shí)間。

這意味著,如果額外的阻塞因素小于或等于當(dāng)前任務(wù)/ISR所遭受的最壞情況阻塞,則不會(huì)對(duì)響應(yīng)時(shí)間產(chǎn)生影響,并且減少的堆棧使用將被釋放。如果額外的阻塞因素比當(dāng)前的最壞情況阻塞更長(zhǎng),那么響應(yīng)時(shí)間將更長(zhǎng)。如果響應(yīng)時(shí)間保持在任務(wù)/ ISR所需的截止日期之內(nèi),系統(tǒng)仍將正常運(yùn)行。

4.6.1 內(nèi)部資源Internal Resources

給定一組共享內(nèi)部資源的任務(wù),RTA操作系統(tǒng)使用的最壞情況堆棧等于使用最多堆棧的任務(wù)所需的最大堆棧空間。在傳統(tǒng)操作系統(tǒng)中,最大堆棧空間等于任務(wù)堆棧的總和,而不是它們的最大值。

如果需要最小化堆??臻g,那么可以通過(guò)在消耗大量堆棧的任務(wù)之間共享內(nèi)部資源來(lái)利用RTA-OS的單一堆棧架構(gòu)的優(yōu)勢(shì)。圖4.8中的第一個(gè)堆棧顯示了5個(gè)搶占任務(wù)A、B、C、D和E的最壞情況堆棧消耗情況。通過(guò)在任務(wù)B和C之間以及任務(wù)D和E之間共享內(nèi)部資源,可以顯著節(jié)省堆棧空間。圖4.8中的其他四個(gè)堆棧顯示了現(xiàn)在可能發(fā)生的情況——最壞的情況是A被B的最壞情況搶占,或者C被D和e的最壞情況搶占。從圖中可以看到,A被C搶占,被D搶占,這是最壞的情況,這比不使用內(nèi)部資源時(shí)的堆棧要少得多。

d7be8434-eb7b-11ed-90ce-dac502259ad0.png

圖4.8:使用內(nèi)部資源節(jié)省堆??臻g

4.6.2 標(biāo)準(zhǔn)資源Standard Resources

如果一個(gè)任務(wù)調(diào)用一個(gè)使用大量堆棧的函數(shù),那么可以考慮鎖定函數(shù)調(diào)用周?chē)馁Y源,并與優(yōu)先級(jí)更高的任務(wù)共享資源。任務(wù)不需要在代碼中鎖定資源或調(diào)用函數(shù)——共享只是為了強(qiáng)制任務(wù)的執(zhí)行以更高的優(yōu)先級(jí)運(yùn)行。這將防止高優(yōu)先級(jí)任務(wù)在使用大量堆棧時(shí)搶占任務(wù),從而減少總堆棧需求。

禁用函數(shù)調(diào)用周?chē)闹袛嗑哂蓄?lèi)似的效果——有效地用臨時(shí)屏蔽的ISR覆蓋函數(shù)調(diào)用的堆棧使用情況。

4.7 作為資源的調(diào)度程序The Scheduler as a Resource

如果一個(gè)任務(wù)有一個(gè)必須在不被系統(tǒng)中任何其他任務(wù)搶占的情況下執(zhí)行的關(guān)鍵段(回想一下,調(diào)度程序是用來(lái)執(zhí)行任務(wù)切換的),則該任務(wù)可以保留調(diào)度程序。為此目的,所有任務(wù)都可以使用一個(gè)名為RES_SCHEDULER的預(yù)定義資源。RES_SCHEDULER是任務(wù)共享數(shù)據(jù)的一種方便方法,無(wú)需手動(dòng)聲明在所有任務(wù)之間共享的資源。

當(dāng)一個(gè)任務(wù)獲得RES_SCHEDULER時(shí),所有其他任務(wù)將被阻止搶占,直到該任務(wù)釋放RES_SCHEDULER。這實(shí)際上意味著任務(wù)在RES_SCHEDULER被占用的時(shí)間內(nèi)是非搶占性的。

這比使整個(gè)任務(wù)非搶占性要好,特別是當(dāng)任務(wù)只需要在其總執(zhí)行時(shí)間的一小部分防止搶占時(shí)。

必須指定應(yīng)用程序是否使用RES_SCHEDULER。這是在“一般”中設(shè)置的。如果配置RES_SCHEDULER,那么RTA-OS將自動(dòng)生成一個(gè)稱(chēng)為RES_SCHEDULER的標(biāo)準(zhǔn)資源,并在配置中的每個(gè)任務(wù)之間共享它。由于RES_SCHEDULER的行為類(lèi)似于標(biāo)準(zhǔn)資源,可以創(chuàng)建鏈接到RES_SCHEDULER的鏈接資源,如圖4.9所示。

d7d2f8a6-eb7b-11ed-90ce-dac502259ad0.png

圖4.9:Linking to RES_SCHEDULER

使用RES_SCHEDULER可以改善低優(yōu)先級(jí)任務(wù)的響應(yīng)時(shí)間,否則這些任務(wù)可能會(huì)受到應(yīng)用程序中其他任務(wù)的多次搶占,但代價(jià)是高優(yōu)先級(jí)任務(wù)的響應(yīng)時(shí)間更長(zhǎng)。

如果您不需要在應(yīng)用程序中使用RES_SCHEDULER,那么您可以通過(guò)禁用它的生成來(lái)節(jié)省ROMRAM空間,如圖4.10所示。

d7ee8710-eb7b-11ed-90ce-dac502259ad0.png

圖4.10:Disabling RES_SCHEDULER

4.8 選擇一個(gè)搶占控制機(jī)制Choosing a Preemption Control Mechanism

如果在一對(duì)GetResource()和ReleaseResource()調(diào)用之間出現(xiàn)不需要鎖的代碼,則可能會(huì)降低系統(tǒng)的響應(yīng)性??紤]到這一點(diǎn),當(dāng)您在應(yīng)用程序中使用資源時(shí),應(yīng)該將GetResource()調(diào)用盡可能地放置在您使用該資源保護(hù)的代碼段附近。

然而,這條規(guī)則有一個(gè)例外。當(dāng)有一個(gè)短時(shí)間運(yùn)行的任務(wù)或ISR對(duì)同一資源進(jìn)行多次GetResource()和ReleaseResource()調(diào)用時(shí),就會(huì)出現(xiàn)此異常。API調(diào)用的成本可能會(huì)占整個(gè)任務(wù)執(zhí)行時(shí)間的很大一部分,因此也可能占響應(yīng)時(shí)間的很大一部分。

可能會(huì)發(fā)現(xiàn),將整個(gè)任務(wù)或ISR主體放在GetResource()和ReleaseResource()調(diào)用之間實(shí)際上縮短了最壞情況下的響應(yīng)時(shí)間。

應(yīng)該盡可能避免使用非搶占式任務(wù)并獲取RES_SCHEDULER。當(dāng)資源被占用的時(shí)間最少,并且影響的任務(wù)數(shù)量最少時(shí),系統(tǒng)的響應(yīng)性和可調(diào)度性就會(huì)得到改善。

4.9 避免競(jìng)態(tài)條件Avoiding Race Conditions

調(diào)用TerminateTask()。在某些情況下,這可能會(huì)在應(yīng)用程序中引入競(jìng)態(tài)約束條件。這可能會(huì)導(dǎo)致錯(cuò)過(guò)任務(wù)激活(您在本章開(kāi)頭了解了競(jìng)爭(zhēng)條件)。

例4.6展示了競(jìng)態(tài)條件可能成為問(wèn)題的系統(tǒng)類(lèi)型。假設(shè)兩個(gè)BCC1任務(wù)在有界緩沖區(qū)上交換數(shù)據(jù)。

在例4.6中,在資源被釋放到任務(wù)結(jié)束之間,Read可以被Write搶占。當(dāng)“寫(xiě)”任務(wù)與“讀”任務(wù)連接時(shí),激活將丟失。這是因?yàn)镽ead仍在運(yùn)行。換句話說(shuō),一個(gè)任務(wù)正在被激活,但它沒(méi)有處于掛起狀態(tài)。

要解決這個(gè)問(wèn)題,可以允許排隊(duì)激活Read任務(wù)。這意味著您應(yīng)該將任務(wù)設(shè)置為BCC2。

#include 
TASK(Write)
  /* Highest priority .*/
  WriteBuffer();
  GetResource(Guard);
  BufferNotEmpty = True;
  ReleaseResource(Guard);
  ChainTask(Read);
}


TASK(Read)
  /* Lowest priority. */
  ReadBuffer();
  GetResource(Guard);
  if( BufferNotEmpty ) {
    ReleaseResource(Guard);
  /* !!! Race condition occurs here !!! */
    ChainTask(Read);
  } else {
  ReleaseResource(Guard);
  /* !!! Race condition occurs here !!! */
  TerminateTask();
  }
}

Example 4.6: A System where a Race Condition can Occur

4.10 小結(jié)

?資源用于在訪問(wèn)共享數(shù)據(jù)或硬件資源時(shí)提供互斥。

?任務(wù)和ISR可以共享任意數(shù)量的資源。

?所有GetResource()和ReleaseResource()調(diào)用必須正確嵌套。

?所有資源必須在任務(wù)或ISR終止前釋放。

?調(diào)度器可以作為資源使用,但如果可能的話,應(yīng)該優(yōu)先使用內(nèi)部資源。

?內(nèi)部資源為控制任務(wù)組和ISR之間的搶占提供了一種自由(Free)機(jī)制。





審核編輯:劉清

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

    關(guān)注

    37

    文章

    6614

    瀏覽量

    123031
  • AUTOSAR
    +關(guān)注

    關(guān)注

    10

    文章

    345

    瀏覽量

    21417
  • ISR
    ISR
    +關(guān)注

    關(guān)注

    0

    文章

    38

    瀏覽量

    14378
  • WIPL
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    6186

原文標(biāo)題:符合AUTOSAR標(biāo)準(zhǔn)的RTA-OS --Resources詳解

文章出處:【微信號(hào):汽車(chē)電子嵌入式,微信公眾號(hào):汽車(chē)電子嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    TC397如何同時(shí)運(yùn)行CP Autosar OS和FreeRTOS?

    TC397 如何同時(shí)運(yùn)行兩個(gè)不同的RTOS ,如FreeRTOS 和基于CP AutosarOS
    發(fā)表于 01-24 08:31

    TC387配置Autosar OS后主核跑飛了怎么解決?

    使用TC387芯片配置Autosar OS發(fā)現(xiàn)主核跑飛了,其他核正常運(yùn)行OS任務(wù)切換,PC指針指向_IF_CONST區(qū)域,D[4]寄存器為1,D[15]寄存器為4,根據(jù)這兩個(gè)寄存器用計(jì)算規(guī)則計(jì)算出的TCN和TIN好像有問(wèn)題,在T
    發(fā)表于 03-06 08:24

    如何開(kāi)發(fā)符合AUTOSAR規(guī)范的電機(jī)控制器軟件

    基于AUTOSAR規(guī)范的電機(jī)控制器軟件開(kāi)發(fā)本系列文章主要介紹如何開(kāi)發(fā)符合AUTOSAR規(guī)范的電機(jī)控制器軟件的詳細(xì)過(guò)程。全系類(lèi)分為基礎(chǔ)篇和實(shí)戰(zhàn)篇:基礎(chǔ)篇內(nèi)簡(jiǎn)要介紹最新的AUTOSAR規(guī)范
    發(fā)表于 08-30 08:59

    “E:\NXP\AUTOSAR\S32K_AUTOSAR_OS_4_0_98_RTM_1_0_0sample\standard\sc1”編譯時(shí)無(wú)法生成sample1_cfg.o怎么解決?

    ccarm_oil /obj/Os_prop.h\"" E:\\NXP\\AUTOSAR\\AS32K_AUTOSAR4098 \\樣本\\標(biāo)準(zhǔn)\\sc1\\output_gccar
    發(fā)表于 04-06 07:42

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

      OSEK是由歐洲自動(dòng)化協(xié)會(huì)對(duì)汽車(chē)電氣制定的開(kāi)放式系統(tǒng),全程為OSEK/VDX。RTA-OS是基于OSEK OS符合AUTOSAR規(guī)范的OS
    的頭像 發(fā)表于 04-15 16:43 ?3208次閱讀

    經(jīng)緯恒潤(rùn)自主研發(fā)出符合AUTOSAR標(biāo)準(zhǔn)的軟件產(chǎn)品

    INTEWORK-EAS(ECU AUTOSAR Software,以下簡(jiǎn)稱(chēng)EAS)是經(jīng)緯恒潤(rùn)自主研發(fā),符合 AUTOSAR 標(biāo)準(zhǔn)的軟件產(chǎn)品。解決方案涵蓋了嵌入式
    的頭像 發(fā)表于 05-12 17:50 ?2061次閱讀

    開(kāi)發(fā)支持符合AUTOSAR標(biāo)準(zhǔn)的軟件組件的建模特定領(lǐng)域的語(yǔ)言

    開(kāi)發(fā)支持符合AUTOSAR標(biāo)準(zhǔn)的軟件組件的建模特定領(lǐng)域的語(yǔ)言。支持建模軟件組件的應(yīng)用是基于TextX python模塊和內(nèi)部開(kāi)發(fā)的建??蚣?。
    的頭像 發(fā)表于 10-08 11:19 ?1028次閱讀

    RTA OS系列介紹01-Task

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

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

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

    符合AUTOSAR標(biāo)準(zhǔn)RTA-OS --Task詳解

    必須同時(shí)執(zhí)行許多不同活動(dòng)的系統(tǒng)稱(chēng)為并發(fā)。這些活動(dòng)可能包含一些軟件部分,因此提供這些活動(dòng)的程序必須同時(shí)執(zhí)行。這些程序必須在任何必要的時(shí)候進(jìn)行合作,例如,當(dāng)它們需要共享數(shù)據(jù)時(shí)。
    的頭像 發(fā)表于 04-17 09:38 ?5225次閱讀

    符合AUTOSAR標(biāo)準(zhǔn)RTA-OS--Interrupts介紹

    中斷提供了應(yīng)用程序與現(xiàn)實(shí)世界中發(fā)生的事情之間的接口。例如,你可以使用中斷來(lái)捕捉被按下的按鈕,來(lái)標(biāo)記時(shí)間的流逝或捕捉一些其他事件。
    的頭像 發(fā)表于 04-26 09:31 ?4446次閱讀
    <b class='flag-5'>符合</b><b class='flag-5'>AUTOSAR</b><b class='flag-5'>標(biāo)準(zhǔn)</b>的<b class='flag-5'>RTA-OS</b>--Interrupts介紹

    AUTOSAR ComM功能及配置參數(shù)詳解

    AUTOSAR ComM模塊的分享分為ComM模塊概念詳解和ComM模塊配置及代碼分析
    的頭像 發(fā)表于 06-01 10:00 ?7269次閱讀
    <b class='flag-5'>AUTOSAR</b> ComM功能及配置參數(shù)<b class='flag-5'>詳解</b>

    符合AUTOSAR標(biāo)準(zhǔn)RTA-OS--Counters介紹

    計(jì)數(shù)器以tick為單位記錄操作系統(tǒng)中發(fā)生了多少“事情”。滴答是一個(gè)抽象的單位。
    的頭像 發(fā)表于 06-25 09:04 ?2509次閱讀
    <b class='flag-5'>符合</b><b class='flag-5'>AUTOSAR</b><b class='flag-5'>標(biāo)準(zhǔn)</b>的<b class='flag-5'>RTA-OS</b>--Counters介紹

    一文入門(mén)AUTOSAR OS

    Autosar OsAutosar 框架中上至RTE 下至驅(qū)動(dòng),中間可以和BSW 基礎(chǔ)模塊進(jìn)行交互。是整個(gè)autosar 框架下最重要的組成部分。
    的頭像 發(fā)表于 06-29 10:34 ?3943次閱讀
    一文入門(mén)<b class='flag-5'>AUTOSAR</b> <b class='flag-5'>OS</b>

    AUTOSAR OS操作系統(tǒng)功能特性

    AUTOSAR OS AUTOSAR OS(AUTomotive Open System ARchitecture Operating System)是
    的頭像 發(fā)表于 10-27 16:55 ?1980次閱讀