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

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

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

使用RTOS時(shí)問(wèn)題如何檢測(cè)和糾正

星星科技指導(dǎo)員 ? 來(lái)源:嵌入式計(jì)算設(shè)計(jì) ? 作者: Jean Labrosse ? 2022-06-30 10:07 ? 次閱讀

基于 RTOS 的問(wèn)題

在本節(jié)中,我們將探討開(kāi)發(fā)人員在使用 RTOS 時(shí)遇到的一些常見(jiàn)問(wèn)題,并展示如何檢測(cè)和糾正這些問(wèn)題。

堆棧溢出:

在基于內(nèi)核的應(yīng)用程序中,每個(gè)任務(wù)都需要自己的堆棧。任務(wù)所需的堆棧大小是特定于應(yīng)用程序的。 如果使堆棧大于任務(wù)所需,則會(huì)浪費(fèi)內(nèi)存。如果堆棧太小,您的應(yīng)用程序很可能會(huì)覆蓋應(yīng)用程序變量或另一個(gè)任務(wù)的堆棧。堆棧區(qū)域外的任何寫(xiě)入都稱為堆棧溢出。當(dāng)然,在這兩種選擇之間,為堆棧過(guò)度分配內(nèi)存比分配不足要好。因此,您可以通過(guò)過(guò)度分配內(nèi)存來(lái)減少堆棧溢出的機(jī)會(huì)。但是,通常只需要 25-50% 的額外堆棧空間。一些 CPU,例如基于 ARMv8M 架構(gòu)的 CPU,具有內(nèi)置的堆棧溢出檢測(cè)功能。但是,該功能無(wú)助于確定正確的堆棧大小。它只是防止堆棧溢出的負(fù)面后果。

參考文獻(xiàn)[1]解釋了如何確定每個(gè)任務(wù)堆棧的大小。簡(jiǎn)而言之,您通過(guò)為任務(wù)堆棧過(guò)度分配空間來(lái)開(kāi)始您的設(shè)計(jì),然后在已知的最壞情況下運(yùn)行您的應(yīng)用程序,同時(shí)監(jiān)控實(shí)際的堆棧使用情況。

下圖是 μC/Probe 對(duì)一個(gè)測(cè)試應(yīng)用的內(nèi)核感知的截圖。Stack Usage列顯示每個(gè)任務(wù)在任何給定時(shí)間的最大堆棧使用量的條形圖。雖然截取了屏幕截圖,但 μC/Probe 會(huì)實(shí)時(shí)更新并顯示此信息,因此您無(wú)需停止目標(biāo)即可查看此信息,因?yàn)樗诟隆?/p>

綠色表示最大堆棧使用率一直保持在 70% 以下。

黃色表示堆棧使用率介于 70% 和 90% 之間。

紅色表示堆棧使用率已超過(guò) 90%。

顯然,應(yīng)該增加使用 92% 的任務(wù)的堆棧,使其回到 70% 范圍以下。黃色的任務(wù)堆棧是空閑任務(wù),在 77% 的情況下,它通常不會(huì)成為問(wèn)題,除非您將代碼添加到空閑任務(wù)回調(diào)函數(shù)(這取決于您使用的 RTOS)。

pYYBAGK9BXuACTJAAALxJalYhUk898.png

中斷響應(yīng):

在操作內(nèi)部數(shù)據(jù)結(jié)構(gòu)(即臨界區(qū))時(shí),RTOS 和應(yīng)用程序代碼通常必須禁用中斷。RTOS 開(kāi)發(fā)人員盡一切努力減少中斷禁用時(shí)間,因?yàn)樗鼤?huì)影響系統(tǒng)對(duì)事件的響應(yīng)。

一些 RTOS 實(shí)際上基于每個(gè)任務(wù)測(cè)量最壞情況下的中斷禁用時(shí)間,如下面的 μC/Probe 屏幕截圖所示。如果您試圖滿足實(shí)時(shí)截止日期,則此信息非常寶貴。

中斷被禁用的時(shí)間很大程度上取決于 CPU、它的時(shí)鐘頻率、您的應(yīng)用程序和被調(diào)用的 RTOS 服務(wù)。禁用中斷時(shí)間最長(zhǎng)的任務(wù)以紅色突出顯示。這使您可以快速識(shí)別潛在的異常值,尤其是在大型和復(fù)雜的應(yīng)用程序中。

