移植準備工作需要3個文件
uCOSIII源碼:【uC-CPU-master】源碼、【uC-LIB-master】源碼、【uC-OS3-master】源碼
Micrium例程:【Micrium_STM32H743ZI-Nucleo_Blinky】官方工程
裸機工程文件:【V7-001_LED】stm32h7裸機LED工程
uCOSIII源碼下載地址為:https://github.com/SiliconLabs。打開下載「uC-OS3」、「uC-LIB」、「uC-CPU」。
Micrium例程下載地址為:https://www.micrium.com/downloadcenter/ 。打開下載基於stm32h7的uCOS工程(雖然是uCOSII的,但bsp驅動同樣支持uCOSIII),如圖1
圖1裸機工程文件:自己準備一個基於stm32h7裸機LED工程
2、建立工程文件夾在stm32h7裸機LED工程中需要新建2個文件夾。
2-1、新建文件夾【uCOS-III】並複製源碼解壓uCOSIII源碼:【uC-CPU-master】源碼、【uC-LIB-master】源碼、【uC-OS3-master】源碼,並刪除後綴「-master」(刪除後綴僅僅為了好看(●'◡'●))。在stm32h7裸機LED工程根目錄新建文件夾【uCOS-III】,將3個已解壓的uCOSIII源碼複製進來,如圖2
圖22-2、新建文件夾【bsp_os】並複製源碼解壓 Micrium 例程:【Micrium_STM32H743ZI-Nucleo_Blinky】官方工程 ,移植需要的uCOSIII bsp文件,如圖3
圖3在stm32h7裸機LED工程文件夾【User】--【bsp】,建立新文件夾【bsp_os】,將圖3移植需要的uCOSIII bsp文件複製進來,如圖4
圖4至此,uCOSIII源文件及需要的bsp_os文件全部複製完畢!
2-3、複製用戶編寫的文件為了方便移植和使用,特別複製了3個白永斌編寫的文件,「app_cfg.h」、「os_cpu_isr.asm」、「includes.h」,作用分別是
「app_cfg.h」:配置用戶編寫的任務所需任務棧大小、任務優先級等
「os_cpu_isr.asm」:重命名PendSV_Handler 和 SysTick_Handler
「includes.h」 :一般都是不同廠家的軟體包頭文件有重複定義,容易造成問題。解決方法是是底層驅動獨立一個頭文件"bsp.h",應用獨立一個頭文件"includes.h",如果使用到GUI,再獨立一個頭文件"maintask.h"
最終,整個uCOSIII文件體系建立起來,如圖5
圖53、建立工程文件3-1、新建目錄 uC/OS Config新建uC/OS Config目錄,將文件夾【bsp_os】的文件app_cfg.h,文件路徑【uCOS-III\uC-CPU\Cfg\Template】、【uCOS-III\uC-LIB\Cfg\Template】、【uCOS-III\uC-OS3\Cfg\Template】所有.h文件添加進來,並設置編譯路徑,如圖6
圖63-2、新建目錄 uC/OS-III Source新建uC/OS-III Source目錄,將文件路徑【uCOS-III\uC-OS3\Source】中除文件__dbg_uCOS-III.c外的所有.c文件添加進來,並設置編譯路徑,如圖7
圖73-3、新建目錄 uC/OS-III Port新建uC/OS-III Port目錄,將文件路徑【uCOS-III\uC-OS3\Ports\ARM-Cortex-M\ARMv7-M】中文件os_cpu_c.c,文件路徑【uCOS-III\uC-OS3\Ports\ARM-Cortex-M\ARMv7-M\ARM】中文件os_cpu_a.asm,文件夾【bsp_os】的文件os_cpu_isr.asm添加進來,並設置編譯路徑,如圖8
圖83-4、新建目錄 uC/CPU新建uC/CPU目錄,將文件路徑【uCOS-III\uC-CPU】中文件cpu_core.c,文件路徑【uCOS-III\uC-CPU\ARM-Cortex-M\ARMv7-M】中文件cpu_c.c,文件路徑【uCOS-III\uC-CPU\ARM-Cortex-M\ARMv7-M\ARM】中文件 cpu_a.asm 添加進來,並設置編譯路徑,如圖9
圖93-5、新建目錄 uC/LIB圖103-6、添加 bsp_os 相關文件添加bsp_os相關文件,如圖11
圖11至此,MDK工程所有目錄及文件已添加完畢!
4、修改文件添加MDK工程所有目錄及文件完畢後的第一次編譯,出現55個錯誤,如圖12
圖12cpu_cfg.h 中將使能可編程中斷優先級配置,再次編譯出現7個錯誤,如圖13
圖13bsp_int_armv7m.c 中將CPU_REG_NVIC_VTOR 改為 CPU_REG_SCB_VTOR (因為版本3.08.00文件cpu.h中定義的變化),再次編譯出現6個錯誤,如圖14
圖14bsp_os.c 中將原版本中的宏定義修改為版本3.08.00文件cpu.h中定義(同圖14操作),再次編譯出現2個錯誤,如圖15
圖15stm32h7xx_it.c 中將函數PendSV_Handler屏蔽,如圖16
圖16bsp_timer.c 中將函數SysTick_Handler通過條件編譯#if uCOS_EN == 0來屏蔽,同時在bsp.h定義條件編譯及引入uCOSIII後的開關全局中斷的宏定義,如圖17、圖18
圖17圖18再次編譯,提示的錯誤都是"cpu_sr"沒有定義。這是因為將裸機的開關中斷改為了uCOSIII的開關中斷方式,需要在函數內部加入CPU_SR_ALLOC();定義,如圖19、圖20
圖19圖20修改 bsp.c 中頭文件,函數 bsp_Init 分解為 System_Init 和 bsp_Init 2個函數,加入 bsp_DelayUS 和 bsp_DelayMS 函數(為了讓底層驅動在帶RTOS和裸機情況下有更好的兼容性而專門製作一個阻塞式的延遲函數,在底層驅動中ms毫秒延遲主要用於初始化,並不會影響實時性)。再次編譯出現1個錯誤,如圖21
圖21在cpu_cfg.h中將宏定義 #define CPU_CFG_TS_32_EN 使能,如圖22
圖22再次編譯,出現0錯誤0警告!此時在 main.c 中編寫uCOSIII的測試函數。
App Task Start任務 :啟動任務,這裡用作BSP驅動包處理。
App Task MspPro任務 :消息處理,這裡用作浮點數串口列印。
App Task UserIF任務 :按鍵消息處理。
App Task COM任務 :浮點數串口列印。
再次編譯,出現3錯誤,如圖23
圖23只需要將 os_cfg.h 中宏定義 OS_CFG_DBG_EN 配置為1u即可,再次編譯,0錯誤0警告!下載程序驗證。
5、結果驗證打開串口調試助手,發現已經有浮點運算顯示,按下K1鍵,列印出各任務棧使用情況,如圖24
圖24至此,stm32h7「手把手移植uCOSIII(版本3.08.00)」成功!
6、補充說明6-1、uCOSIII 參數配置為了更好地運行uCOSIII,推薦開啟一些配置
cpu_cfg.h 配置,如代碼1
#if 1 /* Configure CPU interrupts disabled time ... */
#define CPU_CFG_INT_DIS_MEAS_EN /* ... measurements feature (see Note #1a). */
#endif
#if 1 /* Configure CPU count leading zeros bits ...*/
#define CPU_CFG_LEAD_ZEROS_ASM_PRESENT /* ... assembly-version (see Note #1a). */
#endif
#if 1 /* Configure CPU count trailing zeros bits ...*/
#define CPU_CFG_TRAIL_ZEROS_ASM_PRESENT /* ... assembly-version (see Note #1b). */
#endif
代碼1
os_cfg.h 配置,如代碼2
#define OS_CFG_TS_EN 1u /* Enable (1) or Disable (0) time stamping */
#define OS_CFG_SCHED_LOCK_TIME_MEAS_EN 1u /* Include code to measure scheduler lock time */
#define OS_CFG_TASK_STK_REDZONE_EN 1u /* Enable (1) or Disable (0) stack redzone */
代碼2
6-2、uCOSIII 動態時鐘實現移植的 Micrium 例程:【Micrium_STM32H743ZI-Nucleo_Blinky】官方工程 ,不含動態時鐘功能,動態時鐘的實現即是修改文件 bsp_os.c 。這裡尋找包含動態時鐘實現的 Micrium 例程:【Micrium_STM32F767ZI-Nucleo_Blinky】。直接替換文件 bsp_os.c 並稍稍修改(這裡不記錄修改過程,直接對比源碼查看)。
os_cfg.h 配置,如代碼3
#define OS_CFG_DYN_TICK_EN 1u /* Enable (1) or Disable (0) the Dynamic Tick */
#define OS_CFG_SCHED_ROUND_ROBIN_EN 0u /* Include code for Round-Robin scheduling */
代碼3
編譯後下載,動態時鐘實現成功,如圖25
圖25