RTOS 應用程序開發人員面臨的三個常見挑戰
RTOS 應用程序嵌入式開發人員面臨著幾個共同的挑戰。讓我們檢查這些挑戰并討論一些潛在的解決方案。
挑戰 #1 – 選擇任務優先級
事實證明,有幾種不同的方法來選擇任務優先級。首先,有最短的響應時間。在這種方法中,開發人員檢查每個任務的響應時間要求,并將最高優先級分配給具有最短響應時間要求的任務。
其次,有最短作業優先方法。在這種方法中,開發人員檢查任務的執行時間,執行時間最短的任務是最高優先級(顯然其次是下一個最高優先級,依此類推)。
最后,還有一種在實時嵌入式系統中最常用的方法,即最短周期優先或更常用的“速率單調調度(RMS)”。在這種方法中,周期最短的任務優先級最高。
遵循 RMS 將使你完成 95% 的任務,然后通常會有一個奇怪的任務,或者是非周期性的,需要優先級分配。這些非周期性任務可以分配一個最壞情況周期,也可以根據它們的重要性、執行時間或是否需要在另一個可能需要其數據的任務之前運行來分配它們。(請記住,任務優先級沒有正確或錯誤的答案,只有可能比其他系統運行得更好或更高效的系統)。
挑戰#2 — 用數據流圖看大圖
嵌入式開發人員在實施他們的 RTOS 應用程序時并沒有真正了解數據是從哪里產生的、去往何處以及如何到達那里的,這會導致軟件有點像糟亂的代碼,并且隨著更多應用程序的部署,經常需要不斷地返工。盡量減少這種返工并了解整個應用程序的方法是開發一個簡單的數據流圖。該圖包含幾個關鍵組件:
- 數據生產者
- 數據消費者
- 數據傳輸機制
- 存儲機制
- 任務協調機制
擁有此數據流圖可以回答有關應用程序設計的許多問題,并避免將大量時間浪費在返工或調試上。
挑戰 #3 – 正確保護共享內存
互斥鎖用于保護共享內存資源,但在實現中,經常有嵌入式開發人員將互斥鎖與受保護的數據分開創建。雖然乍一看這似乎沒問題,但問題是如果互斥鎖是獨立于數據結構創建的,并且有人去使用該數據結構,他們可能不會意識到它是一個共享和受保護的資源。(是的,文檔、設計和許多其他東西應該使這一點顯而易見,但如果單獨聲明它很容易被忽視)。
解決方案是將共享內存視為一個對象,并將互斥鎖作為共享內存數據結構的一部分。例如,共享內存可能有來自濕度、溫度和電流傳感器的數據。我們通??梢匀缦侣暶鲾祿慕Y構:
typedef struct
{
uint16_t Humidity;
uint16_t Temperature;
uint16_t Current;
}SensorData_t;
同樣,單獨聲明的互斥鎖可能會使數據共享變得不那么明顯。相反,我們可以定義如下結構:
typedef struct
{
mutex_t SensorDataMutex;
uint16_t Humidity;
uint16_t Temperature;
uint16_t Current;
}SensorData_t
現在,每當開發人員查看數據結構、嘗試執行自動完成等操作時,都會提醒他們這是受保護的數據。當他們看到它被保護時,它應該提醒他們在訪問數據之前,他們需要獲取互斥鎖。
開發人員經常忘記,僅僅因為創建互斥鎖是為了保護數據,并不能保證互斥鎖將用于訪問數據。(這也是為什么將數據結構視為一個對象并創建限制對數據資源的訪問和控制的函數很有用,這些數據資源在應用程序級別抽象出互斥鎖)。
實時操作系統可以簡化嵌入式系統的時間和資源管理。但是,RTOS 確實增加了系統的復雜性,可能會產生影響開發計劃和代碼質量的意想不到的挑戰。在今天的文章中,我們研究了嵌入式開發人員經常遇到的幾個常見挑戰,通過遵循一些最佳實踐可以很容易地克服這些挑戰。