來源:轉載自21ic論壇極海半導體專區
最近我開始學習 uC/OS-III 實時操作系統,并著手將其移植到APM32F407 開發板上。在這個過程中,我遇到了許多有趣的挑戰和發現,也感受到了操作系統帶來的強大功能和靈活性。
在這篇帖子中,我打算分享我的學習經驗和移植過程,包括如何開始學習uC/OS-III、配置步驟、移植過程中遇到的問題以及解決方法。我希望通過這篇帖子,能夠幫助那些和我一樣對操作系統感興趣的朋友們,一起探索如何在APM32F407 上應用 uC/OS-III。
1. uC/OS-III簡介:
uC/OS-III,又稱微型C語言編寫的操作系統第3版,是一個基于優先級的實時內核,可升級和固化。它無限制地支持任務個數,并且作為第三代內核,擁有現代實時內核所需的基本功能,例如資源管理、同步和任務間通信。值得注意的是,uC/OS-III具有獨特的功能,如完整的運行時性能測量、直接向任務發送信號或消息,以及任務可以同時等待多個內核對象。
簡單來說,uC/OS-III是一個可擴展和穩固的實時內核,可以管理無限數量的任務。它滿足現代實時內核的期望,提供資源管理、同步和任務間通信等功能。它的獨特之處在于能夠在運行時測量性能、直接向任務發送信號或消息,以及任務可以同時等待多個信號或消息隊列。
下面是一個列出了uC/OS-III的功能的簡單表格:
這些功能使得uC/OS-III成為一個強大、靈活且功能豐富的實時操作系統,適用于各種嵌入式系統和實時應用場景。
2.移植流程
?一、uCOS-III系統文件獲取
我這里提供了兩種下載方式,如下。
1.網盤鏈接下載:https://pan.baidu.com/s/1nHZjj2A40qW_jbbODOXfOw?pwd=762k
2.官方下載:https://github.com/weston-embedded
以下是點擊官方下載的鏈接后,需要下載的源文件。
① uc-os3源碼下載
② uc-lib源碼下載
③ uc-cpu源碼下載 ?
??二、添加ucos-III系統文件
1、去極海官網(https://geehy.com/apm32?id=47)下載APM32F407SDK,打開Examples文件夾,復制一份Template模板,新建ucos-III文件夾,把下載的源碼文件全部都復制進去。??
2、打開mdk工程,新建一些文件目錄。
?3、向ucos_cpu中添加文件
打開uCOSIIIuC-CPU文件目錄,添加cpu_core.c文件。?
打開uCOSIIIuC-CPUARM-Cortex-MARMv7-M文件目錄,添加cpu_c.c。
打開uCOSIIIuC-CPUARM-Cortex-MARMv7-MARM文件目錄,添加cpu_a.asm。
?4、向ucos_lib中添加文件。
打開uCOSIIIuC-LIB文件目錄,添加該文件目錄下的所有.c文件。?
?5、向ucos_source中添加文件。
打開uCOSIIIuC-OS3Source文件目錄,添加除了__dbg_uCOS-III.c文件的其余所有文件。?
?6、向ucos_port中添加文件。
打開uCOSIIIuC-OS3PortsARM-Cortex-MARMv7-MARM文件目錄,添加該目錄下所有文件。?
打開uCOSIIIuC-OS3PortsARM-Cortex-MARMv7-M文件目錄,添加os_cpu_c.c。
7、向ucos_misc中添加文件。
打開uCOSIIIuC-CPUBSPTemplate文件目錄,添加bsp_cpu.c。?
8、添加頭文件。
三、編寫代碼
?1、編寫app_cfg.h文件。
ucos-III是沒有提供app_cfg.h這個文件的,我們需要手動編寫。在uCOSIII下新建app_cfg.h,添加如下代碼。 ?
/* ********************************************************************************************************* * EXAMPLE CODE * * This file is provided as an example on how to use Micrium products. * * Please feel free to use any application code labeled as 'EXAMPLE CODE' in * your application products. Example code may be used as is, in whole or in * part, or may be used as a reference only. This file can be modified as * required to meet the end-product requirements. * * Please help us continue to provide the Embedded community with the finest * software available. Your honesty is greatly appreciated. * * You can find our product's user manual, API reference, release notes and * more information at https://doc.micrium.com. * You can contact us at www.micrium.com. ********************************************************************************************************* */ #ifndef APP_CFG_MODULE_PRESENT #define APP_CFG_MODULE_PRESENT /* ********************************************************************************************************* * MODULE ENABLE / DISABLE ********************************************************************************************************* */ /* ********************************************************************************************************* * TASK PRIORITIES ********************************************************************************************************* */ #define APP_CFG_TASK_START_PRIO 2u #define APP_CFG_TASK_1_PRIO 3u #define APP_CFG_TASK_2_PRIO 4u /* ********************************************************************************************************* * TASK STACK SIZES ********************************************************************************************************* */ #define APP_CFG_TASK_START_STK_SIZE 128u #define APP_CFG_TASK_BLINKY_STK_SIZE 128u #define APP_CFG_TASK_1_STK_SIZE 512u #define APP_CFG_TASK_2_STK_SIZE 512u /* ********************************************************************************************************* * TRACE / DEBUG CONFIGURATION ********************************************************************************************************* */ #ifndef TRACE_LEVEL_OFF #define TRACE_LEVEL_OFF 0 #endif #ifndef TRACE_LEVEL_INFO #define TRACE_LEVEL_INFO 1 #endif #ifndef TRACE_LEVEL_DBG #define TRACE_LEVEL_DBG 2 #endif #define APP_CFG_TRACE_LEVEL TRACE_LEVEL_OFF #define APP_CFG_TRACE printf #define BSP_CFG_TRACE_LEVEL TRACE_LEVEL_OFF #define BSP_CFG_TRACE printf #define APP_TRACE_INFO(x) ((APP_CFG_TRACE_LEVEL >= TRACE_LEVEL_INFO) ? (void)(APP_CFG_TRACE x) : (void)0) #define APP_TRACE_DBG(x) ((APP_CFG_TRACE_LEVEL >= TRACE_LEVEL_DBG) ? (void)(APP_CFG_TRACE x) : (void)0) #define BSP_TRACE_INFO(x) ((BSP_CFG_TRACE_LEVEL >= TRACE_LEVEL_INFO) ? (void)(BSP_CFG_TRACE x) : (void)0) #define BSP_TRACE_DBG(x) ((BSP_CFG_TRACE_LEVEL >= TRACE_LEVEL_DBG) ? (void)(BSP_CFG_TRACE x) : (void)0) #endif
?這段代碼是uC/OS-III示例程序的配置文件,定義了一些任務優先級、任務堆棧大小以及跟蹤/調試配置相關的宏。以下是每個定義的宏的作用:
1. 任務優先級(`APP_CFG_TASK_START_PRIO`, `APP_CFG_TASK_1_PRIO`, `APP_CFG_TASK_2_PRIO`):
- 定義了不同任務的優先級,用于確定任務在多任務系統中的執行順序。數字越小,優先級越高。?
?2. 任務堆棧大小(`APP_CFG_TASK_START_STK_SIZE`, `APP_CFG_TASK_BLINKY_STK_SIZE`,`APP_CFG_TASK_1_STK_SIZE`, `APP_CFG_TASK_2_STK_SIZE`):
- 定義了不同任務所使用的堆棧大小。堆棧大小越大,任務能夠使用的局部變量和函數調用深度就越大。
3. 跟蹤/調試配置:
- `TRACE_LEVEL_OFF`、`TRACE_LEVEL_INFO` 和`TRACE_LEVEL_DBG` 定義了跟蹤信息的級別。在這里,`TRACE_LEVEL_OFF` 表示關閉跟蹤,`TRACE_LEVEL_INFO` 表示僅輸出信息級別的跟蹤,`TRACE_LEVEL_DBG`表示輸出調試級別的跟蹤。
-`APP_CFG_TRACE_LEVEL` 和 `BSP_CFG_TRACE_LEVEL` 分別定義了應用程序和 BSP (Board Support Package) 的跟蹤級別。
- `APP_CFG_TRACE` 和 `BSP_CFG_TRACE` 是跟蹤輸出函數的宏定義。在這里,它們被定義為`printf`,表示將跟蹤信息輸出到標準輸出設備(通常是串口)。?
?4. 跟蹤輸出宏 (`APP_TRACE_INFO`,`APP_TRACE_DBG`, `BSP_TRACE_INFO`, `BSP_TRACE_DBG`):
- 這些宏用于根據跟蹤級別輸出相應級別的跟蹤信息。當跟蹤級別高于宏定義的級別時,才會輸出相應級別的跟蹤信息,否則會被忽略。
2、編寫main函數。
我已經編寫了一個使用ucos-iii的簡單的示例代碼,代碼如下。
/*!
* [url=home.php?mod=space&uid=288409]@file[/url] main.c * * [url=home.php?mod=space&uid=247401]@brief[/url] Main program body * * [url=home.php?mod=space&uid=895143]@version[/url] V1.0.3 * * [url=home.php?mod=space&uid=212281]@date[/url] 2023-07-31 * * @attention * * Copyright (C) 2021-2023 Geehy Semiconductor * * You may not use this file except in compliance with the * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). * * The program is only for reference, which is distributed in the hope * that it will be useful and instructional for customers to develop * their software. Unless required by applicable law or agreed to in * writing, the program is distributed on an "AS IS" BASIS, WITHOUT * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions * and limitations under the License. */ /* Includes */ #include "main.h" #include "Board.h" #include
???我們可以簡單分析一下這段代碼,這段代碼實現了兩個任務:LED任務 (`ledTask`) 和串行打印任務(`serialPrintTask`)。以下是代碼的主要功能和實現細節:
1. 任務優先級和堆棧大小定義:
- 定義了LED任務和串行打印任務的優先級 (`LED_TASK_PRIO` 和`SERIAL_TASK_PRIO`),以及任務堆棧大小 (`STACK_SIZE`)。
- 定義了LED任務和串行打印任務的任務控制塊 (TCB) 和堆棧數組。
2. uC/OS-III初始化:
- 使用`OSInit()` 函數初始化uC/OS-III。
3. 串口和LED初始化:
- 配置了USART1作為調試串口,并初始化LED2和LED3。
4. 任務創建:
- 使用`OSTaskCreate()` 函數創建LED任務和串行打印任務。
- `ledTask` 函數用于定期切換LED狀態,并通過設置事件標志組通知串行打印任務。
- `serialPrintTask`函數等待事件標志組的設置,然后通過串口打印消息。
5. 事件標志組創建:
- 使用`OSFlagCreate()` 函數創建了一個名為 "LED Flags" 的事件標志組 (`ledFlagGrp`)。
6. 多任務啟動:
- 使用`OSStart()` 函數啟動uC/OS-III多任務調度。
7. 主循環:
- 在`main` 函數的無限循環中,沒有具體的操作,只是用來保持程序運行。
8. LED控制和定時延遲:
- `ledTask` 定期切換LED2和LED3的狀態,然后通過設置事件標志組通知串行打印任務。
- `serialPrintTask`等待事件標志組的設置,并在收到通知后通過USART串口打印消息。
9. 系統時鐘設置:
- 使用`SysTick_Config()` 函數配置系統時鐘,用于提供定時功能。
總體來說,這份代碼展示了如何使用uC/OS-III創建并管理多個任務,通過事件標志組實現任務之間的同步,以及使用USART進行串行通信。
四、編譯與下載
初次編譯時會報錯,原因是ucos-iii系統文件中已經實現了這兩個中斷服務函數。
注釋apm32f4xx_int.c中這兩個中斷服務函數的實現,再次編譯。
編譯無誤,下載代碼。
可以看到LED每隔0.5s翻轉一次,當 LED的狀態變化時,串口都會打印一串信息。(這里LED翻轉的現象就不上傳了)
注:文章作者在原帖中提供了例程文件,有需要請至原文21ic論壇下載
原文地址:https://bbs.21ic.com/icview-3364670-1-1.html
-
內核
+關注
關注
3文章
1400瀏覽量
40740 -
操作系統
+關注
關注
37文章
6977瀏覽量
124403 -
移植
+關注
關注
1文章
391瀏覽量
28403 -
開發板
+關注
關注
25文章
5273瀏覽量
99865
原文標題:APM32芯得 EP.50 | APM32F4 移植ucos-iii
文章出處:【微信號:geehysemi,微信公眾號:Geehy極海半導體】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
國產優秀替代_APM32F407替代STM32F407記錄

分析一下uC/OS-III和FreeRTOS的區別
哪里可以買到《嵌入式實時操作系統uc/os-III應用開發》這本書?
有沒有哪位大神將UC/OS-III 3.06.00移植到STM32F407上的?
uC/OS-III和FreeRTOS有什么區別
uC/OS-III和FreeRTOS的區別是什么?
嵌入式實時操作系統uC/OS-II原理及應用
uC/OS-III介紹
uCOS-III嵌入式實時操作系統中文版教程免費下載

uC/OS-III移植----第一節(基于野火STM32F407ZGT6開發板 2021/11/1)

評論