pYYBAGK9BYSAOJBIAAMiBG7qqio864.png

如果最大的中斷禁用時(shí)間是由 RTOS 引起的,那么您可能無(wú)能為力,除非:

查找中斷禁用時(shí)間較短的備用 RTOS API。例如,如果您只是向任務(wù)發(fā)出信號(hào)以指示事件發(fā)生,那么您可以簡(jiǎn)單地掛起/恢復(fù)任務(wù),而不是使用信號(hào)量或事件標(biāo)志。換句話說(shuō),等待事件的任務(wù)會(huì)自行掛起,而發(fā)出事件信號(hào)的 ISR 會(huì)恢復(fù)任務(wù)。

提高 CPU 的時(shí)鐘頻率。不幸的是,這很少是一種選擇,因?yàn)槠渌蛩乜赡芤呀?jīng)決定了理想的 CPU 時(shí)鐘頻率。

使用非內(nèi)核感知中斷來(lái)處理對(duì)時(shí)間高度敏感的代碼。

優(yōu)先級(jí)反轉(zhuǎn):

當(dāng)?shù)蛢?yōu)先級(jí)任務(wù)擁有高優(yōu)先級(jí)任務(wù)所需的資源時(shí),就會(huì)發(fā)生優(yōu)先級(jí)反轉(zhuǎn)。當(dāng)中等優(yōu)先級(jí)任務(wù)搶占低優(yōu)先級(jí)任務(wù)同時(shí)持有資源時(shí),問(wèn)題會(huì)更加嚴(yán)重。術(shù)語(yǔ)“優(yōu)先級(jí)倒置”指的是低優(yōu)先級(jí)任務(wù)的行為就好像它比高優(yōu)先級(jí)任務(wù)具有更高的優(yōu)先級(jí),至少在共享該資源時(shí)是這樣。

優(yōu)先級(jí)反轉(zhuǎn)是實(shí)時(shí)系統(tǒng)中的一個(gè)問(wèn)題,并且在使用基于優(yōu)先級(jí)的搶占式內(nèi)核時(shí)會(huì)發(fā)生(大多數(shù) RTOS 都是搶占式的)。如下圖所示,SystemView 用于說(shuō)明優(yōu)先級(jí)倒置的場(chǎng)景。

App HPT(High Priority Task)優(yōu)先級(jí)最高

App MPT (Medium Priority Task) 具有中等優(yōu)先級(jí)

App LPT (低優(yōu)先級(jí)任務(wù))的優(yōu)先級(jí)最低

poYBAGK9BY2AFLtvAADiTjbS9x8808.png

1 - LPT 是唯一可以運(yùn)行的任務(wù),因此它獲取 CPU 并獲取信號(hào)量以訪問(wèn)共享資源。

2 -為了模擬優(yōu)先級(jí)反轉(zhuǎn)的發(fā)生,LPT 使 HPT 準(zhǔn)備好運(yùn)行,因此 RTOS 上下文切換到 HPT。

3 - HPT 使 MPT 準(zhǔn)備好運(yùn)行但繼續(xù)執(zhí)行,因?yàn)?HPT 仍然具有更高的優(yōu)先級(jí)。

4 - HPT 需要訪問(wèn)共享資源并嘗試獲取信號(hào)量。但是,由于信號(hào)量歸 LPT 所有,HPT 無(wú)法繼續(xù)執(zhí)行,因此 RTOS 切換到 MPT。

5 - MPT 一直執(zhí)行,直到它需要等待其事件再次發(fā)生,以便 RTOS 切換回 LPT。

6 - LPT 完成對(duì)共享資源的使用,因此它釋放信號(hào)量。此時(shí),RTOS 注意到 HPT 正在等待資源,因此將信號(hào)量提供給 HPT 并使其準(zhǔn)備好運(yùn)行。HPT 恢復(fù)執(zhí)行并執(zhí)行它需要對(duì)共享資源執(zhí)行的任何操作。

7 - 一旦 HPT 完成對(duì)資源的訪問(wèn),它就會(huì)釋放信號(hào)量,然后等待其事件再次發(fā)生(在這種情況下,我們通過(guò)自掛起模擬了這一點(diǎn))。

