从“裸奔”到RTOS:我的STM32F103C8T6最小系统板运行RT-Thread Nano实录(含内存占用分析)

从“裸奔”到RTOS:给STM32F103C8T6最小系统板装上RT-Thread Nano的心路历程 本文详细记录了在STM32F103C8T6最小系统板上从裸机编程升级到RT-Thread Nano实时操作系统的完整过程。通过Keil MDK-ARM环境配置、内核移植关键步骤解析以及多任务实践案例,展示了如何让STM32芯片实现高效的多任务处理能力,特别适合资源受限的嵌入式开发场景。 阅读详情

从裸机到RTOS:STM32F103C8T6实战RT-Thread Nano全记录

第一次在STM32F103C8T6上跑起RT-Thread Nano时,LED灯按照我预设的频率开始闪烁的那一刻,突然理解了实时操作系统的魅力。这个售价不到20元的"蓝色药丸"开发板,搭载72MHz主频的Cortex-M3内核和仅20KB的SRAM,却能流畅运行多任务系统——这就是我想分享的完整过程。

1. 环境搭建与工程初始化

在Keil MDK-ARM环境下创建新工程时,我习惯先建立一个清晰的目录结构。与常见的"Drivers"、"User"分组不同,RT-Thread Nano需要特别关注这几个目录:

Project/
├── CMSIS/
├── Drivers/
├── RT-Thread/
│   ├── include/
│   ├── libcpu/
│   └── src/
└── User/

关键配置步骤 :

  1. 安装RT-Thread Nano 3.1.5 Pack(比原文推荐的3.0.3版本内存占用更优)
  2. 在Manage Run-Time Environment中勾选:
    • RTOS::RT-Thread
    • RTOS::RT-Thread→Kernel

注意:不要直接使用Pack Installer默认安装的全部组件,这会导致不必要的内存占用。我实测发现仅选择内核组件时ROM占用可减少8KB。

2. 内存优化配置实战

STM32F103C8T6的硬件资源非常有限,因此每个字节的优化都至关重要。通过修改rtconfig.h中的关键参数,我得到了这样一组优化配置:

配置项 初始值 优化值 节省空间
RT_THREAD_PRIORITY_MAX 32 8 1.2KB
RT_TICK_PER_SECOND 100 100 -
RT_MAIN_THREAD_STACK_SIZE 512 256 256B
RT_USING_HEAP 1 0 1KB
// rtconfig.h 关键修改片段
#define RT_USING_MEMPOOL
#define RT_USING_SMALL_MEM
#define RT_USING_HEAP 0  // 使用静态内存分配

这种配置下,系统启动后的内存占用情况:

  • 裸机状态 :

    • ROM: 12KB
    • RAM: 2KB
  • RT-Thread Nano运行后 :

    • ROM: 18KB (+6KB)
    • RAM: 4.5KB (+2.5KB)

3. 多任务实现与性能分析

创建两个简单任务来测试系统性能:

static void thread1_entry(void *parameter)
{
    while (1) {
        GPIO_WriteBit(GPIOA, GPIO_Pin_1, !GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1));
        rt_thread_mdelay(200);
    }
}

static void thread2_entry(void *parameter)
{
    while (1) {
        GPIO_WriteBit(GPIOA, GPIO_Pin_2, !GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2));
        rt_thread_mdelay(500);
    }
}

使用逻辑分析仪测量到的线程切换时间:

任务切换类型 平均耗时(us)
线程1→线程2 4.2
线程2→空闲线程 3.8
中断→线程切换 6.1

这个性能对于72MHz的Cortex-M3来说已经相当不错。实际测试中发现,当系统负载超过70%时,会出现明显的任务延迟,这时就需要考虑:

  1. 优化线程优先级设置
  2. 减少非必要的rt_thread_mdelay调用
  3. 使用事件标志组替代信号量

4. FinSH组件的集成与调试

虽然FinSH会增加约3KB的ROM占用,但对于调试来说物有所值。我的集成步骤:

  1. 在rtconfig.h中启用:

    #define RT_USING_FINSH
    #define FINSH_USING_MSH
    
  2. 添加串口初始化代码到board.c:

    static int uart_init(void)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        
        // PA9-TX, PA10-RX 初始化代码
        // ...省略具体硬件初始化代码
        
        return RT_EOK;
    }
    INIT_BOARD_EXPORT(uart_init);
    
  3. 实现finsh_putchar函数:

    void finsh_putchar(char ch)
    {
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
        USART_SendData(USART1, ch);
    }
    

通过FinSH可以实时查看系统状态:

msh >free
total memory: 4096
used memory : 1248
maximum allocated memory: 1568

