來(lái)源:轉(zhuǎn)載自21ic論壇極海半導(dǎo)體專區(qū)
最近我開始學(xué)習(xí) uC/OS-III 實(shí)時(shí)操作系統(tǒng),并著手將其移植到APM32F407 開發(fā)板上。在這個(gè)過程中,我遇到了許多有趣的挑戰(zhàn)和發(fā)現(xiàn),也感受到了操作系統(tǒng)帶來(lái)的強(qiáng)大功能和靈活性。
在這篇帖子中,我打算分享我的學(xué)習(xí)經(jīng)驗(yàn)和移植過程,包括如何開始學(xué)習(xí)uC/OS-III、配置步驟、移植過程中遇到的問題以及解決方法。我希望通過這篇帖子,能夠幫助那些和我一樣對(duì)操作系統(tǒng)感興趣的朋友們,一起探索如何在APM32F407 上應(yīng)用 uC/OS-III。
1. uC/OS-III簡(jiǎn)介:
uC/OS-III,又稱微型C語(yǔ)言編寫的操作系統(tǒng)第3版,是一個(gè)基于優(yōu)先級(jí)的實(shí)時(shí)內(nèi)核,可升級(jí)和固化。它無(wú)限制地支持任務(wù)個(gè)數(shù),并且作為第三代內(nèi)核,擁有現(xiàn)代實(shí)時(shí)內(nèi)核所需的基本功能,例如資源管理、同步和任務(wù)間通信。值得注意的是,uC/OS-III具有獨(dú)特的功能,如完整的運(yùn)行時(shí)性能測(cè)量、直接向任務(wù)發(fā)送信號(hào)或消息,以及任務(wù)可以同時(shí)等待多個(gè)內(nèi)核對(duì)象。
簡(jiǎn)單來(lái)說(shuō),uC/OS-III是一個(gè)可擴(kuò)展和穩(wěn)固的實(shí)時(shí)內(nèi)核,可以管理無(wú)限數(shù)量的任務(wù)。它滿足現(xiàn)代實(shí)時(shí)內(nèi)核的期望,提供資源管理、同步和任務(wù)間通信等功能。它的獨(dú)特之處在于能夠在運(yùn)行時(shí)測(cè)量性能、直接向任務(wù)發(fā)送信號(hào)或消息,以及任務(wù)可以同時(shí)等待多個(gè)信號(hào)或消息隊(duì)列。
下面是一個(gè)列出了uC/OS-III的功能的簡(jiǎn)單表格:
這些功能使得uC/OS-III成為一個(gè)強(qiáng)大、靈活且功能豐富的實(shí)時(shí)操作系統(tǒng),適用于各種嵌入式系統(tǒng)和實(shí)時(shí)應(yīng)用場(chǎng)景。
2.移植流程
?一、uCOS-III系統(tǒng)文件獲取
我這里提供了兩種下載方式,如下。
1.網(wǎng)盤鏈接下載:https://pan.baidu.com/s/1nHZjj2A40qW_jbbODOXfOw?pwd=762k
2.官方下載:https://github.com/weston-embedded
以下是點(diǎn)擊官方下載的鏈接后,需要下載的源文件。
① uc-os3源碼下載
② uc-lib源碼下載
③ uc-cpu源碼下載 ?
??二、添加ucos-III系統(tǒng)文件
1、去極海官網(wǎng)(https://geehy.com/apm32?id=47)下載APM32F407SDK,打開Examples文件夾,復(fù)制一份Template模板,新建ucos-III文件夾,把下載的源碼文件全部都復(fù)制進(jìn)去。??
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這個(gè)文件的,我們需要手動(dòng)編寫。在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示例程序的配置文件,定義了一些任務(wù)優(yōu)先級(jí)、任務(wù)堆棧大小以及跟蹤/調(diào)試配置相關(guān)的宏。以下是每個(gè)定義的宏的作用:
1. 任務(wù)優(yōu)先級(jí)(`APP_CFG_TASK_START_PRIO`, `APP_CFG_TASK_1_PRIO`, `APP_CFG_TASK_2_PRIO`):
- 定義了不同任務(wù)的優(yōu)先級(jí),用于確定任務(wù)在多任務(wù)系統(tǒng)中的執(zhí)行順序。數(shù)字越小,優(yōu)先級(jí)越高。?
?2. 任務(wù)堆棧大小(`APP_CFG_TASK_START_STK_SIZE`, `APP_CFG_TASK_BLINKY_STK_SIZE`,`APP_CFG_TASK_1_STK_SIZE`, `APP_CFG_TASK_2_STK_SIZE`):
- 定義了不同任務(wù)所使用的堆棧大小。堆棧大小越大,任務(wù)能夠使用的局部變量和函數(shù)調(diào)用深度就越大。
3. 跟蹤/調(diào)試配置:
- `TRACE_LEVEL_OFF`、`TRACE_LEVEL_INFO` 和`TRACE_LEVEL_DBG` 定義了跟蹤信息的級(jí)別。在這里,`TRACE_LEVEL_OFF` 表示關(guān)閉跟蹤,`TRACE_LEVEL_INFO` 表示僅輸出信息級(jí)別的跟蹤,`TRACE_LEVEL_DBG`表示輸出調(diào)試級(jí)別的跟蹤。
-`APP_CFG_TRACE_LEVEL` 和 `BSP_CFG_TRACE_LEVEL` 分別定義了應(yīng)用程序和 BSP (Board Support Package) 的跟蹤級(jí)別。
- `APP_CFG_TRACE` 和 `BSP_CFG_TRACE` 是跟蹤輸出函數(shù)的宏定義。在這里,它們被定義為`printf`,表示將跟蹤信息輸出到標(biāo)準(zhǔn)輸出設(shè)備(通常是串口)。?
?4. 跟蹤輸出宏 (`APP_TRACE_INFO`,`APP_TRACE_DBG`, `BSP_TRACE_INFO`, `BSP_TRACE_DBG`):
- 這些宏用于根據(jù)跟蹤級(jí)別輸出相應(yīng)級(jí)別的跟蹤信息。當(dāng)跟蹤級(jí)別高于宏定義的級(jí)別時(shí),才會(huì)輸出相應(yīng)級(jí)別的跟蹤信息,否則會(huì)被忽略。
2、編寫main函數(shù)。
我已經(jīng)編寫了一個(gè)使用ucos-iii的簡(jiǎn)單的示例代碼,代碼如下。
/*!
* [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
???我們可以簡(jiǎn)單分析一下這段代碼,這段代碼實(shí)現(xiàn)了兩個(gè)任務(wù):LED任務(wù) (`ledTask`) 和串行打印任務(wù)(`serialPrintTask`)。以下是代碼的主要功能和實(shí)現(xiàn)細(xì)節(jié):
1. 任務(wù)優(yōu)先級(jí)和堆棧大小定義:
- 定義了LED任務(wù)和串行打印任務(wù)的優(yōu)先級(jí) (`LED_TASK_PRIO` 和`SERIAL_TASK_PRIO`),以及任務(wù)堆棧大小 (`STACK_SIZE`)。
- 定義了LED任務(wù)和串行打印任務(wù)的任務(wù)控制塊 (TCB) 和堆棧數(shù)組。
2. uC/OS-III初始化:
- 使用`OSInit()` 函數(shù)初始化uC/OS-III。
3. 串口和LED初始化:
- 配置了USART1作為調(diào)試串口,并初始化LED2和LED3。
4. 任務(wù)創(chuàng)建:
- 使用`OSTaskCreate()` 函數(shù)創(chuàng)建LED任務(wù)和串行打印任務(wù)。
- `ledTask` 函數(shù)用于定期切換LED狀態(tài),并通過設(shè)置事件標(biāo)志組通知串行打印任務(wù)。
- `serialPrintTask`函數(shù)等待事件標(biāo)志組的設(shè)置,然后通過串口打印消息。
5. 事件標(biāo)志組創(chuàng)建:
- 使用`OSFlagCreate()` 函數(shù)創(chuàng)建了一個(gè)名為 "LED Flags" 的事件標(biāo)志組 (`ledFlagGrp`)。
6. 多任務(wù)啟動(dòng):
- 使用`OSStart()` 函數(shù)啟動(dòng)uC/OS-III多任務(wù)調(diào)度。
7. 主循環(huán):
- 在`main` 函數(shù)的無(wú)限循環(huán)中,沒有具體的操作,只是用來(lái)保持程序運(yùn)行。
8. LED控制和定時(shí)延遲:
- `ledTask` 定期切換LED2和LED3的狀態(tài),然后通過設(shè)置事件標(biāo)志組通知串行打印任務(wù)。
- `serialPrintTask`等待事件標(biāo)志組的設(shè)置,并在收到通知后通過USART串口打印消息。
9. 系統(tǒng)時(shí)鐘設(shè)置:
- 使用`SysTick_Config()` 函數(shù)配置系統(tǒng)時(shí)鐘,用于提供定時(shí)功能。
總體來(lái)說(shuō),這份代碼展示了如何使用uC/OS-III創(chuàng)建并管理多個(gè)任務(wù),通過事件標(biāo)志組實(shí)現(xiàn)任務(wù)之間的同步,以及使用USART進(jìn)行串行通信。
四、編譯與下載
初次編譯時(shí)會(huì)報(bào)錯(cuò),原因是ucos-iii系統(tǒng)文件中已經(jīng)實(shí)現(xiàn)了這兩個(gè)中斷服務(wù)函數(shù)。
注釋apm32f4xx_int.c中這兩個(gè)中斷服務(wù)函數(shù)的實(shí)現(xiàn),再次編譯。
編譯無(wú)誤,下載代碼。
可以看到LED每隔0.5s翻轉(zhuǎn)一次,當(dāng) LED的狀態(tài)變化時(shí),串口都會(huì)打印一串信息。(這里L(fēng)ED翻轉(zhuǎn)的現(xiàn)象就不上傳了)
注:文章作者在原帖中提供了例程文件,有需要請(qǐng)至原文21ic論壇下載
原文地址:https://bbs.21ic.com/icview-3364670-1-1.html
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1403瀏覽量
40954 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7025瀏覽量
124707 -
移植
+關(guān)注
關(guān)注
1文章
392瀏覽量
28510 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5389瀏覽量
100901
原文標(biāo)題:APM32芯得 EP.50 | APM32F4 移植ucos-iii
文章出處:【微信號(hào):geehysemi,微信公眾號(hào):Geehy極海半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
國(guó)產(chǎn)優(yōu)秀替代_APM32F407替代STM32F407記錄

APM32F407工具鏈?zhǔn)褂媒坛?/a>

深入剖析uC/OS-III和FreeRTOS的區(qū)別
分析一下uC/OS-III和FreeRTOS的區(qū)別
哪里可以買到《嵌入式實(shí)時(shí)操作系統(tǒng)uc/os-III應(yīng)用開發(fā)》這本書?
有沒有哪位大神將UC/OS-III 3.06.00移植到STM32F407上的?
uC/OS-III和FreeRTOS有什么區(qū)別
uC/OS-III和FreeRTOS的區(qū)別是什么?
uC/OS-III學(xué)習(xí)筆記
嵌入式實(shí)時(shí)操作系統(tǒng)uC/OS-II原理及應(yīng)用
uC/OS-III介紹
uC/OS-III的特點(diǎn)
uCOS-III嵌入式實(shí)時(shí)操作系統(tǒng)中文版教程免費(fèi)下載

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

評(píng)論