《APM32芯得》系列内容为用户使用APM32系列产品的经验总结,均转载自21ic论坛极海半导体专区,全文未作任何修改,未经原文作者授权禁止转载。

如遇技术问题,可前往 极海半导体开发者论坛

1 前言

最近在了解TencentOS的特性,据了解它的一些特点:

1. 资源占用极少

2. 高效功耗管理框架

3. 自动移植工具

4. 最后一屏调试工具

5. 安全分级方案

它的官网这里:https://cloud.tencent.com/product/tos-tiny

正好我手上有极海家的APM32F407IGMINI板卡,我便计划基于这块板卡移植TencentOS来看看。

本文将记录移植的过程,也请各位大神多多斧正。

2 APM32F4 源码准备

我们去极海官网下载APM32F4的SDK包:

https://geehy.com/uploads/tool/APM32F4xx_SDK_V1.4.zip

打开SDK包我们找一个“顺眼的”demo作为我们的基础,以移植TencentOS,对就是你了“SysTick”例程。

本次我计划在MDK上实现APM32F4的TencentOS适配,所以我将选择“SysTick”例程的MDK工程。为了不和原工程混淆,我把“SysTick_TimeBase”复制至\Examples\RTOS目录下:

把“SysTick_TimeBase”名字改为“TencentOS”。

3 TencentOS源码获取

我们去TencentOS的Github仓库下载其最新的源码:

https://github.com/OpenAtomFoundation/TencentOS-tiny

关于TencentOS的源码我们比较关系的重要内容有:

由于我手上的APM32F4 尚未被TencentOS支持,所以我们在“board”文件夹中未能找到我们需要的东西,但可做参考。

本次考虑的是能够使得APM32F407正常运行TencentOS,所以我们更关心的是TencentOS tiny 适配的 IP 核架构、TencentOS tiny 内核源码这两部分的内容。

下面我们复将TencentOS源码复制或解压至“APM32F4xx_SDK_V1.4\Middlewares”文件夹中。

至此我们完成了源码的获取工作,接下来我们将进入MDK的工程设置进行一步步的把TencentOS移植。

4 移植TencentOS至APM32F407

打开我们刚刚在第2节中准备的工程:

我们将在该工程上进行修改。

4.1 TencentOS 源文件包含

首先我们先创建用于保存TencentOS的文件目录结构:

分别是:

1. TencentOS/arch

 用于存放arch平台代码。

2. TencentOS/kemel

 用于存放TencentOS内核源码,

3. TencentOS/cmsis_os

 用于存放cmsis os 源码,

4.2 TencentOS 头文件路径包含

完成源文件包含后我们将所需的头文件包含进我们的工程。

4.3 复制tos_config.h

我们将和APM32F4 相同架构的STM32L431demo下的tos_config.h(APM32F4xx_SDK_V1.4\Middlewares\TencentOS-tiny\board\BearPi_STM32L431RC\TOS-CONFIG)文件复制到我们的目录下:

4.4 修改源码

4.4.1 修改tos_config.h的头文件包含为“apm32f4xx.h”

4.4.2 注释PendSV_Handler

注释掉apm32f4xx_int.c里面的PendSV_Handler函数,该函数将由TencentOS接管。

4.4.3 修改SysTick_Handler

TencentOS 需要SysTick做为时基,在“apm32f4xx_int.c”的头部增加“tos_k.h”引用。

然后修改SysTick_Handler函数如下:

void SysTick_Handler(void)

{

// TimingDelay_Decrement();

if (tos_knl_is_running())

{

tos_knl_irq_enter();

tos_tick_handler();

tos_knl_irq_leave();

}

}

4.4.4 修改main.c

在 main.c 中添加TencentOS tiny 头文件,编写任务函数:

任务函数编写可以参考官方提供的demo:

//task1

#define TASK1_STK_SIZE 256

void task1(void *pdata);

osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);

//task2

#define TASK2_STK_SIZE 256

void task2(void *pdata);

osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE);

void task1(void *pdata)

{

int count = 1;

while (1)

{

printf("\r\nHello world!\r\n###This is task1 ,count is %d \r\n", count++);

APM_MINI_LEDToggle(LED2);

osDelay(2000);

}

}

void task2(void *pdata)

{

int count = 1;

while (1)

{

printf("\r\nHello TencentOS !\r\n***This is task2 ,count is %d \r\n", count++);

APM_MINI_LEDToggle(LED3);

osDelay(1000);

}

}