msh >list_thread
thread   pri  status      sp     stack size max used left tick  error
-------  ---  ------- ---------- ----------  ------  ---------- ---
tshell    20  running 0x00000060 0x00000800    15%   0x0000000a 000
thread1   10  running 0x00000044 0x00000200    33%   0x00000064 000
thread2   15  suspend 0x00000044 0x00000200    28%   0x000000c8 000

5. 常见问题解决经验

在实际移植过程中,我遇到了几个典型问题:

HardFault异常 :

  • 症状:系统启动后立即进入HardFault
  • 解决方法:
    1. 检查SystemInit()是否在启动代码中被调用
    2. 确认堆栈大小设置合理(startup_stm32f10x_md.s中Stack_Size至少1KB)

内存不足 :

  • 症状:创建线程时返回RT_ERROR
  • 优化方案:
    • 使用静态线程创建方式
    • 减小默认线程栈大小
    • 禁用不需要的内核功能
// 静态线程创建示例
static struct rt_thread thread1;
static rt_uint8_t thread1_stack[256];
rt_thread_init(&thread1, "thread1", thread1_entry, RT_NULL, 
              &thread1_stack[0], sizeof(thread1_stack), 10, 20);

移植完成后,最让我惊喜的是RT-Thread Nano的稳定性——连续运行72小时没有出现任何异常。对于资源受限的STM32F103来说,这个轻量级RTOS确实是个不错的选择。

从“裸奔”到RTOS:我的第一个RT-Thread Nano项目在STM32F103C8T6上的踩坑实录 本文详细记录了在STM32F103C8T6开发板上移植RT-Thread Nano的实战经验,从环境准备、工程改造到配置调优,分享了多任务管理、内存分配及中断处理等关键技术的踩坑与解决方案。特别针对Keil开发环境和RT-Thread Nano 3.1.5版本提供了实用技巧,帮助开发者快速上手RTOS开发。 阅读详情

相关推荐

告别裸奔!用STM32CubeMX给STM32F103C8T6快速穿上RT-Thread Nano的‘外衣’

本文详细介绍了如何使用STM32CubeMX快速为STM32F103C8T6集成RT-Thread Nano操作系统,从裸机开发过渡到RTOS的实战指南。通过图形化配置、关键参数设置和任务拆分实例,帮助开发者高效实现多任务编程,提升开发效率。特别适合初学者和需要轻量级RTOS解决方案的工程师。

weixin_28703489的博客 375

windows下oracle11.2.0.1.0升级至11.2.0.4.0操作文档

windows下oracle11.2.0.1.0升级至11.2.0.4.0操作步骤

qq_39111199的博客 7073

RT-Thread Nano控制台与FinSh移植实战:从原理到嵌入式系统交互调试

在嵌入式系统开发中,控制台是实现系统可观测性与可交互性的核心组件,它充当了系统的标准输入输出接口。其工作原理是通过硬件串口驱动接收和发送数据,经由设备框架抽象,最终由命令行解释器解析并执行用户指令。这项技术的价值在于将嵌入式设备从“黑盒”状态转变为可实时监控和调试的智能系统,极大提升了开发效率。在嵌入式实时操作系统(RTOS)如RT-Thread中,FinSh组件作为轻量级Shell,提供了类似Linux终端的交互体验。其应用场景广泛覆盖了嵌入式产品的开发调试、生产测试与现场运维阶段。本文以RT-Threa

weixin_30444105的博客 558

ORACLE11G安装和升级11.2.0.1.0升级到11.2.0.4.0

ORACLE11G安装和升级 安装LINUX ip写入到hosts vim /etc/selinux/config yum install oracle-rdbms-server-11gR2-preinstall 自动创建了oracle用户了 创建密码 mkdir -p /u01/app/oracle/product/11.2.0/db_1 chown -R oracle:oinstall /u01 chmod -R 775 /u01 mkdir /s

weixin_39568073的博客 3193

告别裸奔!在STM32CubeIDE里给RT-Thread Nano安个家(附完整配置流程与排错记录)

本文详细介绍了如何在STM32CubeIDE中集成RT-Thread Nano实时操作系统,从裸机编程到RTOS的范式迁移,包括环境准备、工程创建、多任务实现及调试技巧。通过实战指南和常见问题解决方案,帮助开发者高效完成STM32与RT-Thread Nano的配置与优化,提升嵌入式开发效率。

weixin_42548829的博客 390

ORACLE 11g从 11 2 0 1升级到11 2 0 4 详细实战过程

ORACLE 11g从 11 2 0 1升级到11 2 0 4 详细实战过程

hfdchhu的博客 2188

oracle迁移升级11.2.0.1到11.2.0.4