8 - LPT 恢復(fù)執(zhí)行,因?yàn)槠渌麅蓚€(gè)任務(wù)都沒(méi)有準(zhǔn)備好運(yùn)行。

9 -發(fā)生優(yōu)先級(jí)反轉(zhuǎn)是因?yàn)?LPT 擁有 HPT 需要的資源。但是,當(dāng)中等優(yōu)先級(jí)任務(wù)進(jìn)一步延遲 LPT 釋放信號(hào)量時(shí),問(wèn)題會(huì)變得更糟。

您可以通過(guò)使用稱為 Mutex(互斥信號(hào)量)的特殊 RTOS 機(jī)制來(lái)解決上述優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題。下圖顯示了相同的場(chǎng)景,除了這里 LPT 和 HPT 都使用互斥鎖而不是信號(hào)量來(lái)訪問(wèn)共享資源。

poYBAGK9BZSAZi-dAADndWCPgbg026.png

1 - LPT 是唯一可以運(yùn)行的任務(wù),因此它獲取 CPU 并獲取互斥體以訪問(wèn)共享資源。

2 - 為了模擬優(yōu)先級(jí)反轉(zhuǎn)的發(fā)生,LPT 使 HPT 準(zhǔn)備好運(yùn)行,因此 RTOS 上下文切換到 HPT。

3 - HPT 使 MPT 準(zhǔn)備好運(yùn)行但繼續(xù)執(zhí)行,因?yàn)?HPT 仍然具有更高的優(yōu)先級(jí)。

4 - HPT 需要訪問(wèn)共享資源并嘗試獲取互斥鎖。但是,由于互斥鎖歸 LPT 所有,因此 HPT 無(wú)法繼續(xù)執(zhí)行。但是,由于使用了互斥體,RTOS 會(huì)將 LPT 的優(yōu)先級(jí)提高到 HPT 的優(yōu)先級(jí),以防止它被中等優(yōu)先級(jí)搶占。

5 - 然后 RTOS 切換到 LPT,它現(xiàn)在以與 HPT 相同的優(yōu)先級(jí)運(yùn)行。

6 - LPT 完成對(duì)共享資源的使用,因此它釋放互斥鎖。RTOS 將 LPT 的優(yōu)先級(jí)降低回其原始(較低)優(yōu)先級(jí),并將互斥鎖分配給 HPT。

7 - RTOS 切換回 HPT,因?yàn)樗诘却尫呕コ怄i。一旦完成,HPT 就會(huì)釋放互斥鎖。

8 - 一旦 HPT 完成其工作的執(zhí)行,它就會(huì)等待它正在等待的事件的再次發(fā)生。

9 - RTOS 切換到在就緒隊(duì)列中等待的 MPT。

10 -當(dāng) MPT 完成它的工作時(shí),它還掛起將導(dǎo)致該任務(wù)再次執(zhí)行的事件。

11 - LPT 現(xiàn)在可以恢復(fù)執(zhí)行。

優(yōu)先級(jí)反轉(zhuǎn)現(xiàn)在受限于 LPT 訪問(wèn)共享資源所需的時(shí)間量。如果沒(méi)有像 SystemView 這樣的工具,優(yōu)先級(jí)反轉(zhuǎn)將很難識(shí)別和糾正。

