stm32h7「手把手移植uCOSIII(版本3.08.00)」

2021-02-23 芯跳電子
1、準備工作

移植準備工作需要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

圖12

cpu_cfg.h 中將使能可編程中斷優先級配置,再次編譯出現7個錯誤,如圖13

圖13

bsp_int_armv7m.c 中將CPU_REG_NVIC_VTOR 改為 CPU_REG_SCB_VTOR (因為版本3.08.00文件cpu.h中定義的變化),再次編譯出現6個錯誤,如圖14

圖14

bsp_os.c 中將原版本中的宏定義修改為版本3.08.00文件cpu.h中定義(同圖14操作),再次編譯出現2個錯誤,如圖15

圖15

stm32h7xx_it.c 中將函數PendSV_Handler屏蔽,如圖16

圖16

bsp_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

相關焦點

  • 詳細操作 | UCOSIII移植到STM32F407
    移植分三步走:1、下載移植文件2、添加文件到自己工程文件夾3、加載文件工程中,並修改相關文件1、下載移植文件找到與STM32F407接近的晶片(通過查找STM32F429II-SK符合STM32F407,官網沒有直接移植好STM32F407,若有就好了,就根本不用移植了)STM32F429II-SK,並將它下載下來,下來需要註冊才能下載,這裡我就直接下來了,文件位置:官方 uCOS-III 源碼。
  • Micrium發布利用uCOS-III+uC/TCP-IP連接ARM mbed雲端的教程,手頭有STM32F7探索板的可測試
    粗略看了一下,教程比較詳細,基本是手把手了。2.  教程地址:https://doc.micrium.com/display/MBED/Hands-on+Workshop+Manual 3.  用於ST官方的STM32F7探索版例子:https://www.micrium.com/download/stm32f7-discovery-smart-thermostat-mbed-project/ ========================對於這個工程,簡單的說就是在uCOS-III+uC/TCP-IP的基礎上移植mbed
  • 全教程:TencentOS tiny 移植到 STM32F103(基於標準庫) | CSDN 博文精選
    傑傑將在下文講解如何將 TencentOS tiny 移植到工程中去,以及如何把 TencentOS tiny 源碼中的核心部分單獨提取出來,方便以後在不同的平臺上移植。目前使用的是 TencentOS tiny 最新版本,由於 TencentOS tiny 在不斷更新,如果以後 TencentOS tiny 更新到更高的版本,則以最新的版本為準。
  • stm32h7「資源尋找介紹」
    圖2通過搜索【STM32CubeH7】下載到stm32h7的軟體包,如圖3【編程手冊】(Programming Manuals):它完整地描述了STM32F7系列和STM32H7系列Cortex®-M7處理器編程模型,指令集和核心外設。【勘誤手冊】(Errata Sheets):描述了晶片某些功能的局限性,並給出解決辦法。這個手冊也比較重要,有時候我們覺得有些地方調試老是出問題,就需要查找一下,看看是否是硬體 bug。
  • 基於RT-Thread在STM32H7上移植LWIP(一)
    二、RT-Thread、STM32H7、LWIP簡介RT-Thread是一個來自中國的開源物聯網作業系統,它提供了非常強的可伸縮能力:從一個可以運行在ARM Cortex-M0晶片上的極小內核,到中等的ARM Cortex-M3/4/7系統,甚至是運行於MIPS32、ARM Cortex-A系列處理器上功能豐富系統。
  • stm32h7「I2C協議驅動BH1730FVC光照強度晶片」
    關於I2C協議不再詳述,見之前的總結stm32h7「I2C協議驅動DS3231晶片」,下面直入主題,總結我在開發晶片BH1730FVC的驅動心得體會
  • 【DIY數字儀表】STM32F429移植TouchGFX到RT-Thread系統(1)
    3.下載 STM32CubeMX v5.6.1安裝完STM32CubeMX v5.6.1版本後,還需要安裝X_CUBE_TOUCHGFX軟體包,安裝路徑如下:4.下載,所以可以選擇stm32f29-fire-challenger的BSP,在此BSP的基礎上移植touchgfx,首先找到如下目錄:…\rt-thread\bsp\stm32\stm32f429-fire-challenger。
  • STM32平臺RT-Thread最小系統移植搭建 - STM32F107VCT6
    板子分:STM32F103幾個系列,STM32F107,STM32F429等。板子是沒有生命的,只有給了它軟體,供上電源,才能讓它們發揮作用。很多工程師,連最基礎的引腳配置都沒搞明白,就開始了RTOS的使用。 最小系統移植最小系統的作用:萬事開頭難,入門後,方可自由發揮。
  • STM32F407 DP83848驅動調試過程總結(標準庫到HAL庫移植避坑指南)
    初始化的HAL庫項目要從之前的STM32F107平臺移植到STM32F407平臺,我的任務主要是底層的移植,讓程序在新的平臺可以正常運行,主要包含的功能有IIC EEPROM LED ETH LWIP UART這幾個的初始化和實現。
  • STM32F7開發板自己造
    我去年就想自己造個144腳STM32F7+SDRAM的板子了,針對音頻處理算法開發。
  • STM32H7 乙太網的 MMC 中斷
    STM32H7 乙太網的 MMC(MAC management counter)中斷是個有點特別的中斷。特殊之處在於它是默認使能。
  • STM32F7 Discovery評測
    打開STM32F7 Discovery這個開發套件,讓我感到吃驚的是這個套件的大氣。最明顯的是那個4.3寸的大屏幕,帶有電容觸控螢幕。現在在周圍四角加有塑料管腳。這樣可以保護板子離開桌面,也可以看出做工的精細之處。另外屏也固定的很好,一改以往STM32F4 Discovery 有一款開發板屏幕不固定的毛病。
  • 關於STM32Cube的幾個常見問題
    相比標準外設庫,STM32Cube HAL庫表現出更高的抽象整合水平,HAL API集中關注各外設的公共函數功能,這樣便於定義一套通用的用戶友好的API函數接口,從而可以輕鬆實現從一個STM32產品移植到另一個不同的STM32系列產品。當然,現有的標準外設庫仍會得到支持,不過,不建議利用它著手新的設計開發了。
  • STM32CubeMx入門教程(1)-點亮LED
    STM32CubeMx的使用條件1.硬體條件:(1)野火STM32F103開發板-指南者(2)原理圖原理圖可以參考官網,在stm32CubeMx入門教程的使用中會將用到的部分原理圖以圖片的形式貼出。軟體(1)STM32CubeMX 從STM公司官網下載,下載地址:https://www.st.com/zh/development-tools/stm32cubemx.html#tools-software
  • STM32CubeMX-系列教程入門
    平臺包括了STM32Cube 硬體抽象層(一個STM32抽象層嵌入式軟體,確保在STM32系列最大化的便攜性)和一套的中間件組件(RTOS, USB, FatFs, TCP/IP,  Graphics, 等等)。    對於新的產品設計,我們強烈推薦使用STM32Cube來加速你的開發過程,並為以後的產品平臺移植打下良好的基礎。
  • STM32CubeMX升級至V5.2.0,STM32G4即將推出,STM32CubeIDE正式面世
    官網網址:www.st.com/stm32cubemx百度網盤下載:STM32CubeMX2.新增G0部分型號和軟體包升級G0之前推出了128k(G07、G08)型號MCU,這次新增64K(G03、G04)型號MCU。
  • STM32CubeMX重大升級
    一些關於STM32CubeMX升級、ST官網的細節問題,不知道大家平時注意了沒有?相信經常使用STM32CubeMX工具的朋友,都知道升級到V5.0.0版本的新聞。其實,經常使用STM32CubeMX工具的朋友可能會關注它版本的更新。
  • lvgl最新版本在STM32上的移植使用
    STM32 1、下載源碼源碼連結中下載一份源碼,lvgl已經更新迭代了很多個版本,這裡我們選擇目前最新的7.10.1版本來移植:注意:不同版本之間可能有很大的不同,所以看本篇教程移植的的小夥伴儘量使用與本文相同的版本。
  • STM32CubeMX-實時時鐘(RTC)
    點擊STM32F746I.ioc打開STM32cubeMX的工程文件重新配置。RTC選擇內部喚醒(Internal WakeUp)開啟RTC。開啟外部低速晶振,PC14,PC15配置。RTC時鐘選擇為外部低速晶振(LSE),頻率為32.768。在RTC配置中,設置時間和日期,其他為默認設置。此處設置時間為2016/04/16 16:25:49。在rtc.c文件中可以看到ADC初始化函數。
  • STM32f103單片機(三)——串口
    這裡要注意的是USART1應用的是APB2時鐘,USART2、USART3、UART4、UART5應用的是APB1時鐘。繼續看給我們的庫函數,這一個涉及到的庫函數是與串口相關的庫函數stm32f10x_usart.c