- RT-Thread內核實現與應用開發實戰指南:基于STM32
- 劉火良 楊森
- 1948字
- 2019-01-21 10:02:20
第1章
新建RT-Thread工程——軟件仿真
在開始編寫RT-Thread內核之前,我們先新建一個RT-Thread工程,Device選擇Cortex-M3(Cortex-M4或Cortex-M7)內核的處理器,調試方式選擇軟件仿真,然后我們開始一步一步地教大家把RT-Thread內核寫出來,讓大家徹底明白RT-Thread的內部實現和設計思想,最后把RT-Thread移植到野火STM32開發板上。最后的移植其實已經非常簡單,只需要換一下啟動文件并添加bsp驅動即可。
1.1 新建本地工程文件夾
在開始新建工程之前,我們先在本地計算機中新建一個文件夾用于存放工程。可將文件夾命名為“新建RT-Thread工程——軟件仿真”(名字可以隨意設置),然后在該文件夾下新建各個文件夾和文件,有關這些文件夾的包含關系和作用如表1-1所示。
表1-1 工程文件夾根目錄下的文件夾及作用

1.2 使用KEIL新建工程
開發環境我們使用KEIL5,版本為5.23,高于或者低于5.23均可,但應為版本5系列。
1.2.1 New Project
首先打開KEIL5軟件,新建一個工程,工程文件放在目錄Project下面,命名為Fire_RT-Thread,其中Fire表示“野火”,當然也可以為其他名稱,但是應注意必須用英文,不能用中文。
1.2.2 Select Device for Target
設置好工程名稱,確定之后會彈出相應Select Device for Target對話框,選擇處理器,這里選擇ARMCM3,也可根據Device型號選擇ARMCM4或ARMCM7,如圖1-1~圖1-3所示。

圖1-1 選擇ARMCM3

圖1-2 選擇ARMCM4

圖1-3 選擇ARMCM7
1.2.3 Manage Run-Time Environment
選擇好處理器后,單擊OK按鈕將彈出Manage Run-Time Environment對話框。這里在CMSIS欄中選中CORE,在Device欄中選中Startup文件即可,如圖1-4所示。

圖1-4 Manage Run-Time Environment對話框
單擊OK按鈕,關閉Manage Run-Time Environment對話框之后,剛剛選擇的CORE和Startup這兩個文件就會添加到工程組中,如圖1-5所示。

圖1-5 CORE(即system)和Startup文件
這兩個文件剛開始都是存放在KEIL的安裝目錄下,當配置Manage Run-Time Environment對話框之后,軟件就會把選中的文件從KEIL的安裝目錄復制到我們的工程目錄Project\RTE\Device\ARMCM3(ARMCM4或ARMCM7)下面。其中startup_ARMCM3.s(startup_ARMCM4.s或startup_ARMCM7.s)是用匯編語言編寫的啟動文件,system_ARMCM3.c(system_ARMCM4.c或system_ARMCM7.c)是用C語言編寫的與時鐘相關的文件。若想了解更加具體的內容,可直接閱讀這兩個文件的源碼。只要是Cortex-M3(Cortex-M4或Cortex-M7)內核的單片機,這兩個文件都適用。
1.3 在KEIL工程中新建文件組
在KEIL工程中添加user、rtt/ports、rtt/source和doc這4個文件組,用于管理文件,如圖1-6所示。

圖1-6 新添加的文件組
對于初學者,有一個問題就是如何添加文件組。具體的方法為右擊Target 1,在彈出的快捷菜單中選擇Add Group...命令即可,如圖1-7所示。需要多少個組,就按此步驟操作多少次。

圖1-7 添加組
1.4 在KEIL工程中添加文件

圖1-8 向組中添加文件
在工程中添加好組之后,需要把本地工程中創建好的文件添加到工程里面。具體操作為把readm. txt文件添加到doc組,把main.c文件添加到user組,至于RT-Thread相關的文件目前還沒有編寫,那么RT-Thread相關的組暫時為空,如圖1-8所示。
對于初學者,有一個問題是如何將本地工程中的文件添加到工程組中。具體的方法為雙擊相應的組,在彈出的文件對話框中找到要添加的文件,默認的文件類型是C文件。如果要添加的是文本或者匯編文件,那么此時將看不到這類文件,這時就需要將“文件類型”設置為All files,最后單擊Add按鈕即可,如圖1-9所示。

圖1-9 向組中添加文件的方法
下面編寫main()函數。
一個工程中如果沒有main()函數是無法編譯成功的,因為系統在開始執行時先執行啟動文件里面的復位程序,復位程序中會調用C庫函數__main, __main的作用是初始化系統變量,如全局變量,以及只讀的、可讀可寫的變量等。__main最后會調用__rtentry,再由__rtentry調用main()函數,從而由匯編跳入C的世界,這里的main()函數就需要我們手動編寫,如果沒有編寫main()函數,就會出現main()函數未定義的錯誤,如圖1-10所示。

圖1-10 未定義main()函數的錯誤
main()函數寫在main.c文件中,因為是剛剛新建的工程,所以main()函數暫時為空,具體參見代碼清單1-1。
代碼清單1-1 main()函數
1 /* 2 ************************************************************************ 3 * main()函數 4 ************************************************************************ 5 */ 6 int main(void) 7 { 8 for (; ; ) 9 { 10 /* 無操作 */ 11 } 12 }
1.5 調試配置
1.5.1 設置軟件仿真
完成上述操作后,再配置一下調試相關的參數即可。為了方便,本書全部代碼都用軟件仿真,既不需要開發板,也不需要仿真器,只需要一個KEIL軟件即可。有關軟件仿真的具體配置如圖1-11所示。

圖1-11 軟件仿真的配置
1.5.2 修改時鐘大小
在時鐘相關文件system_ARMCM3.c(system_ARMCM4.c或system_ARMCM7.c)的開頭,有一段代碼定義了系統時鐘的頻率為25MHz,具體參見代碼清單1-2。在軟件仿真時,要確保時間的準確性,代碼中系統時鐘與軟件仿真的時鐘必須一致,所以Options for Target對話框中Target選項卡中的時鐘頻率應該由默認的12改成25,如圖1-12所示。

圖1-12 軟件仿真時鐘配置
代碼清單1-2 時鐘相關宏定義
1 #define __HSI ( 8000000UL) 2 #define __XTAL ( 5000000UL) 3 4 #define __SYSTEM_CLOCK (5*__XTAL) /* 5*5000000=25M*/
1.5.3 添加頭文件路徑
應在C/C++選項卡中指定工程頭文件的路徑,否則編譯會出錯。頭文件路徑的具體指定方法如圖1-13所示。

圖1-13 指定頭文件的路徑
至此,一個完整的基于Cortex-M3(Cortex-M4或Cortex-M7)內核的RT-Thread軟件仿真工程建立完畢。