然后将main函数修改如下:

int main(void)

{

USART_Config_T usartConfigStruct;

usartConfigStruct.baudRate = 115200;

usartConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;

usartConfigStruct.mode = USART_MODE_TX;

usartConfigStruct.parity = USART_PARITY_NONE;

usartConfigStruct.stopBits = USART_STOP_BIT_1;

usartConfigStruct.wordLength = USART_WORD_LEN_8B;

APM_MINI_COMInit(COM1, &usartConfigStruct);

APM_MINI_LEDInit(LED2);

APM_MINI_LEDInit(LED3);

osKernelInitialize();//TOS Tiny kernel initialize

osThreadCreate (osThread(task1),NULL);//Create task1

osThreadCreate(osThread(task2),NULL);//Create task2

osKernelStart ();//Start Tos Tiny

while (1)

{

}

}

至此我们完成了代码的编写工作。

5 编译下载

完成代码的编写工作后,我们编译工程:

进行下载(我使用的是jlink)。然后使用串口线连接MINI板,打开串口助手可以看到两个任务可以正常打印,LED按照各自的延时时间正常闪烁。

至此,基于APM32F4的TencentOS 适配工作完成。你也来试试看吧。

注:文章作者在原帖中提供了工程文件,有需要请至原文21ic论坛下载

原文地址:https://bbs.21ic.com/icview-3325166-1-1.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913030.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913030.shtml
英文地址,请注明出处:http://en.pswp.cn/news/913030.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Docker基础】Docker数据持久化与卷(Volume)介绍

目录 1 Docker数据持久化概述 1.1 为什么需要数据持久化 1.2 Docker数据管理方式对比 2 Docker卷(Volume)核心概念 2.1 数据卷基本特性 2.2 卷类型详解 2.2.1 命名卷(Named Volumes) 2.2.2 匿名卷(Anonymous Volumes) 2.2.3 主机绑定卷(Host Volumes) 3 数据卷操作全…

yolo8,10,11之处理不平衡类别问题

一、前言 使用 yolo11进行目标检测时,发现训练数据集存在类别数量不平衡的情况,查阅了一下资料,可采取以下方法。 二、样本增强 少数类的框是独立存在于图片中,则可通过颜色、亮度、几何变换等方法人为增加少数类的样本数&#x…

基于 51 单片机做的二十四点小游戏

用 51 单片机做的二十四点小游戏 一、任务要求 设计一个模拟纸牌 24 点玩法的单片机模拟器,由单片机随机发出四个牌点,测试者在实验板按键上输入计算过程,单片机判断计算结果是否正确,并评定测试者的成绩。 【基本要求】&#…

Hadoop WordCount 程序实现与执行指南

Hadoop WordCount 程序实现与执行指南 下面是使用Python实现的Hadoop WordCount程序,包含完整的Mapper和Reducer部分。 这个程序可以在PyCharm中本地测试,也可以部署到远程Hadoop集群上运行。 mapper.py import sys# 从标准输入读取数据 for line in sys.stdin:# 移除行首…

数据可视化:5 分钟读懂其核心价值与技术实践

为什么数据可视化成为企业数字化转型的“必修课”?在信息爆炸的时代,企业每天产生海量数据,从客户行为到销售业绩,从供应链运作到市场趋势。如何从这些原始数据中快速提炼有价值的信息?如何将复杂数据转化为直观易懂的…

Python 量化交易安装使用教程

一、什么是量化交易? 量化交易是通过数学模型和计算机程序,自动化地执行证券买卖决策的交易方式。Python 凭借其丰富的生态和强大的数据处理能力,成为量化交易的首选语言。 二、环境准备 建议使用 Anaconda 安装 Python 3.8,方便…

从 PostgreSQL 到 DolphinDB:数据实时同步一站式解决方案

随着越来越多的用户使用 DolphinDB,各种不同的应用的场景也对 DolphinDB 的数据接入提出了不同的要求。部分用户需要将 PostgreSQL 的数据实时同步到 DolphinDB 中来,以满足在 DolphinDB 中使用数据的实时性需求。本篇教程将介绍使用 Debezium 来实时捕获…

关于联咏(Novatek )白平衡色温坐标系探究

目录 一、疑问 二、结论 三、分析 四、释疑 五、仿真模拟 一、疑问 为什么Novatek的白平衡色温坐标系是这个样子的呢?各条直线和曲线分别代表什么含义呢?色温坐标系中所标定的参数代表什么含义呢?如何标定新增一些特殊的光源呢?二、结论