請(qǐng)注意,如果 LPT 僅比 HPT 低一個(gè)優(yōu)先級(jí),則可以使用信號(hào)量。在這種情況下,信號(hào)量是首選,因?yàn)樗然コ怄i更快,因?yàn)?RTOS 不需要更改 LPT 的優(yōu)先級(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)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10813

    瀏覽量

    210897
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1477

    瀏覽量

    61763
  • RTOS
    +關(guān)注

    關(guān)注

    21

    文章

    809

    瀏覽量

    119368
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RTOS與Linux到底有什么區(qū)別

    很多做嵌入式開(kāi)發(fā)的小伙伴都存在這樣的疑惑:RTOS與Linux到底有什么區(qū)別?
    的頭像 發(fā)表于 10-29 09:53 ?252次閱讀

    深入解析Zephyr RTOS的技術(shù)細(xì)節(jié)

    Zephyr是一個(gè)針對(duì)資源受限設(shè)備優(yōu)化的小型、可縮放、多體系架構(gòu)實(shí)時(shí)操作系統(tǒng)(RTOS)。Zephyr由Linux基金會(huì)維護(hù)[1],是一個(gè)以構(gòu)建業(yè)界最佳的RTOS為目標(biāo)的開(kāi)源合作項(xiàng)目。近年來(lái)
    的頭像 發(fā)表于 10-22 16:47 ?236次閱讀
    深入解析Zephyr <b class='flag-5'>RTOS</b>的技術(shù)細(xì)節(jié)

    RTOS正在縮小與Linux的差距

    RTOS與Linux的物聯(lián)網(wǎng)設(shè)備操作系統(tǒng)之爭(zhēng)已經(jīng)持續(xù)了很多年。Linux以其強(qiáng)大的計(jì)算能力和豐富的軟件生態(tài),在需要復(fù)雜處理和軟件支持的物聯(lián)網(wǎng)設(shè)備上占據(jù)一席之地;RTOS憑借實(shí)時(shí)響應(yīng)和資源節(jié)約的特性
    的頭像 發(fā)表于 09-10 08:07 ?666次閱讀
    <b class='flag-5'>RTOS</b>正在縮小與Linux的差距

    freertos和rtos區(qū)別是什么

    FreeRTOS 和 RTOS(實(shí)時(shí)操作系統(tǒng))是兩個(gè)不同的概念,但它們之間有緊密的聯(lián)系。FreeRTOS 是一個(gè)特定的開(kāi)源實(shí)時(shí)操作系統(tǒng),而 RTOS 是實(shí)時(shí)操作系統(tǒng)的一般概念。 概念定義 RTOS
    的頭像 發(fā)表于 09-02 14:18 ?864次閱讀

    RTOS與Linux有什么區(qū)別

    RTOS(Real-Time Operating System,實(shí)時(shí)操作系統(tǒng))與Linux是兩種在不同應(yīng)用場(chǎng)景下發(fā)揮重要作用的操作系統(tǒng),它們?cè)谠O(shè)計(jì)理念、功能特性、應(yīng)用場(chǎng)景以及性能表現(xiàn)等方面存在顯著差異。以下是對(duì)RTOS與Linux區(qū)別的詳細(xì)分析。
    的頭像 發(fā)表于 08-20 16:05 ?2773次閱讀

    RTOS的特性和類(lèi)型

    實(shí)時(shí)操作系統(tǒng)(RTOS)是一種可運(yùn)行實(shí)時(shí)計(jì)算應(yīng)用程序的軟件平臺(tái),用于處理具有明確時(shí)間約束的事件和數(shù)據(jù)。與通用操作系統(tǒng)(GPOS)不同,RTOS必須在有限的硬件資源上調(diào)度應(yīng)用程序之間的處理和數(shù)據(jù)共享
    的頭像 發(fā)表于 08-20 11:29 ?470次閱讀

    RTOS開(kāi)發(fā)最佳實(shí)踐

    基于RTOS編寫(xiě)應(yīng)用程序時(shí),有一些要注意事項(xiàng)。在本節(jié)中,您將學(xué)習(xí)RTOS開(kāi)發(fā)最佳實(shí)踐,例如POSIX合規(guī)性、安全性和功能安全認(rèn)證。
    的頭像 發(fā)表于 08-20 11:24 ?379次閱讀

    簡(jiǎn)單認(rèn)識(shí)RTOS實(shí)時(shí)操作系統(tǒng)

    RTOS(Real Time Operating System,實(shí)時(shí)操作系統(tǒng))是一種專(zhuān)門(mén)設(shè)計(jì)用于在嚴(yán)格時(shí)間限制內(nèi)處理任務(wù)的操作系統(tǒng)。它以其高實(shí)時(shí)性、多任務(wù)處理能力和資源管理能力在工業(yè)自動(dòng)化、醫(yī)療設(shè)備、航空航天、汽車(chē)電子等眾多領(lǐng)域得到廣泛應(yīng)用。以下是對(duì)RTOS實(shí)時(shí)操作系統(tǒng)的
    的頭像 發(fā)表于 08-20 11:20 ?2144次閱讀

    基于RTOS的應(yīng)用進(jìn)程中的典型線程

    RTOS中的關(guān)鍵因素是最小的中斷延遲和最小的線程切換延遲。RTOS的價(jià)值在于它的響應(yīng)速度或可預(yù)測(cè)性,而不是它在給定時(shí)間段內(nèi)可以執(zhí)行的工作量。
    發(fā)表于 03-05 09:32 ?507次閱讀
    基于<b class='flag-5'>RTOS</b>的應(yīng)用進(jìn)程中的典型線程

    基于糾正措施系統(tǒng)(FRACAS)的關(guān)鍵技術(shù)

    故障報(bào)告,分析和糾正措施系統(tǒng)是一種系統(tǒng)的方法,用于從一個(gè)或多個(gè)來(lái)源收集失效數(shù)據(jù),針對(duì)根本原因?qū)?shù)據(jù)進(jìn)行匯編和分析以及識(shí)別糾正措施。
    的頭像 發(fā)表于 02-20 10:34 ?1341次閱讀

    如何糾正三相電源相序

    。下面將通過(guò)詳細(xì)討論相序錯(cuò)誤的原因、檢測(cè)糾正方法,以及在實(shí)際應(yīng)用中的注意事項(xiàng),來(lái)幫助讀者深入了解如何糾正相序錯(cuò)誤。 首先,我們需要明確相序錯(cuò)誤的原因。相序錯(cuò)誤通常發(fā)生在電氣系統(tǒng)中的三相電源供電電纜的接線錯(cuò)誤或者設(shè)
    的頭像 發(fā)表于 01-04 14:30 ?5408次閱讀

    使用AD9914進(jìn)行相位糾正功能的疑惑求解答

    最近使用AD9914進(jìn)行相位糾正功能實(shí)現(xiàn)。存在一些疑惑: 對(duì)于預(yù)設(shè)的16位相位偏移字(POW)在送入AD9914執(zhí)行后,對(duì)于輸出的波形,請(qǐng)問(wèn)是會(huì)出現(xiàn) 相位截?cái)囝?lèi)型的波形(我在示波器上沒(méi)能捕捉到)(圖1),還是產(chǎn)生類(lèi)似頻率增長(zhǎng)(相位累加器斜率增加)的波形(圖2)快速追到補(bǔ)償?shù)南辔唬?圖1 圖2
    發(fā)表于 12-05 08:26

    微軟開(kāi)源Azure RTOS,并更名為Eclipse ThreadX

    Azure RTOS 是一個(gè)帶有 ThreadX 實(shí)時(shí)操作系統(tǒng)(RTOS)的嵌入式開(kāi)發(fā)套件。ThreadX 是一個(gè)普及性很高的小型 RTOS,可為資源受限的設(shè)備提供可靠、超快的性能;目前已部署在全球超過(guò) 120 億臺(tái)設(shè)備上。
    的頭像 發(fā)表于 12-01 16:17 ?753次閱讀
    微軟開(kāi)源Azure <b class='flag-5'>RTOS</b>,并更名為Eclipse ThreadX

    什么是實(shí)時(shí)操作系統(tǒng)(RTOS)

    實(shí)時(shí)操作系統(tǒng)(RTOS)是一種專(zhuān)為實(shí)時(shí)應(yīng)用程序設(shè)計(jì)的操作系統(tǒng)。實(shí)時(shí)應(yīng)用程序需要在特定時(shí)間內(nèi)做出預(yù)測(cè)的響應(yīng),因此 RTOS 專(zhuān)注于提供對(duì)時(shí)間約束的強(qiáng)調(diào),以確保系統(tǒng)能夠滿足實(shí)時(shí)性能要求。
    的頭像 發(fā)表于 11-23 17:14 ?5502次閱讀

    新手必看的RTOS基礎(chǔ)知識(shí)

    時(shí)間片調(diào)度保證每個(gè)線程都有一個(gè)要執(zhí)行的槽。這種類(lèi)型的調(diào)度通常不利于實(shí)時(shí)應(yīng)用。如果需要,TI-RTOS內(nèi)核支持使用任務(wù)進(jìn)行時(shí)間切片調(diào)度。
    的頭像 發(fā)表于 11-20 16:06 ?2321次閱讀
    新手必看的<b class='flag-5'>RTOS</b>基礎(chǔ)知識(shí)