目前市面上的單片機作業系統很多,為何FreeRTOS會這麼搶眼
隨著嵌入式開發的認知度越來越高,從事這個專業或者以此為愛好的朋友也是越來越多,當在裸機開發的過程中遇到任務比較多,難以處理的時候,難免就會想到使用作業系統,目前市面上的單片機作業系統很多,其中有一個比較搶眼的就是FreeRTOS,這個系統是完全開源的一個作業系統,所以使用的話沒有侵權的問題,而且可查閱的資料也很豐富,因此使用群體也是很大的一個數目,我們可以看一個2017年的數據,因為找了好久也沒有找到最新的數據
FreeRTOS是僅次於linux的作業系統,市場占比還是很不錯的,估計最近兩三年應該也不錯,畢竟開源的東西,沒有侵權問題,沒有費用問題,對於國內的很多個人開發者來說還是相當友好的。
今天我們就一步一步的教大家如何移植一個簡單的FreeRTOS例程!
FreeRTOS系統源碼下載
第一步我們需要做的就是到官網去下載最新版本的FreeRTOS源碼,這是我們移植的時候需要的,官網地址我給大家放這裡了,可以直接點擊進入哦
FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensionswww.freertos.org/
進入首頁就可以看到下載的引導
不過,這是個國外的網站,訪問起來可能會較慢,下載更是需要耗費不少的時間
目前官網提供的最新的版本是v10.4.1的,最好可以下載到最新的版本
FreeRTOS系統源碼所包含的內容
下載壓縮包之後打開,裡面主要包含以下的這些內容
前面的兩個文件夾是主要包含源碼的文件夾,而第二個帶有plus字樣的這個文件夾,主要是基於第一個文件夾內容的一些擴展,可以看一下內容
這個我們暫時使用不到,在初期我們主要的是使用第一個文件夾下的內容
在打開「FreeRTOS」文件夾之後分為這幾個文件夾
demo文件夾,顧名思義,包含的是一些可以參考的例程,FreeRTOS提供的例程真心不錯,包含各個工具鏈的,比如keil、eclipse等,包含各個不同的晶片的,基本上市面上主流的晶片在他們提供的demo里都可以找到。這個文件夾的主要作用就是給我們提供實例,教給我們如何使用,有很大的參考價值
source文件夾內存放的就是FreeRTOS的核心代碼了,也是我們在待會說例程移植的時候重點用到的部分,打開這個文件夾,包含以下部分內容
include文件夾內包含所有的頭文件,portable文件夾下包含的是和晶片接口相關的東西,我們打開這個文件夾之後可以看到,裡面是進一步層級的晶片分類文件夾
每個文件夾內包含的是一類晶片的接口文件
然後,最外層的這個七個源文件是FreeRTOS的核心代碼,主要是操作內核的作用
以上就是FreeRTOS系統的主要文件構成,下面我們就來看一下如何移植一個簡單的例程
如何移植一個例程
在操作這個之前,最好具備的前提:
第一、有一定的裸機開發經驗,做過裸機開發的例程;
第二、會使用keil開發工具,這一講我們是基於keil的,後續我們會講述基於eclipse的
第三、手頭有一個可以使用的開發板,以驗證例程的正確性;
我們這裡是基於一個裸機例程的,這樣會省去裸機當中需要很多基礎操作,這個不重要,如果你有裸機開發的經驗的話,自己先新建一個就好了,畢竟這個不是太難,而用裸機原有例程的目的就是為了方面驗證移植的正確性。
下面我們就正式開始:
第一步:將FreeRTOS的源碼copy到我們的項目目錄下,然後對系統做一下簡單的剪裁,因為原有的系統體積有點大,我們儘量的縮小系統的體量,在」portable「文件夾下只需要留下三個重要的文件夾即可,當然這個不是隨便留的,是和你使用的開發板有直接關係的,我使用的是STM32的板子,所以使用的是ARM內核,因此我留下的是以下三個,第二個內存管理是一樣的,都需要,第一個也都需要,第三個就是根據內核型號做選擇了;
第二步:使用keil打開我們準備好的基礎例程,打開之後先編譯一下,確保原有的環境配置以及源碼沒有問題,然後再進行下一步操作;
第三步:打開「Manage Project Items"操作卡,新建兩個分組,如下
從這個命名上,大家應該可以猜到一個是用來存放核心代碼的,一個是用來存放晶片的接口代碼的,新建好之後,把相應的源文件添加到分組內
這個是核心代碼需要添加的源文件,就是在上一小結中我們提到的,沒有被分配到文件夾下的核心代碼。
第二個文件分組就要注意了,這個需要根據你使用的開發板進行選擇,首先要選擇一個內存管理下的源文件,這裡是在」MemMang「這個文件夾下,這裡共有五個源文件
其對應的就是五種不同的內存管理方法,所達到的目的都是一樣的,也各有優缺點,我們這裡就先使用第四個,以後我們會詳細的講解不同的內存管理的優缺點。
然後,我們需要在選擇一個port的源文件,我們使用的是STM32的晶片,內核是M3的,所以我們需要使用的是RVDS下的ARM-CM3文件夾下的port.c文件,添加之後的效果如下
第四步:添加包含頭文件,我們之前說到的系統源碼還有一個專門的頭文件文件夾,還有RVDS下也有頭文件,需要把這些頭文件路徑做一下包含,如下
第五步:移植一個FreeRTOSConfig.h的頭文件,這個可以到demo工程中去找,每一個工程中都有這個文件,這是一個系統配置的文件,會使能一些系統的操作以及開啟一些系統API函數等,這個部分涉及的內容比較多,需要單獨去講,所以這裡建議先從demo中移植一個過來所使用,後續再慢慢理解;
第六步:編譯調試,理論上來說,到這裡你就可以編譯你的移植工程了,有可能你編譯會報錯,如果報錯的話就要根據報錯內容去修改,一般到這一步出錯都是可以通過更改FreeRTOSConfig內的配置解決的,當你解決完之後,編譯通過,到此並不代表你成功的移植了,你還需要通過功能來驗證;
第七步:在主函數實現功能,使用作業系統做功能,就需要建立task了,我們可以在主函數建立兩個簡單的task做一下驗證,這裡附上簡單的例程代碼,僅供參閱
首先定義變量函數
主函數內創建任務
實現兩個任務的任務函數
非常簡單的例程功能,就是為了驗證移植是否成功。
第八步:編寫玩主函數之後,就可以再次編譯了,編譯成功之後,下載到你的開發板,測試例程是否按照設計的功能運行。
備註:功能的實現是基於你的基礎例程的,這裡沒有提及,需要特別注意;主函數關於創建任務又是另一部分話題,這裡沒有展開去說,在後續的其他文章中會繼續說明,展開的話,此篇內容篇幅太大,不利於閱讀。
到此,一個簡單的例程移植結束!
小結:主要從宏觀上了解一下一個FreeRTOS的例程是什麼樣的,然後自己去實現一個簡單的例程,系統涉及的內容面還是比較廣泛的,很難一篇文章都提及,我們會在後續的文章中逐步的給大家展開。