1 為什麼使用RTOS

嵌入式,最開始學習的時候,都用裸機編程,主要是熟悉怎麼操作硬體電路。而在商業產品中,裸機程序是很難滿足要求。當前的電子設備中,可能涉及到網路模塊、藍牙模塊、定位系統(北斗/GPS)、陀螺儀、攝像頭等,這些系統都需要實時響應,使用裸機編程,內部進行輪詢,隨著業務複雜度增加,寫出來的程序將會出現各種漏洞,程序沒有崩潰,人先崩潰了。使用操作系統後,對於複雜系統,僅需要關注業務實現和業務間的同步和通信。同時,使用操作系統,也有利於進行團隊協作。大型的嵌入式項目,有良好的架構設計,和伺服器編程(java/C++)類似,有利於代碼的可讀性和擴展性。

我也寫過一些低端的嵌入式程序,曾經做過一個充電管理晶元編程,使用臺灣的一款8位晶元,內存和運輸速度極小,有部分還需要使用彙編編碼。功能就是使用兩個ADC管腳,採集電壓,充電不同階段,控制一個二極體以不同顏色和閃爍頻率通知。這種嵌入式就只適用裸機編程,功能單一,對晶元成本極為敏感。即使是如此簡單的功能,新手和老兵寫出的代碼可讀性和健壯性還是差很多。老兵寫出的代碼,會帶有部分操作系統多任務風格。同時可以充分利用晶元的性能和特性,增加一些輔助功能,比如為每個設備設置唯一電子編碼、完成多種警示燈功能等。

使用操作系統的好處就不多說了,現在物聯網設備越來越多,對於嵌入式的要求也越來越高,就像智能手機發展過程中的安卓系統。國內主流的系統有AliOS,華為liteOS,uCOS,RT-Thread,FreeRTOS等。前兩者在圍繞的自有的生態進行大量擴張,提供了大量的適配自有功能的組件,作為開源免費系統,正在對uCOS和FreeRTOS(亞馬遜)市場形成很大威脅。

2 怎麼選擇RTOS

使用哪個RTOS,完全就是一個偶然結果。最開始學習的是uCOS- II,不過都是N年前的學習的,對其中的基本蓋寧還有印象,當時使用的IAR軟體,自己也沒有去裁剪內核,都是從老師的工程裏直接拷貝的,按照老師的教學過程一步一步編寫了幾段代碼實現最簡單的按鍵、流水燈等,也接觸到了一些名詞,比如任務、信號量、隊列、動態內存、阻塞態、就緒態、搶佔式、優先順序、時間片、鉤子函數、IDLE任務、TICK任務等。有了這些基礎,對自學其他操作系統有了很大幫助。

在實際商業工程中選擇RTOS需要謹慎選擇,當前國內公司對版權越來越重視,所以需要在一開始就要規避一些商業風險,之前在網上看了很多介紹,最後還是選擇的FreeRTOS,其實原因就兩個,一是免費,二是網上的資料多。uCOS在商業使用上存在風險,國內的RT-Thread在文檔資料上要遜色一點,因為用戶很多是中國人,英文資料比較少,當時也沒有深入瞭解過,後來深入讀了官網的文檔,覺得也很不錯,有很多實用組件。我使用的是STM32的晶元,這個晶元在官網上對FreeRTOS的支持更多,其中在cubemx中直接集成,這樣對推廣該系統有很大促進。對於一個初學者,學習uCOS是一個比較好的選擇,畢竟該系統發展更成熟,實用案例更多。學習了uCOS,再學其他的系統,基本都是手到擒來。

3 學習RTOS

AliOS和華為LiteOS在行業裏發展很快,有專業團隊做技術支持,借鑒了uCOS和FreeRTOS的成功經驗。而個人建議從uCOS或者FreeRTOS學起,畢竟有大量的參考資料和開源示例代碼,而前兩者多是商業項目採用,社區論壇還有待積累,從成熟系統學起,有利於快速上手。

對於學習RTOS,個人的經驗是,要動手操作,不要侷限於一些暫時難以理解的概念和名詞。

上手一個RTOS,掌握如下幾個基礎操作,就可以自己上路,去打怪升級了:

1) 多任務

2) 信號量/事件組

3) 隊列

4) 通知

5) 任務調度

6) 定時器

7) Tickless

8) 內存管理

這些基礎功能理解後,再去掌握高級功能,需要深入的讀專業書籍和走讀源代碼,同時需要不停的學習。

4 示常式序

github地址:

tracediary/FreeRTOS-STM32L1?

github.com
圖標

說明:因為網路上大量使用的是STM32F1xx系列產品,物聯網的發展對於設備的功耗要求越來越敏感,我選擇了一款低功耗產品,STM32L1xx,此係列在網路上示例源碼較少,上傳此示例,僅供參考

個人微信公眾號:tracediary

推薦閱讀:

相關文章