有一个测试数据库因为操作系统过于老旧,需要迁移升级。老的版本是11.2.0.1 ,打算升级到11.2.0.4版本操作系统Oracle Linux 6(64 位) => AnolisOS-7.9数据库版本步骤如下:1、新环境搭建11.2.0.4版本数据库2、通过rman备份还原,将旧库的配置文件,在新库还原数据库3、操作数据库升级本文参考了以下文章。

sanmi_life的博客 2196

Oracle JDBC驱动11.2.0.1.0版本部署与应用

Apache Maven是一个强大的项目管理和构建自动化工具,它使用基于XML的项目对象模型(POM)来描述项目的构建过程和依赖关系。Maven的历史可以追溯到2002年,最初是由Jason van Zyl创建,旨在解决Jakarta Turbine项目中遇到的一些构建问题。Maven的主要作用在于简化构建过程,提供标准的构建生命周期框架,并自动处理项目依赖。这使得开发者能够更专注于编码本身,而不是繁琐的构建配置工作。

weixin_33239721的博客 1160

如何升级oracle版本?(11.2.0.1至11.2.0.4)

oracle数据库是目前使用比较广泛的关系型数据库之一,随着官方对漏洞的修复和功能模块的增加,oracle数据库的版本已经从原来普遍使用的8.0发展到现在的12c,很多企业和单位都需要定期对数据库进行升级来保障数据库的安全性,下面就给大家详细的介绍一下oracle数据库的升级方法和步骤!本例中原始数据库版本为11.2.0.1,目标版本为...

tanghuan0827的博客 2170

oracle11.2.0.4补丁包.zip

Oracle 11.2.0.4的最新补丁包,有说明安装顺序, 经测试验证没问题,请放心下载。 经测试验证没问题,请放心下载。 经测试验证没问题,请放心下载。 经测试验证没问题,请放心下载。

Oracle11g R2 补丁包 p8670579_112010

在Linux下,oracle11gr2 netca 无法启动。解决办法详见资源内容

探索Oracle之数据库升级二 11.2.0.3升级到11.2.0.4完整步骤

探索Oracle之数据库升级二  11.2.0.3 升级到11.2.0.4完整步骤   说明:         这篇文章主要是记录下单实例环境下Oracle 11.2.0.1 升级到11.2.0.3的过程,当然RAC的升级是会有所不同。但是他们每个版本之间升级步骤都是差不多的,先升级Database Software,再升级Oracle Instance。  Oracle 11.2.

PrudentWoo 的个人空间 3万+

BUUCTF reverse题解汇总

BUUCTF平台刷题过程中做的一些逆向题解的总结归类

于高山之巅,方见大河奔涌;于群峰之上,更觉长风浩荡。 1万+

告别裸奔!用STM32CubeMX 6.9.2 + Keil MDK 5.38 一键给STM32F103C8T6移植RT-Thread Nano

本文详细介绍了如何使用STM32CubeMX 6.9.2和Keil MDK 5.38在STM32F103C8T6开发板上快速移植RT-Thread Nano操作系统。通过步骤详解和代码示例,帮助开发者从裸机开发过渡到RTOS,实现多任务调度和资源管理,显著提升开发效率和代码可维护性。

weixin_30236595的博客 414

Lumerical-定向耦合器1

概述:本文章使用FDE求解器对定向耦合器进行了数值仿真,讨论了耦合器的间距相关性,耦合长度相关性,波长相关性。讨论了脊形波导和条形波导两种情况。

m0_61776728的博客 4601

Ubuntu 26.04 本地安装 GitLab CE 完整教程(非 Docker 方式)

本文详细介绍了在Ubuntu 26.04系统上通过Omnibus包安装GitLab CE的完整流程。主要内容包括:环境准备(系统要求、依赖安装)、配置清华镜像源、执行安装命令、修改配置文件、服务管理命令以及常见问题解决方法。文章特别强调了内存要求(建议4GB以上)、首次登录密码获取、HTTPS安全配置等关键点,并提供了性能优化建议和安全设置指导。相比Docker方式,Omnibus安装具有性能更好、管理方便等优势,适合需要私有化部署GitLab的场景。

1348

告别裸奔!用Keil MDK给STM32F103穿上RT-Thread Nano的‘外衣’(保姆级移植避坑)

本文详细介绍了如何在STM32F103上使用Keil MDK开发环境移植RT-Thread Nano操作系统,从环境准备、源码获取到工程改造和关键配置,提供了保姆级的移植指南和常见问题解决方案,帮助开发者轻松实现从裸机到RTOS的过渡。

aaa407217484的博客 384

多模态变体—ALIGN:高效的图像-文本学习

