APM32芯得EP.50|APM32F4移植ucos-iii

极海Geehy 2025-03-28 17:06


《APM32芯得》系列内容为用户使用APM32系列产品的经验总结,均转载自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中添加文件

打开uCOSIII\uC-CPU文件目录,添加cpu_core.c文件。

打开uCOSIII\uC-CPU\ARM-Cortex-M\ARMv7-M文件目录,添加cpu_c.c。

打开uCOSIII\uC-CPU\ARM-Cortex-M\ARMv7-M\ARM文件目录,添加cpu_a.asm。


4、向ucos_lib中添加文件。

打开uCOSIII\uC-LIB文件目录,添加该文件目录下的所有.c文件。

5、向ucos_source中添加文件。

打开uCOSIII\uC-OS3\Source文件目录,添加除了__dbg_uCOS-III.c文件的其余所有文件。

6、向ucos_port中添加文件。

打开uCOSIII\uC-OS3\Ports\ARM-Cortex-M\ARMv7-M\ARM文件目录,添加该目录下所有文件。

打开uCOSIII\uC-OS3\Ports\ARM-Cortex-M\ARMv7-M文件目录,添加os_cpu_c.c。


7、向ucos_misc中添加文件。

打开uCOSIII\uC-CPU\BSP\Template文件目录,添加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

或点击下方 阅读原文 跳转


↑↑↑ 点击上方卡片关注极海 ↑↑↑

