使用 RT-Thread 實時操作系統驅動你的硬體
從通用計算的角度,操作系統是提供計算機基本功能的一組軟體。操作系統保證了計算機硬體可以探測並響應外圍器件(如鍵盤、屏幕、移動設備、印表機等),並管理內存空間和外部存儲空間。
雖然一個 CPU 核心同一時間只能運行單個線程,但現代操作系統可以使多個程序表現的像是在同時運行。每一個任務執行的如此之短,一系列任務切換的如此之快,以至於看起來多個任務像是在並行進行。這一切都是由一個叫做 調度器 的子進程來控制的。
操作系統通常是為計算機準備的,安裝在硬碟上,管理計算機所要執行的任務。
為什麼實時操作系統對嵌入式系統而言不可或缺
我曾經在 2008 年接觸過嵌入式軟體,那時候我還是一名學生,正在學習 MCS-51 微處理器編程。因為我的主修專業是計算機科學,我在其它課程中的所有程序都是在 PC 上執行的。為微處理器晶元編程是完全不同的體驗。人生中第一次,我看到我的程序在裸板上運行,即使到現在我仍然記得,在我看到自己人生中第一個走馬燈程序成功運行時的那種興奮和激動。
但那種興奮轉瞬即逝。隨著為裸板寫出越來越多的程序,我遇到了越來越多的問題。這種沮喪並不是我獨有的。直接為晶元寫程序很困難,這也是 PC 要運行操作系統的很重要的原因。不幸的是,微處理器晶元(或嵌入式系統)通常是沒有操作系統的,它們只能採用「硬編碼」的方式編程,沒有操作系統幫助你管理代碼的運行。
在以「硬編碼」的方式為處理晶元編寫代碼的時候,可能會遇到下列問題:
並發
在裸板上是沒有管理程序運行的現成守護進程的。嵌入式系統軟體中,無可避免的要把所有的邏輯功能放在一個巨大的 while (1)
循環中。每個功能可能包含一個或多個延時函數。CPU 在運行延時函數的時候是順序執行的,沒有任何辦法跨越一個不必要的延時。正因如此,運行事務的複位操作只能是等待。最終結果就是很多的 CPU 處理時間浪費在空循環上,這對任務的並發非常不利。
模塊化
從軟體工程的角度,高內聚低耦合原則在軟體開發過程中被不厭其煩的頻頻強調,但是嵌入式軟體的不同模塊之間常常是重度耦合的,很多功能都集中在一個巨大的 while (1)
循環中,很難切分為模塊。設計低耦合軟體在編程上只是繁瑣一些,但在嵌入式系統上,要低耦合就難以編寫比較大型的軟體。
與此同時,如果使用了看門狗定時器,程序員還得在調用延時函數時倍加小心。如果延時時間太長,主程序沒有得到及時「喂狗」的時機,那麼看門狗將在程序運行過程中被觸發。嵌入式系統軟體開發過程中,需要考慮的東西太多了,即便是個簡單的延時函數,都不能掉以輕心。軟體越複雜,就越需要細心。想像一下,試圖將這一系列具有精細時間關係的交互功能拆分為模塊會怎麼樣。
軟體生態
很多高級的軟體組件依賴於其所基於的底層操作系統的實現。舉個自身的例子,我曾開發過一個基於 FreeModbus 的開源項目,原計劃將它移植到多種平台上,包括裸板。但與適應不同操作系統的便利性相比,有些功能過於複雜,無法在所有裸機板上實現。更糟糕的是,很多硬體平台因為缺乏一致性,只能各自從頭做起。
直至現在,我的 Modbus 棧仍然不支持在裸板上運行。
很多像 Realtek、TI 和 MediaTek 的大廠,所提供的 WiFi 軟體開發工具只能在操作系統上運行,且他們不公開固件源碼,所以在裸板上根本沒法使用這些工具。
實時性
有些應用領域對實時性有要求,比如有些場景中,必須在特定的時間觸發特定的軟體操作。在工業控制場景,機器實體控制過程中,機械部件必須以確定的時間和確定的順序執行動作。如果不能保證控制系統的實時性,整個機器可能出現功能異常,甚至危及工人生命。在裸板平台,所有的功能都塞在一個巨大的 while (1)
循環中,實時性無從保證。
重用性
重用性依賴於模塊化。沒誰願意翻來覆去做一成不變的事,對程序員而言更是如此。這不單單是浪費時間,更要命的是這使得代碼的維護異常複雜。尤其是,因為功能的實現依賴於底層的硬體,使用了不同晶元的不同硬體平台上,同樣的功能必須適配不同的硬體平台。這種情況下,重新發明輪子是無法避免的。
實時操作系統的優勢
幸運的是,現在有針對各種微處理器晶元的操作系統,它們被稱為實時操作系統(RTOS),和大多數操作系統一樣,它們擁有調度器,保證代碼以可預見的順序運行。
我是在 2010 年初次在裸板上使用實時操作系統。那時候,STM32 系列微處理器(MCU)開始流行,因為這種微處理器性能強大、功能豐富,很多人在上面跑操作系統。我使用的是 RT-Thread 操作系統,有很多基於它的現成組件可用。它使用的是 Apache 2.0 許可,和其它操作系統相比,我覺得這個很舒心。我已經基於它作為平台從事開發工作 10 年了。
使用實時操作系統為裸板編程,操作系統為我們解決了需要處理的大部分問題。
模塊化
在操作系統支持下,整個軟體可以分割為多個任務(即線程)。每個線程擁有自己獨立的運行空間。線程之間互相獨立,這促進了軟體的模塊化。
並發
如果一個線程有延時函數,它將自動讓出 CPU 資源給需要 CPU 的線程,這提高了 CPU 的整體利用率,也提升了系統的並發性能。
實時性
實時操作系統從設計上就具備實時性。每個線程都被指定了特定的優先順序,比較重要的線程設置為更高的優先順序,不重要的線程優先順序也低。正是以這種方式,軟體整體的實時性得到了保證。
開發效率
操作系統提供了統一的抽象介面,這使得可重用組件得以不斷積累,同時提升了開發效率。
操作系統是軟體極客集體智慧的結晶。很多通用的軟體功能,如信號量、事件提醒、郵箱、環形緩衝、單向鏈表、雙向鏈表等,被抽象出來並實現了封裝,可隨時調用。
Linux、RT-Thread 等操作系統為五花八門的硬體實現了一致的硬體介面,也就是常說的設備驅動框架。正因如此,軟體工程師可以專註於軟體開發,而不用關心底層的硬體,也不用重複造輪子。
軟體生態
RT-Thread 豐富的軟體生態為大量的從業者帶來了巨大的改變。操作系統帶來的模塊化和重用性,使得程序員可以基於 RT-Thread 封裝出方便嵌入式系統開發使用的可重用組件。這些組件可以在其它項目中重用,也可以分享給其他的嵌入式應用開發者,以最大化軟體的價值。
比如,LkdGui 是個開源的單色顯示圖形庫,你可能在工業控制面板上簡單而美觀的設置界面上見過它。LkdGui 提供了像描點、畫線、繪矩形及顯示文本、按鈕組件、進度條等繪圖功能。
![LkdGui](/data/attachment/album/202008/15/065758q2oi2pqupq1zi5pp.jpg "LkdGui")
使用像 LkdGui 這樣兼具擴展性和健壯性的功能庫,程序員們可以在同行已有工作成果的基礎上充分施展自己的才能。而這一切,沒有實時操作系統這樣一個統一的基礎,是根本不可能的。
試用 RT-Thread
作為開源極客,我已經在 GitHub 上開源了一些嵌入式軟體。在發布開源軟體之前,我很少對他人談及自己曾經的項目,因為不同的人在使用各種不同的微處理器晶元和硬體平台,我的代碼極可能無法在他人的板子上運行。類似於 RT-Thread 這樣的實時操作系統極大的提升了軟體的可重用性,所以全世界的不同領域的專家得以就同一個項目展開探討。這鼓勵著越來越多的人分享和交流各自的項目。如果你在做裸板的軟體開發,下次可以試試 TR-Thread。
via: https://opensource.com/article/20/6/open-source-rtos
作者:Zhu Tianlong 選題:lujun9972 譯者:silentdawn-zz 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive