如何在APM32F407开发板上应用uC/OS-III实时操作系统

描述

来源:转载自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 #include #include #define DEBUG_USART  USART1 /** @addtogroup Examples   @{   */ /** @addtogroup Template   @{   */ /** @defgroup Template_Functions Functions   @{   */ #define STACK_SIZE 128      // Stack size for LED task #define LED_TASK_PRIO 5     // Priority for LED task #define SERIAL_TASK_PRIO 6  // Priority for serial print task OS_TCB ledTaskTCB;         // Task Control Block for LED task OS_TCB serialTaskTCB;      // Task Control Block for serial print task CPU_STK ledTaskStk[STACK_SIZE];    // Stack for LED task CPU_STK serialTaskStk[STACK_SIZE]; // Stack for serial print task OS_FLAG_GRP ledFlagGrp;    // Event flag group for LED task void ledTask(void *p_arg); void serialPrintTask(void *p_arg); /*!  * [url=home.php?mod=space&uid=247401]@brief[/url]       Main program  *  * @param       None  *  * @retval      None  */ int main(void) {         USART_Config_T usartConfig;              /* Configure US  

‍‍‍我们可以简单分析一下这段代码,这段代码实现了两个任务: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

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分