一、准備
開發板MCU型號:STM32F103VET
開發環境:TrueSTUDIO
輔助工具軟件:STM32CubeMX
官方參考工程:Micrium_uC-Eval-STM32F107_uCOS-II.zip
下載鏈接:https://www.micrium.com/downloadcenter/download-results/?searchterm=mi-stm32f107&supported=true
二、創建一個裸機工程
1.使用STM32CubeMX創建一個基於HAL庫的STM32裸機工程,同時配置3個GPIO控制LED燈。下面簡單介紹下配置:
①時鍾源選擇(沒有截圖的部分默認):

②時鍾配置,我使用的是8MHz的外部晶振,配置系統時鍾是72MHz(沒有截圖的部分默認):

③GPIO配置,選擇的引腳分別是GPIOB_5、GPIOB_1、GPIOB_0,設置為輸出模式,默認輸出都是高電平(沒有截圖的部分默認):

④工程配置,選擇的開發環境是TrueSTUDIO(其它默認):

⑤導入使用STM32CubeMX生成的工程到TrueSTUDIO編譯環境中,在main函數中添加測試代碼確保工程沒問題,我這里選擇一個GPIO控制LED燈1s閃爍:

三、准備移植uCOSii系統
1.在編譯環境中創建兩個文件夾Bsp和Middle,注意創建的方式,如果創建的文件夾方式不對會導致無法識別路徑:

2.拷貝官方工程中的三個ucos系統文件(uC-CPU、uC-LIB和uCOS-II)到自己的工程Middle文件夾中:

3.拷貝官方工程中BSP文件夾中的bsp.c和bsp.h文件到自己工程Bsp文件夾中:

4.拷貝官方工程uCOS-II文件夾中的配置文件(app_cfg.h、cpu_cfg.h、includes.h、lib_cfg.h和os_cfg.h)到自己的Inc文件夾中:

5.拷貝官方工程中uCOS-II文件夾中的app.c和app_hooks.c文件到自己的Src文件夾中:

6.刪除ucos系統源碼中的一些文件夾,只保留GNU文件夾,如果你使用的是MDK編譯器只保留RealView文件夾:


7.刪除后顯示的結果:

8.在自己工程中添加相關ucos系統的源碼路徑:

9.將main.c文件中的下面兩個函數定義放到app.c文件中:

10.在app.c的主函數中添加HAL_Init()函數:

11.刪除main.c和main.h文件,把在使用#include "main.h"的地方改成#include "stm32f1xx_hal.h"。
12.編譯工程,對報錯的地方進行修改:
①修改bsp.h文件,只留下如下圖所示內容:

②修改bsp.c文件,涉及到BSP的函數除了如下圖所示的兩個保留,並做修改,其它的都刪掉;涉及到OS的不用刪,限於篇幅這里就不再展示。

③修改includes.h文件,修改內容如下圖所示:

④修改app.c文件,這里創建起始任務的函數可以換成OSTaskCreate()函數替代:

順便提一下,下圖標記的地方一定不要忽視,如果不關中斷,任務會無法運行,開中斷會在啟動任務的時候自動打開。
修改起始任務:

當修改完以上內容后再次編譯,基本已經不會報錯了,但是需要修改的地方還沒結束;
13.如下圖所示,這里有幾個關於系統的配置文件,我們要一一對其檢查

①app_cfg.h文件:
只保留如下圖所示內容:
②cpu_cfg.h文件:
做如下修改:

③lib_cfg.h文件:
根據自身硬件狀況修改任務堆的大小,堆消耗的是內存資源,這里是27Kbyte:
④ os_cfg.h文件:
這里因人而異,我這兩個功能都不使用。
14.下面修改最關鍵的內容:
①啟動文件的標記處要設置成ucos系統的,注意書寫不要錯誤,這是很多人會犯的錯誤:


②在stm32f1xx_it.c文件的SysTick_Handler()函數中添加ucos系統的中斷函數OS_CPU_SysTickHandler(),這樣做的目的是保證HAL_Delay()函數也能使用,在HAL_Init()函數中SysTick是被啟動了的,設置的節拍是1ms:

再次編譯沒問題,移植工作基本結束,下面創建幾個任務測試下移植是否成功。
15.創建多個任務
①任務優先級和任務棧的大小設置:

這里要注意系統配置文件中配置的當前系統支持的最低優先級和最大任務數量:

②定義任務的棧大小:

③下圖所示的是從主函數到每個任務的創建:

下載到開發板可以看到三個燈不停的閃爍,因為我使用的是RGB燈,在閃爍的過程可以看到彩色燈光效果。至此ucos-ii系統的移植完成。
#endif