Protein FID:AI蛋白质结构生成模型评估新指标

一、引言:蛋白质生成模型面临的评估挑战 近年来,AI驱动的蛋白质结构生成模型取得了令人瞩目的进展,但如何有效评估这些模型的质量却一直是一个悬而未决的问题。虽然实验验证仍然是金标准,但计算机模拟评估对于快速开发和比较机器…

Vim 高效编辑指南:从基础操作到块编辑的进阶之路

文章目录🔠 一、基础编辑命令(生存必备)⚡ 二、进阶操作:可视化块模式 (Ctrl+v)典型应用场景🚀 三、效率提升技巧💡 四、配置建议(~/.vimrc)结语作为开发者最强大的文本编辑器之一,Vim 的高效操作离不开其命令模式(Normal Mode)。本文将系统性地介绍 Vim 的核心编…

docker学习第一天框架学习以及在redhat7.9安装操作

一.docker是什么。 Docker 是一个开源的容器化平台,通过将应用程序及其依赖项(如代码、运行时环境、系统工具等)打包到轻量级、可移植的容器中,实现「一次构建,处处运行」的现代化开发模式。它利用了 Linux 内核特性来…

QT控件 使用Font Awesome开源图标库修改QWidget和QML两种界面框架的控件图标

又一个月快要结束了,在这里总结下分别在QWidget和QML两种界面设计模式中应用Font Awesome开源图标库,修改界面的显示图标效果, AriaNg是aria2的可视化web界面工具,其中的图标大都是Font AWesome中的字体图标,某位曾经尝试将AriaNg…

Qt Quick 与 QML(四)qml中的Delegate系列委托组件

一、概念 在QML中,Delegate是一种非常重要的组件,特别是在使用ListView、GridView、PathView等视图组件时。Delegate用于定义每个列表或网格中的项目是如何展示的。通过自定义Delegate,你可以控制每个项目的外观和行为。 Delegate通常是一个…

android图片优化

在 Android 中加载大图时,如果不进行优化处理,很容易导致内存溢出(OOM)和应用卡顿。以下是几种高效处理大图加载的方法和最佳实践: 1. 使用图片加载库(推荐) 成熟的第三方库已经处理了内存管理…

【机器人】复现 DOV-SG 机器人导航 | 动态开放词汇 | 3D 场景图

DOV-SG 建了动态 3D 场景图,并使用LLM大型语言模型进行任务分解,从而能够在交互式探索过程中对 3D 场景图进行局部更新。 来自RA-L 2025,适合长时间的 语言引导移动操作,动态开放词汇 3D 场景图。 论文地址:Dynamic …

mongodb 中dbs 时,local代表的是什么

在 MongoDB 中,local 是一个内置的系统数据库,用于存储当前 MongoDB 实例(或副本集节点)的元数据和内部数据,与其他数据库不同,local 数据库的数据不会被复制到副本集的其他成员。 local 数据库的核心作用 …

Spring Cloud(微服务部署与监控)

📌 摘要 在微服务架构中,随着服务数量的增长和部署复杂度的提升,如何高效部署、持续监控、快速定位问题并实现自动化运维成为保障系统稳定性的关键。 本文将围绕 Spring Cloud 微服务的部署与监控 展开,深入讲解: 微…

音频动态压缩算法曲线实现

Juce实现动态压缩曲线绘制 动态范围压缩算法(Dynamic Range Compression,DRC)是将音频信号的动态范围映射到一个较小的范围内的过程,即降低较高的峰值的信号电平,而不处理较安静的部分。DRC被广泛用于音频录制、制作工…

技术视界 | OpenLoong 控制框架:打造通用人形机器人智能系统的中枢基座

在人形机器人向通用性、智能化方向加速演进的当下,控制系统的角色正在发生根本变化:它不再只是底层驱动的接口适配层,也不只是策略调用的转译引擎,而是成为连接具身模型、异构本体与多样化任务的“中枢神经系统”。 在 2025 年张…

IOS 蓝牙连接

最近做一个硬件设备,写IOS相应的数据连接/分析代码时;发现一个问题,如果是开机,每次都能连接上。连接断开后,发现再也扫描不到了。通过第三方工具LightBlue,发现信号是-127。 此时进入设置查看蓝牙设备&am…