极海Geehy 极海半导体是一家致力于开发工业级/车规级MCU、模拟与混合信号IC及系统级芯片的集成电路设计型企业
评论 (0)
  • 在工业控制与数据采集领域,高精度的AD采集和实时显示至关重要。今天,我们就来基于瑞芯微RK3568J + FPGA国产平台深入探讨以下,它是如何实现该功能的。适用开发环境如下:Windows开发环境:Windows 7 64bit、Windows 10 64bitLinux开发环境:Ubuntu18.04.4 64bit、VMware15.5.5U-Boot:U-Boot-2017.09Kernel:Linux-4.19.232、Linux-RT-4.19.232LinuxSDK:LinuxSD
    Tronlong 2025-03-28 10:14 154浏览
  • 在智能语音设备开发中,高音量输出是许多场景的核心需求,例如安防警报、工业设备提示、户外广播等。 WT588F02BP-14S 和 WTN6040FP-14S 两款语音芯片,凭借其内置的 D类功放 和 3W大功率输出 能力,成为高音量场景的理想选择。本文将从 性能参数、应用场景、设计要点 三大维度,全面解析这两款芯片的选型策略。一、核心参数对比与选型决策参数WT588F02BP-14SWTN6040FP-14S输出功率3W@4Ω(THD<1%)3W@4Ω(THD<0.8%)功
    广州唯创电子 2025-03-28 09:15 105浏览
  • 本文介绍瑞芯微RK356X系列复用接口配置的方法,基于触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。复用接口介绍由下图可知,红圈内容当前引脚可配置为SPI0或者PWM0功能。由标准系统固件以及相关系统手册可得,当前接口默认配置为SPI0功能:console:/ # ls dev/spidev0.0dev/spidev0.0再由原理图可知当前GPIO为GPIO0_C3
    Industio_触觉智能 2025-03-28 18:14 113浏览
  • 一、真空容器的定义与工作原理真空容器是一种能够创造并保持一定真空度的密闭容器。其工作原理通常涉及抽气系统,该系统能够逐渐抽出容器内部的气体分子,从而降低容器内的气压,形成真空环境。在这个过程中,容器的体积并不会因抽气而改变,但容器内的压力会随着气体的抽出而逐渐降低。二、真空容器并非恒压系统真空容器并非一个恒压系统。恒压系统指的是在外部环境变化时,系统内部压力能够保持相对稳定。然而,在真空容器中,随着气体的不断抽出,内部压力会持续降低,直至达到所需的真空度。因此,真空容器内部的压力是变化的,而非恒
    锦正茂科技 2025-03-29 10:23 123浏览
  • 在智能家居领域,无线门铃正朝着高集成度、低功耗、强抗干扰的方向发展。 WTN6040F 和 WT588F02B 两款语音芯片,凭借其 内置EV1527编解码协议 和 免MCU设计 的独特优势,为无线门铃开发提供了革命性解决方案。本文将深入解析这两款芯片的技术特性、应用场景及落地价值。一、无线门铃市场痛点与芯片方案优势1.1 行业核心痛点系统复杂:传统方案需MCU+射频模块+语音芯片组合,BOM成本高功耗瓶颈:待机电流
    广州唯创电子 2025-03-31 09:06 58浏览
  • 3月27日,长虹中玖闪光超高剂量率电子射线放射治疗系统(e-Flash)临床试验项目在四川大学华西医院正式启动,标志着该项目正式进入临床试验阶段。这不仅是我国医学技术领域的一项重大突破,更是我国在高端医疗设备研发和应用方面的重要里程碑。e-Flash放射治疗系统适用于哪些病症,治疗周期为多久?会不会产生副作用?治疗费用高不高……随着超高剂量率电子射线放射治疗系统(e-Flash)正式进入临床试验阶段,社会各界对该项目的实施情况尤为关注。对此,中国工程院院士范国滨,以及四川大学华西医院、四川省肿瘤
    华尔街科技眼 2025-03-28 20:26 249浏览
  • 文/杜杰编辑/cc孙聪颖‍3月11日,美国总统特朗普,将自费8万美元购买的特斯拉Model S,开进了白宫。特朗普此举,绝非偶然随性,而是有着鲜明的主观意图,处处彰显出一种刻意托举的姿态 。特朗普也毫不讳言,希望他的购买能推动特斯拉的发展。作为全球电动车鼻祖,特斯拉曾凭借创新理念与先进技术,开辟电动汽车新时代,引领行业发展潮流。然而当下,这家行业先驱正深陷困境,面临着前所未有的挑战。就连“钢铁侠”马斯克自己都在采访时表示“非常困难”,的确是需要美国总统伸手拉一把了。马斯克踏入白宫的那一刻,特斯拉
    华尔街科技眼 2025-03-28 20:44 169浏览
  • 在智能语音交互设备开发中,系统响应速度直接影响用户体验。WT588F系列语音芯片凭借其灵活的架构设计,在响应效率方面表现出色。本文将深入解析该芯片从接收指令到音频输出的全过程,并揭示不同工作模式下的时间性能差异。一、核心处理流程与时序分解1.1 典型指令执行路径指令接收 → 协议解析 → 存储寻址 → 数据读取 → 数模转换 → 音频输出1.2 关键阶段时间分布(典型值)处理阶段PWM模式耗时DAC模式耗时外挂Flash模式耗时指令解析2-3ms2-3ms3-5ms存储寻址1ms1ms5-10m
    广州唯创电子 2025-03-31 09:26 91浏览
  • 真空容器的材料选择取决于其应用场景(如科研、工业、医疗)、真空等级(低真空、高真空、超高真空)以及环境条件(温度、压力、化学腐蚀等)。以下是常见材料及其优缺点分析:1. 不锈钢(如304、316L)优点:耐腐蚀性强:316L含钼,耐酸碱和高温氧化,适合高真空和腐蚀性环境。高强度:机械性能稳定,可承受高压差和外部冲击。低放气率:经电解抛光或镀镍处理后,表面放气率极低,适合超高真空系统(如粒子加速器、半导体镀膜设备)。易加工:可焊接、铸造,适合复杂结构设计。缺点:重量大:大型容器运输和安装成本高。磁
    锦正茂科技 2025-03-29 10:52 44浏览
  •        随着智能驾驶向L3级及以上迈进,系统对实时性的要求已逼近极限。例如,自动紧急制动(AEB)需在50毫秒内完成感知、决策到执行的全链路响应,多传感器数据同步误差需小于10微秒。然而,传统基于Linux-RT的方案在混合任务处理中存在天然缺陷——其最大中断延迟高达200微秒,且多任务并发时易引发优先级反转问题。据《2024年智能汽车电子架构白皮书》统计,超60%的车企因实时性不足被迫推迟舱驾一体化项目落地。为旌电子给出的破局之道,是采用R5F(实
    中科领创 2025-03-29 11:55 193浏览
  • Shinco音响拆解 一年一次的面包板社区的拆解活动拉开帷幕了。板友们开始大显身手了,拆解各种闲置的宝贝。把各自的设计原理和拆解的感悟一一向电子爱好者展示。产品使用了什么方案,用了什么芯片,能否有更优的方案等等。不仅让拆解的人员了解和深入探索在其中。还可以让网友们学习电子方面的相关知识。今天我也向各位拆解一个产品--- Shinco音响(如下图)。 当产品连接上电脑的耳机孔和USB孔时,它会发出“开机,音频输入模式”的语音播报,。告诉用户它已经进入音响外放模式。3.5mm耳机扣接收电脑音频信号。
    zhusx123 2025-03-30 15:42 69浏览
  • 语音芯片在播放音频时出现电流声是嵌入式音频系统开发中的常见问题,直接影响用户体验。唯创电子WT系列语音芯片在智能家居、工业控制等领域广泛应用,本文将从PWM直推输出与DAC+功放输出两类典型电路架构出发,系统化分析电流声成因并提供工程级解决方案。一、PWM直推输出电路电流声诊断1.1 现象特征高频"滋滋"声(8kHz-20kHz)声音随系统负载变化波动静音状态下仍存在底噪1.2 核心成因分析(1) 电源干扰开关电源纹波超标:实测案例显示,当12V转3.3V的DC-DC电源纹波>80mVpp时,P
    广州唯创电子 2025-03-28 08:47 99浏览
  • 本文介绍OpenHarmony5.0 DevEco Studio开发工具安装与配置,鸿蒙北向开发入门必备!鸿蒙北向开发主要侧重于应用层的开发,如APP开发、用户界面设计等,更多地关注用户体验、应用性能优化、上层业务逻辑的实现,需要开发者具备基本的编程知识、对操作系统原理的简单理解,以及一定的UI设计感。由触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,支持开源鸿蒙OpenHarmony3.2至5.0系统,适合鸿蒙开发入门学习。下载与安装开发工具点下面链接下载:
    Industio_触觉智能 2025-03-28 18:16 168浏览
  • 真空容器内部并非wan全没有压强,而是压强极低,接近于零。真空状态下的压强与容器内外气体的分子数量、温度以及容器本身的性质有关。一、真空与压强的基本概念真空指的是一个空间内不存在物质或物质极少的状态,通常用于描述容器或系统中气体的稀薄程度。压强则是单位面积上所受正压力的大小,常用于描述气体、液体等流体对容器壁的作用力。二、真空状态下的压强特点在真空状态下,容器内部的气体分子数量极少,因此它们对容器壁的作用力也相应减小。这导致真空容器内部的压强远低于大气压强,甚至接近于零。然而,由于技术限制和物理
    锦正茂科技 2025-03-29 10:16 129浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