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

第2章 新建FreeRTOS工程——軟件仿真

在開始寫FreeRTOS內核之前,先新建一個FreeRTOS的工程,Device選擇Cortex-M3(Cortex-M4或Cortex-M7)內核的處理器,調試方式選擇軟件仿真,然后我們再開始一步一步地教大家把FreeRTOS內核從0到1寫出來,讓大家徹底搞懂FreeRTOS的內部實現和設計的思想。最后我們再把FreeRTOS移植到野火STM32開發板上,最后的移植其實已經非常簡單,只需要換一下啟動文件和添加bsp驅動即可。

2.1 新建本地工程文件夾

在開始新建工程之前,我們先在本地計算機端新建一個文件夾用于存放工程。文件夾名設置為“新建FreeRTOS工程——軟件仿真”(名字可以隨意設置),然后在該文件夾下面新建各個文件夾和文件,有關這些文件夾的包含關系和作用具體如表2-1所示。

表2-1 工程文件夾根目錄下的文件夾及作用

2.2 使用KEIL新建工程

開發環境我們使用KEIL5,版本為5.23,高于版本5即可。

2.2.1 New Project

首先打開KEIL5軟件,新建一個工程,工程文件放在目錄Project下面,名稱為Fire_FreeRTOS,文件夾名稱必須是英文,不能是中文。

2.2.2 Select Device for Target

設置好工程名稱,單擊OK按鈕之后會彈出Select Device for Target對話框,讓我們選擇處理器,這里選擇ARMCM3(ARMCM4或ARMCM7),具體如圖2-1(圖2-2或圖2-3)所示。

圖2-1 Select Device(ARMCM3)for Target

圖2-2 Select Device(ARMCM4)for Target

圖2-3 Select Device(ARMCM7)for Target

2.2.3 Manage Run-Time Environment

選擇好處理器,單擊OK按鈕后會彈出Manage Run-Time Environment對話框。這里我們在CMSIS欄中選中CORE,在Device欄中選中Startup即可,具體如圖2-4所示。

圖2-4 Manage Run-Time Environment

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

圖2-5 CORE和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)內核的單片機,這兩個文件都適用。

2.3 在KEIL工程中新建文件組

在工程里面添加user、rtt/ports、rtt/source和doc這幾個文件組,用于管理文件,具體如圖2-6所示。

對于新手,這里有個問題,就是如何添加文件組,具體的方法為右擊Target 1,在彈出的快捷菜單中選擇Add Group…命令,具體如圖2-7所示,需要創建多少個組,就按上述方法操作多少次。

圖2-6 新添加的文件組

圖2-7 如何添加組

2.4 在KEIL工程中添加文件

在工程中添加組之后,需要把本地工程中新建的文件添加到工程,具體為把readm.txt文件添加到doc組,main.c文件添加到user組,FreeRTOS相關的文件我們還沒有編寫,那么FreeRTOS相關的組暫時為空,具體如圖2-8所示。

圖2-8 向組中添加文件

對于新手,這里有個問題就是如何將本地工程中的文件添加到工程組,具體的方法為雙擊相應的組,在彈出的對話框中找到要添加的文件,默認的文件類型是C文件,如果要添加的是文本或者匯編文件,那么此時將看不到,這時就需要把文件類型設置為All Files,最后單擊Add按鈕即可,具體如圖2-9所示。

圖2-9 向組中添加文件

下面編寫main()函數。

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

圖2-10 沒定義main()函數的錯誤

我們將main()函數寫在main.c文件中,因為是剛剛新建的工程,所以main()函數暫時為空,具體參見代碼清單2-1。

代碼清單2-1 main()函數

 1 /*
 2 ************************************************************************
 3 *                                main()函數
 4 ************************************************************************
 5 */
 6 int main(void)
 7 {
 8 for (;;)
 9     {
10 /* 無操作 */
11     }
12 }

2.5 調試配置

2.5.1 設置軟件仿真

最后,我們再配置一下與調試相關的參數。為了方便,全部代碼都用軟件仿真,既不需要開發板也不需要仿真器,只需要一個KEIL軟件即可,有關軟件仿真的配置具體如圖2-11所示。

圖2-11 軟件仿真的配置

2.5.2 修改時鐘大小

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

代碼清單2-2 時鐘相關宏定義

 1 #define __HSI     ( 8000000UL)
 2 #define __XTAL    ( 5000000UL)
 3
 4 #define __SYSTEM_CLOCK    (5*__XTAL)  /* 5×5000000 = 25M */

2.5.3 添加頭文件路徑

在C/C++選項卡中指定工程頭文件的路徑,否則編譯會出錯。頭文件路徑的具體指定方法如圖2-13所示。

圖2-12 軟件仿真時鐘配置

圖2-13 指定頭文件的路徑

至此,一個完整的基于Cortex-M3(Cortex-M4或Cortex-M7)內核的FreeRTOS軟件仿真工程建立完畢。

主站蜘蛛池模板: 图木舒克市| 嘉义市| 大厂| 临泽县| 镇巴县| 常山县| 德钦县| 昌黎县| 台山市| 同心县| 霍州市| 大田县| 腾冲县| 马尔康县| 河西区| 常熟市| 阿拉善右旗| 阜阳市| 宁化县| 扶余县| 红原县| 台江县| 同仁县| 陆良县| 惠来县| 安庆市| 阳原县| 新宾| 连州市| 当涂县| 伊通| 百色市| 桃源县| 南安市| 大理市| 那曲县| 汤原县| 平顶山市| 石嘴山市| 确山县| 和硕县|