從0開始的FreeRTOS(1)

2022-03-24 15:56:08 字數 1855 閱讀 6110

這個系列的教程的主要目的是帶大家了解實時系統(real time operating system)的基本概念,熟悉freertos的api使用方法,具備基本的使用rtos進行工程開發的能力

系列計畫分幾期錄完,內容分別為

本教程的開發環境:

我們這節課主要解決兩個問題:

什麼是rtos?

為什麼要用rtos?

第乙個問題:

什麼是rtos(real time operating system 實時作業系統),在回答這個問題之前,我們先說明白什麼是os(operating system 作業系統)。

我們正常使用電腦時感覺和使用微控制器有很大的差距,在微控制器上,我們可以直接呼叫io,中斷這些硬體功能,但是在電腦時,我們只能夠通過一些應用程式與計算機進行互動。

這是因為我們在操作微控制器時是在直接和微控制器的硬體進行互動,而在使用電腦的時候,實際上我們是和作業系統進行互動,然後作業系統再幫我們完成和硬體互動的過程,用專業一點的方法來說,就是作業系統區分了使用者態和核心態,涉及硬體的操作,只能在核心態下由作業系統進行訪問,而使用者則只能在使用者態進行操作。

作業系統本身就像套在硬體外面的一層殼一樣,我們使用者再在作業系統的外層進行使用者應用的開發,使用者應用通過作業系統去操作硬體。

而實時作業系統也是作業系統的一種。

實時作業系統相比一般的作業系統會更加強調實時性,相比我們平時使用的作業系統更加注重及時響應使用者的輸入,實時作業系統的重點是在外界時間或者資料產生時,能夠快速接收和處理,處理的結果又能在規定的時間做出響應。

實時作業系統一般用在工業控制,軍事裝置,航空航天這些對實時性要求強的場景中。

在stm32開發時,我們一般會採取裸機開發的方式,所謂裸機是指我們一般的輪詢+中斷的工程**構築方式,我們能夠實現比較複雜的任務的手段主要是通過中斷優先順序和中斷巢狀。而且這些工作的完成是依賴於nvic暫存器,也就是完全以硬體的方式完成的。

但我們也可以通過freertos這樣的實時作業系統進行開發,也就是我們建立一些使用者程序,由作業系統根據我們之前設定好的需求對程序的執行進行管理,這是一種通過軟體對任務進行排程的方式。

當然,我們上面講的並不是作業系統的全部,實際上作業系統的歷史發展和多道程式設計技術密切相關,但這些不是我們這裡的重點了

第二個問題,為什麼要用rtos:

使用rtos最大的優勢是避免由於不定長中斷引發的問題,在傳統的裸機開發時,有的時候會因為過長等待乙個中斷的觸發,或者過長時間處理乙個中斷,導致整個系統發生了混亂乃至於崩潰。

而在rtos中,我們可以通過靈活的排程機制避免這種問題

另外rtos會給每個任務分配固定的任務棧,並在發生棧溢位時進行處理,避免了由於棧溢位導致系統崩潰的風險

此外使用rtos還有便於實現軟體介面等一些優勢,比如在移植工程時,如果是裸機開發,我們就要重新配置中斷,而如果是rtos,我們直接將使用者程序拷貝過來就能使用了,免去了重新進行硬體配置的麻煩

最後,在非常複雜的大工程,以至於完全基於中斷進行設計幾乎不可能時,使用rtos進行任務排程會是很好的選擇

我們這次教程要介紹的freertos就是rtos的一種,其他比較常見的還有ucosⅱ,ecos,都江堰等實時作業系統,freertos正如其名,是乙個'free'的rtos,它的原始碼和文件可以免費從官網上面獲取。

選擇freertos作為我們這次教程講解的物件,一方面是因為可以通過cubemx很輕鬆的生成乙個包含freertos的32工程。另一方面,freertos已經是乙個應用範圍很廣,占有率很高,社群很龐大的實時作業系統了。

FreeRTOS 1 記憶體管理

freertos提供的記憶體分配方案分別位於不同的原始檔 heap 1.c heap 2.c heap 3.c heap 4.c heap 5.c 之中 所有實現中最簡單的乙個。一旦分配記憶體之後,不允許釋放分配的記憶體。當需要分配ram時,這個記憶體分配方案只是簡單的將乙個大陣列細分出乙個子集來。...

從0開始的FreeRTOS(3)

這次我們開始介紹freertos的任務管理機制。在第一講中,我們知道了作業系統是在乙個在記憶體中自動對任務進行排程的硬體和使用者的 中間層 這一講中我們來介紹作業系統所作用的物件 任務。當然,在講述作業系統原理時我們不會使用任務這種說法,一般被使用的術語是 程序。我們先簡單介紹一下程序的概念,對於程...

FreeRtos 1 任務建立與管理

freertos實時作業系統移植 以上是歷史freertos部落格。freertos系列我會堅持更下去。任務的建立函式 basetype t xtaskcreate taskfunction t pxtaskcode,const char const pcname,const configstack...