RTOS 設(shè)計(jì)已成為許多嵌入式應(yīng)用的關(guān)鍵,RTOS 用于超過 50% 的嵌入式應(yīng)用程序,并且隨著如此多的設(shè)備開始連接并開始使用機(jī)器學(xué)習(xí),這些數(shù)字只會(huì)增加。嵌入式開發(fā)人員在設(shè)計(jì)基于 RTOS 的應(yīng)用程序時(shí),有許多注意事項(xiàng),在今天的文章中,我們探討5個(gè)RTOS 設(shè)計(jì)最佳實(shí)踐。
1. 數(shù)據(jù)決定設(shè)計(jì)
好的軟件設(shè)計(jì)是由數(shù)據(jù)驅(qū)動(dòng)的,換句話說,數(shù)據(jù)決定設(shè)計(jì)。大多數(shù)系統(tǒng)是事件生成數(shù)據(jù)的實(shí)時(shí)系統(tǒng),反過來,這些數(shù)據(jù)必須以各種方式流經(jīng)應(yīng)用程序,進(jìn)行處理,然后存儲(chǔ)或輸出。
在開始 RTOS 設(shè)計(jì),甚至任何嵌入式應(yīng)用程序設(shè)計(jì)時(shí),首先要識(shí)別應(yīng)用程序中的所有數(shù)據(jù)源。首先創(chuàng)建一個(gè)列表;接下來,在圖表中繪制塊并標(biāo)記數(shù)據(jù)源;最后,將數(shù)據(jù)源映射到它們的最終目的地,標(biāo)記數(shù)據(jù)如何轉(zhuǎn)換、如何處理以及哪些應(yīng)用程序區(qū)域使用數(shù)據(jù)。當(dāng)完成時(shí),任務(wù)、數(shù)據(jù)存儲(chǔ)、同步機(jī)制等自然會(huì)從數(shù)據(jù)流中出來。
2. 使用 RMS 驗(yàn)證你的設(shè)計(jì)
RMS,最著名的是速率單調(diào)調(diào)度,是一種分析技術(shù),設(shè)計(jì)人員可以使用它來測(cè)試他們關(guān)于系統(tǒng)中的任務(wù)是否可以成功調(diào)度的假設(shè)。RMS 存在多種模型,最基本的模型假設(shè):
任務(wù)是周期性的
任務(wù)是獨(dú)立的
使用搶占式調(diào)度
每個(gè)任務(wù)都有一個(gè)恒定的最壞情況執(zhí)行時(shí)間
所有任務(wù)都同樣重要
非周期性任務(wù)僅限于啟動(dòng)和故障恢復(fù)
乍一看,其中一些假設(shè)對(duì)于現(xiàn)實(shí)世界似乎非常不切實(shí)際,但是,大多數(shù)設(shè)計(jì)都可以使用它們進(jìn)行分解和驗(yàn)證。(更復(fù)雜的模型改進(jìn)了這些假設(shè))。示例分析如下:
3. 任務(wù)分解從外向內(nèi)開始
將應(yīng)用程序分解為任務(wù)可能具有挑戰(zhàn)性,嵌入式開發(fā)人員經(jīng)常發(fā)現(xiàn)自己會(huì)提出以下問題:
我的任務(wù)太多了嗎?
我沒有足夠的任務(wù)嗎?
可以安排所有這些任務(wù)嗎?
這些任務(wù)應(yīng)該合并還是分開?
開始分解應(yīng)用程序時(shí),最好的方法是從外向內(nèi)。首先查看硬件設(shè)備以及系統(tǒng)的輸入和輸出,查看數(shù)據(jù)和生成數(shù)據(jù)的速率,輸入/輸出和硬件及其數(shù)據(jù)流將有助于識(shí)別系統(tǒng)中的主要任務(wù),例如,你最終可能會(huì)得到一個(gè)簡單的圖表,如下所示:
上圖標(biāo)識(shí)了五個(gè)主要任務(wù),然后是一個(gè)可以進(jìn)一步分解的應(yīng)用程序塊。
4. 使用 OSAL 解耦 RTOS
很多公司圍繞他們的 RTOS 構(gòu)建他們的整個(gè)應(yīng)用程序,RTOS 應(yīng)該是應(yīng)用程序中的一個(gè)組件,而不是應(yīng)用程序的基礎(chǔ)。問題是開發(fā)人員無法控制 RTOS,如果 RTOS 發(fā)生更改,則應(yīng)用程序無法免受這些更改的影響,如果 RTOS 突然不再可用或被某人購買,更改為不同的 RTOS 可能與重寫大部分應(yīng)用程序一樣痛苦。
這里的最佳實(shí)踐是使用操作系統(tǒng)抽象層 (OSAL)。它可以非常優(yōu)雅地融入軟件架構(gòu),如下圖所示:
請(qǐng)注意,RTOS 只是應(yīng)用程序堆棧中間的另一個(gè)組件。如果我們想換出新的 RTOS,我們需要做的就是將 OSAL 映射更改為新的 RTOS。應(yīng)用程序?qū)⒉恢腊l(fā)生了什么變化!
OSAL 本質(zhì)上充當(dāng)依賴屏障,并將使用通用操作系統(tǒng)調(diào)用。例如,每個(gè) RTOS 都有一個(gè)信號(hào)量、互斥量等。OSAL 為常見的 RTOS 功能提供了通用 API。如果需要一些特定于操作系統(tǒng)的功能,這些功能不在像 CMSIS-RTOS2 這樣的通用 OSAL 中,那么嵌入式開發(fā)人員應(yīng)該為 OSAL 編寫自己的擴(kuò)展。這將繼續(xù)限制應(yīng)用程序?qū)?RTOS 的耦合和依賴。畢竟,你永遠(yuǎn)不知道它什么時(shí)候會(huì)改變。
5. 不要將信號(hào)量用作互斥體
互斥量和信號(hào)量是為不同的目的而設(shè)計(jì)的。互斥鎖旨在提供對(duì)資源的互斥訪問。信號(hào)量是為任務(wù)通知和協(xié)調(diào)而設(shè)計(jì)的。
設(shè)計(jì)人員和開發(fā)人員經(jīng)常使用二進(jìn)制信號(hào)量作為互斥體。互斥鎖可以鎖定/解鎖資源。可以給出或獲取二進(jìn)制信號(hào)量,從而導(dǎo)致看起來很像鎖定/解鎖的狀態(tài)。但是,這兩者之間有一個(gè)重要的區(qū)別。互斥體有一個(gè)稱為優(yōu)先級(jí)繼承的特性。在優(yōu)先級(jí)倒置的情況下,優(yōu)先級(jí)繼承可以提升任務(wù)的優(yōu)先級(jí),將優(yōu)先級(jí)倒置的影響降到最低。
信號(hào)量不支持優(yōu)先級(jí)繼承,因此當(dāng)用作互斥體時(shí)會(huì)導(dǎo)致優(yōu)先級(jí)反轉(zhuǎn)和其他設(shè)計(jì)問題。確保你了解這些差異,并且永遠(yuǎn)不要使用信號(hào)量來保護(hù)數(shù)據(jù)訪問。使用正確的工具,即互斥鎖。
結(jié)論
RTOS 設(shè)計(jì)正在成為或已經(jīng)成為嵌入式開發(fā)人員需要執(zhí)行的一項(xiàng)常見活動(dòng),很多困難可以通過我們剛剛研究的5個(gè)RTOS設(shè)計(jì)最佳實(shí)踐來緩解。仔細(xì)研究這些方法,你可以避免很多煩惱。