ALIGN 论文介绍了该模型的关键技术。无人工标注数据:使用互联网数据进行训练,不依赖人工清洗的数据集。高效的对比学习策略:采用大规模图像-文本配对数据,通过对比学习优化嵌入空间。支持零样本(zero-shot)学习:可以在没有专门训练的情况下执行多种任务,如分类、检索等。可扩展性强:ALIGN 采用高效的 CNN 或 Transformer 作为编码器,适用于大规模计算。

Azperk的博客 1213

告别裸奔!用STM32CubeMX 6.8.1 + RT-Thread Nano 3.1.5,5分钟给你的单片机装上操作系统

本文详细介绍了如何使用STM32CubeMX 6.8.1和RT-Thread Nano 3.1.5在5分钟内为STM32单片机安装实时操作系统(RTOS)。通过实战指南,开发者可以快速掌握任务调度、中断配置和多任务协同等核心功能,显著提升嵌入式项目的开发效率和系统可靠性。

weixin_42561143的博客 100

Xilinx FPGA 10G Ethernet Subsystem example

The 10G Ethernet subsystem provides 10 Gb/s Ethernet MAC, Physical Coding Sublayer(PCS) and Physical Medium Attachment (PMA) transmit and receive functionality over anAXI4-Stream interface.

青城扬沙的博客 2374

基于Qt C++开发一个体测数据管理系统

advice.dietAdvice = "饮食建议:\n1. 控制总热量摄入,每天减少300-500大卡\n2. 减少精制碳水(白米饭、白面包、甜食)\n3. 增加优质蛋白和膳食纤维摄入\n4. 烹饪方式以蒸、煮、烤、凉拌为主,减少油炸\n5. 晚餐适量减少,睡前3小时避免进食";dataTable->setHorizontalHeaderLabels({"ID", "用户名", "身高(cm)", "体重(kg)", "BMI", "体脂率(%)", "记录时间"});

寒寒豆豆软件公司的博客 186

oracle数据库连接的相关问题

上一篇文章简单的介绍了oracle数据库的安装和需要注意的问题,详情见oracle安装。本章将简要介绍使用plsql或Navicat连接oracle数据库时需要注意的地方。 plsql连接: 1.在刚安装好还没有配置时直接取消登录会直接进入到plsql的首页,选择工具——首选项,配置如下图红线区域: 其中instantclient为plsql对应版本的,我的是oracle11.2 plsql3...

qq_38359535的博客 300

iOS远程真机之ios-minicap安装使用完全指南

minicap 是开源项目 STF 中的高速截图工具。STF利用此工具不断的传输图片信息并在web端绘制实现 以前只有Android版本,最近有新的ios版本,现在就安装过程中遇到的一些问题进行分享(ps:感谢sorccu 在issue里面给我的指点) 首先上地址:https://github.com/openstf/ios-minicap 你可以git clone或者直接下载zip包。

甫式人生 1万+

Windows下oracle11.2.0.1升级至oracle11.2.0.4

1. 问题现象: oracle11.2.0.1通过dblink访问oracle 11.2.0.4报错ORA-00600[2252] 根据资料显示是因为低版本数据库通过dblink访问高版本数据库导致的,需要升级数据库版本,。 2. 升级环境: 操作系统 windows 2008 数据库版本(升级前) oracle11.2.0.1 数据库版本(升级后) oracle11.2.0...

old boy的博客 5426

YOLOv8 | 损失函数改进,最新提出的Shape-IoU,有效涨点

作为检测器定位分支的重要组成,边框回归损失在目标检测任务中发挥巨大作用。现有的边框回归方法,通常考虑了GT框与预测框之间的几何关系,通过使用边框间的相对位置与相对形状等计算损失,而忽略了边框其自身的形状与尺度等固有属性对边框回归的影响。为了弥补现有研究的不足,本文提出聚焦边框自身形状与尺度的边框回归方法。首先我们对边框回归特性进行分析,得出边框自身形状因素与尺度因素会对回归结果产生影响。

kay_545 1907

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

oracle11.2.0.1数据库打补丁

其他数字也是一样的执行,一个一个打,分别打开数字补丁包的路径,一样执行①②这两个命令,看到succeed 就可以了。补丁打完以后,压缩包留一下备用,解压的文件夹可以删掉。,oracle服务自动启动了就完成了打补丁。打补丁前要先关闭oracle 实例。数字补丁包从数字小的打到大的。

m0_68566281的博客 629

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 别再折腾了!Amesim 2021.1 + Matlab 2020b + VS2019 联合仿真保姆级避坑指南
下一篇: 别再折腾Nginx了!用ZLMediaKit+PHPStudy在Windows上5分钟搞定本地视频流服务器
cuangu9341
博客等级 码龄11年 4粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值