天天看點

從0到1教你寫UCOS-III 第三部分:建立工程-軟體仿真

      在開始寫 RTOS 之前,我們先建立一個工程, Device 選擇 Cortex-M3 核心的處理器,調試方式選擇軟體仿真,到最後寫完整個 RTOS 之後,我們再把 RTOS 移植到野火 STM32開發闆上,到了最後的移植其實已經非常簡單,隻需要換一下啟動檔案和添加 bsp 驅動就行。

3.1 建立本地工程檔案夾:

      在開始建立工程之前,我們先在本地電腦端建立一個檔案夾用于存放工程。 檔案夾名字我們取為 Sum_RTOS,然後再在該檔案夾下面建立各個檔案夾和檔案, 有關這些檔案夾的包含關系和作用具體見表格 3-1。

      表格 3-1 工程檔案夾根目錄下的檔案夾的作用

從0到1教你寫UCOS-III 第三部分:建立工程-軟體仿真

3.2 使用 KEIL 建立工程:

      開發環境我們使用 KEIL5,版本為 5.15,高于或者低于 5.15 都行,隻要是版本 5 就行。

3.2.1 New Progect:

      首先打開 KEIL5 軟體,建立一個工程, 工程檔案放在目錄 Project\RVMDK(uv5) 下面,名稱命名為 Sum-uCOS-III, 其中 Sum是部落格名前三位,當然你也可以換成其它名稱,但是必須是英文,不能是中文,切記。

3.2.2 Select Device For Target:

      當命名好工程名稱,點選确定之後會彈出 Select Device for Target 的選項框,讓我們選擇處理器,這裡我們選擇 ARMCM3,具體見圖 3-1。

從0到1教你寫UCOS-III 第三部分:建立工程-軟體仿真

3.2.3 Manage Run-Time Environment:

     選擇好處理器,點選 OK按鈕後會彈出 Manage Run-Time Environment 選項框。這裡我們在CORE和 Device 欄選中 Startup 這兩個檔案即可,具體見圖 3-2。

從0到1教你寫UCOS-III 第三部分:建立工程-軟體仿真

Manage Run-Time Environment 選項框之後,剛剛我們選擇的 CORE和Startup 這兩個檔案就會添加到我們的工程組裡面,具體見圖 3-3。

從0到1教你寫UCOS-III 第三部分:建立工程-軟體仿真

      其實這兩個檔案剛開始都是存放在 KEIL 的安裝目錄下,當我們配置 Manage RunTime Environment選項框之後,軟體就會把選中好的檔案從 KEIL的安裝目錄拷貝到我們的工程目錄: Project\RTE\Device\ARMCM3 下面。 其中 startup_ARMCM3.s 是彙編編寫的啟動檔案, system_ARMCM3.c 是 C 語言編寫的跟時鐘相關的檔案。更加具體的可直接閱讀這兩個檔案的源碼。 隻要是 Cortex-M3核心的單片機,這兩個檔案都适用。

3.3 在 KEIL 工程裡面建立檔案組:

       在工程裡面添加 User、uC/OS-III Source、 uC/OS-III Ports、 uC/CPU、uC/LIB 和 Doc這幾個檔案組,用于管理檔案, 具體見圖 3-4。

從0到1教你寫UCOS-III 第三部分:建立工程-軟體仿真

     對于新手,這裡有個問題就是如何添加檔案組?具體的方法為滑鼠右鍵 Target1,在彈出的選項裡面選擇 Add Group…即可,具體見圖 3-5,需要多少個組就滑鼠右擊多少次Target1。

從0到1教你寫UCOS-III 第三部分:建立工程-軟體仿真

3.4 在 KEIL 工程裡面添加檔案:

      在工程裡面添加好組之後,我們需要把本地工程裡面建立好的檔案添加到工程裡面。具體為把 readme.txt 檔案添加到 Doc 組, app.c 添加到 User 組,至于 OS 相關的檔案我們還沒有編寫,那麼 OS相關的組就暫時為空,具體見圖 3-6。

從0到1教你寫UCOS-III 第三部分:建立工程-軟體仿真

      對于新手,這裡有個問題就是如何将本地工程裡面的檔案添加到工程組裡裡面?具體的方法為滑鼠左鍵輕按兩下相應的組,在彈出的檔案選擇框中找到要添加的檔案,預設的檔案類型是 C 檔案,如果要添加的是文本或者彙編檔案,那麼此時将看不到,這個時候就需要把檔案類型選擇為 All Files,最後點選 Add按鈕即可,具體見圖 3-7。

從0到1教你寫UCOS-III 第三部分:建立工程-軟體仿真

3.4.1 編寫 main 函數:

       一個工程如果沒有 main 函數是編譯不成功的,會出錯。因為系統在開始執行的時候先執行啟動檔案裡面的複位程式,複位程式裡面會調用 C 庫函數__main, __main 的作用是初始化好系統變量,如全局變量,隻讀的,可讀可寫的等等。 __main 最後會調用__rtentry,再由__rtentry 調用 main 函數,進而由彙編跳入到 C 的世界,這裡面的 main 函數就需要我們手動編寫,如果沒有編寫 main 函數,就會出現 main 函數沒有定義的錯誤,具體見圖 3-8。

從0到1教你寫UCOS-III 第三部分:建立工程-軟體仿真

       main 函數我們寫在 app.c 檔案裡面,因為是剛剛建立工程,是以 main 函數暫時為空,具體見代碼清單 3-1。

從0到1教你寫UCOS-III 第三部分:建立工程-軟體仿真

3.5 調試配置:

3.5.1 設定軟體仿真:

       最後,我們再配置下調試相關的配置即可。為了友善,我們全部代碼都用軟體仿真,即不需要開發闆也不需要仿真器,隻需要一個 KEIL 軟體即可,有關軟體仿真的配置具體見圖 3-9。

從0到1教你寫UCOS-III 第三部分:建立工程-軟體仿真

3.5.2 修改時鐘大小:

      在時鐘相關檔案 system_ARMCM3.c 的開頭,有一段代碼定義了系統時鐘的大小為25M,具體見代碼清單 3-2。在軟體仿真的時候,確定時間的準确性,代碼裡面的系統時鐘跟軟體仿真的時鐘必須一緻,是以 Options for Target->Target 的時鐘應該由預設的 12M 改成 25M,具體見圖 3-10。

從0到1教你寫UCOS-III 第三部分:建立工程-軟體仿真
從0到1教你寫UCOS-III 第三部分:建立工程-軟體仿真

3.5.3 添加頭檔案路徑: