官术网_书友最值得收藏!

第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軟件仿真工程建立完畢。

主站蜘蛛池模板: 桂林市| 高邑县| 满城县| 虎林市| 龙胜| 徐州市| 鄢陵县| 湘阴县| 安庆市| 克什克腾旗| 类乌齐县| 武功县| 麻栗坡县| 石城县| 轮台县| 民权县| 时尚| 南陵县| 舞钢市| 拜泉县| 崇阳县| 社会| 清水河县| 洞口县| 上虞市| 新田县| 正安县| 诏安县| 建水县| 沈阳市| 云龙县| 同德县| 邵武市| 合山市| 石嘴山市| 郎溪县| 田阳县| 星座| 和平区| 镇平县| 潞西市|