RT-thread准备工作

Tutorial: 卓越工程师 Category: 嵌入式 Published: 2026-10-23 11:05:29 Views: 1 Likes: 0 Comments: 0

242.0RT-thread准备工作

int main(void) /* RT-Thread 启动完成后,会在线程上下文中调用用户的 main 函数。 */
{ /* 用户应用入口开始。 */
    int count = 1; /* 保留课程源码:计数器从 1 开始,但当前只用于维持循环。 */
    while (count++) /* 条件使用旧值再自增;在实际实验时可视为持续循环。 */
    { /* 每轮循环开始。 */
        /* LOG_D("Hello RT-Thread!"); */ /* 课程最终把调试日志注释掉,以免每秒刷屏。 */
        rt_thread_mdelay(1000); /* 让当前线程挂起约 1000 ms,把 CPU 让给其他就绪线程。 */
    } /* 返回延时结束后的下一轮。 */
    return RT_EOK; /* 按正常流程不会执行;RT_EOK 的值表示成功。 */
} /* 用户应用入口结束。 */

本节完成 RT-Thread Studio、STM32F103ZET6 工程、串口控制台和 FinSH/MSH 的第一次联调。上面的代码与课程压缩包 rttcode/01TEST/applications/main.c 一致;它使用 rt_thread_mdelay(),说明 main() 此时已经运行在 RT-Thread 创建的主线程中,而不是复位后直接进入的裸机 main()。

一、实时操作系统

RTOS 是 Real-Time Operating System(实时操作系统)。它通过线程调度、时钟、内存管理、同步、通信和中断配合,让多个有不同时间要求的任务共享处理器。单核 MCU 在同一时刻仍只执行一条线程指令;所谓“并发”来自调度器快速切换线程,“实时”强调在规定时限内给出可预测响应,并不等于单纯跑得快。

RT-Thread、FreeRTOS 和 µC/OS 都属于 RTOS,但不能据此说它们“本质完全相同”或 RT-Thread 内核是仿写另外两者。它们共享线程、优先级、调度、信号量等通用操作系统概念,API、对象模型、组件体系、许可证和实现细节各不相同。RT-Thread 还提供设备框架、FinSH、DFS、网络和软件包生态。

1.1 准备工作

课程后续内容包括线程的创建与删除、调度与延时、同步与通信、软件定时器、中断配合、系统启动过程、设备框架及综合项目。学习目标不应只停在“能调用 API”:至少要能解释线程状态、优先级、阻塞与忙等的差别,知道 API 可在哪种上下文使用,并能从日志、线程列表和返回值定位问题。

内核源码不必在第一天逐行读完,但也不应完全跳过。先用 API 完成实验,再沿着 main()、线程创建、延时、调度和串口设备调用链阅读源码,学习效率更高。RT-Thread 官方的线程管理文档说明了抢占式调度、线程状态和上下文切换。

1.1.1 RT-Thread官网

RT-Thread 是 2006 年开始发展的开源嵌入式实时操作系统。标准版不仅有内核,还包含组件与设备框架,面向资源较充足的 MCU 和物联网设备;Nano 则保留精简内核能力,适合资源受限场景。标准版与 Nano 的差别是组件范围与资源占用,不能简单按“C8T6 必须 Nano、ZET6 必须标准版”划分,最终要看 Flash、RAM 和功能预算。

优先使用以下官方入口:

课程工程固定为 RT-Thread 5.0.2。截至 2026-10-12,官方 Releases 已列出 v5.3.0,所以“5.0.2 是最新版”只符合录课当时,今天复现课程仍可用 5.0.2,新项目则应先核对芯片/BSP 支持和迁移影响后选择当前稳定版。

1.1.2 RT-Thread社区

社区论坛适合搜索具体芯片、驱动和组件问题。阅读帖子时要同时记录 RT-Thread 版本、Studio/工具链版本、BSP、芯片与错误日志;缺少这些条件的答案可能无法复现。遇到诸如“双 W5500”“RTC 不工作”之类问题,应先查官方驱动接口和当前源码,再把帖子当作排查线索。

回答问题也是训练方法:给出最小复现、配置宏、日志、原因和验证步骤,比只回复一段可复制代码更有学习价值。Env 是 RT-Thread 官方的命令行配置/构建辅助工具,并非“没有必要使用”;本课程采用 Studio,所以暂时不用 Env,使用 MDK/IAR/GCC BSP 或自动化构建时仍可能需要它。

1.1.3 RT-Thread下载

Studio 和 SDK 资源包会更新,优先从官方 Studio 页面下载,而不是长期保存的网盘安装包。官方 Studio 文档说明,SDK Manager 用于安装、下载和升级内核及板级资源包;Studio 程序版本与工程所选的 RT-Thread 内核版本是两件事,不要混为一谈。

课程复现应保留 5.0.2 工程,避免新版 API 或模板变化干扰后续逐课对照。若新建最新版工程,另建目录并记录版本,不要直接让 IDE 覆盖课程工程。安装包校验、发行说明和许可证也应从官方来源核对。

1.1.4 RT-Thread开发者大会

RT-Thread 会举办开发者大会和城市活动,具体时间与城市以官方活动页为准。原稿把创始人写成“熊谱祥”,正确姓名是熊谱翔;RT-Thread 官方介绍记载该项目由熊谱翔带领开源社区力量开发。

阅读开源代码确实能训练工程能力,但“几周内看懂整个内核”不是统一学习标准。初学阶段可从一条可运行路径开始:main() 如何成为线程、rt_thread_mdelay() 如何阻塞、系统 tick 如何唤醒、调度器如何重新选择线程。每读一层都用断点、日志或 FinSH 状态验证理解。

1.2 裸机知识全面环境搭建

1.2.1 裸机知识全面

“裸机”通常指没有通用任务调度内核,应用主要由初始化、主循环和中断组成。它不等于只有一个 while(1):中断、DMA、状态机和事件循环也能形成复杂并发逻辑。进入 RTOS 前应掌握 C、指针、结构体、函数指针、栈、链接、启动文件、SysTick/NVIC、UART 和基本调试。

RTOS 本身就是操作系统。Linux 通常属于功能更完整的通用操作系统,包含进程、用户态、虚拟内存和丰富驱动/文件系统;二者关注范围不同,不能说“RTOS 只是逻辑,Linux 才是真正的系统”。Linux 也可以通过 PREEMPT_RT 等机制增强实时性。

从裸机迁移到 RTOS 时,重点变化是:任务拆成线程;共享资源需要同步;延时应让线程阻塞而不是忙等;中断只做短处理并把工作交给线程;每个线程都要有独立栈并受调度器管理。

1.2.2 环境搭建

课程硬件是 STM32F103ZET6 开发板,板载 CH340 连接 USART1,下载器使用 ST-Link。自己的板卡若原理图不同,应按真实串口和调试接口选择,不能机械照抄 UART1、COM17 或课程中的引脚。

1.2.2.1 安装RT-Thread Studio

安装 Studio 时建议使用短的纯英文路径,工作空间和工程路径也保持纯英文。现代 Windows 支持 Unicode 路径,但旧工具链、构建脚本或第三方包仍可能处理不完整;这是降低兼容性风险的建议,不是 C 语言或 RT-Thread 内核的硬性规则。

视频所用 Studio 首次启动会选择 workspace,并可能要求登录账号;当前界面与登录策略可能随版本变化。安装完成后先确认三项:Studio 能打开 SDK Manager、ARM GCC 工具链可用、ST-Link 驱动能识别探针。

1.2.2.2 新建工程

按课程版本复现时,可采用以下配置:

  1. 选择“文件→新建→RT-Thread 项目”,项目名使用 01TEST 或其他英文名。
  2. 选择“基于芯片”,厂商 STMicroelectronics/STM,系列 STM32F1,芯片 STM32F103ZET6。
  3. 内核选择已安装的 5.0.2 资源包;若 SDK Manager 中没有,先安装后重新进入建项向导。
  4. 控制台选择 USART1,因为课程板的 CH340 接在 USART1;其他板应查看原理图。
  5. 调试器明确选择实际使用的 ST-Link,不要依赖“默认就是 ST-Link”的假设。
  6. 完成后关闭欢迎页,确认项目出现在 Project Explorer,再检查构建与下载配置。

“使用缺省位置”就是使用 workspace 下的默认工程目录。原稿推测其来自某个英文短语没有依据;“缺省值”是中文计算机术语,含义就是未显式指定时采用的默认值。

RT-Thread Settings 是图形化配置入口,背后对应 Kconfig 和生成配置。启用 DFS、FatFs 等组件会改变配置宏与参与构建的源码。原稿“FATFS 只能存 4 GB”不准确:常说的 4 GiB 限制是 FAT32 的单个文件大小上限约为 4 GiB - 1 byte,卷容量是另一项限制;FatFs 还可按配置支持 FAT12/16/32 与 exFAT。

1.2.2.3 项目文件分析

课程生成工程的主要目录如下:

目录/文件作用
applications/main.c用户应用入口,本课只有延时和一条被注释的日志
drivers/STM32 BSP 与 RT-Thread 设备接口的适配层,如 UART、GPIO、SPI
libraries/STM32 HAL 与 CMSIS 等芯片厂商库
linkscripts/GCC 链接脚本,定义 Flash/RAM 布局与段放置
rt-thread/src/内核核心:线程、调度、时钟、IPC、内存、对象、定时器等
rt-thread/components/FinSH、设备框架、DFS、网络等可裁剪组件
rtconfig.h由配置生成的功能宏;本工程启用 uart1 控制台和 FinSH/MSH

rt-thread/src/ipc.c 中的 ipc 是 inter-process/inter-thread communication(进程/线程间通信) 的缩写,不是转录中的“RPC”。scheduler_up.c 面向单处理器调度,thread.c 管理线程,clock.c 和 timer.c 分别涉及 tick/时间与定时器。

RT-Thread 的设备框架在 HAL 之上提供统一设备对象和操作接口,使应用按设备名查找、打开、读写和控制设备。它与 Linux 设备模型有相似的抽象思想,但不能简单说成“照搬 Linux”或等同于 Windows 设备管理器;官方的I/O 设备框架文档给出了分层与接口定义。

课程初次构建时,drivers/board.c 第 15 行使用了模板中的大写 RT_WEAK,而工程内 RT-Thread 5.0.2 的 rtdef.h 只定义小写 rt_weak,GCC 因无法识别该符号而报错。课程最终源码已经修正为:

rt_weak void rt_hw_board_init() /* 课程最终源码的函数声明:用弱符号定义板级初始化,允许更强的同名实现覆盖它。 */

这里应以当前工程实际包含的头文件定义为准,而不是一律把宏改成某种大小写。官方当前源码也使用小写 rt_weak,但其他历史版本或第三方 BSP 可能不同。修复后应执行 clean/rebuild,确认错误消失;视频编译日志里另有未使用函数等 warning,它们不是同一个问题,也不应误报成“三个 error”。

构建成功后点击下载按钮,把 ST-Link 的 SWDIO、SWCLK、GND 和目标电压参考正确接到开发板。下载后,启用的 LOG_D 每秒通过 UART1 输出一次,闪烁的是 USB 转串口的发送指示现象,不是 main.c 在切换 GPIO LED;课程最终把该日志注释掉,控制台只保留启动 banner 和交互提示。

串口默认配置来自 RT_SERIAL_CONFIG_DEFAULT:115200 bit/s、8 数据位、1 停止位、无校验、无流控。在 MobaXterm 中新建 Serial 会话,选择本机实际 COM 口和 115200;视频的 COM17 只是当时枚举结果。若端口被占用,先关闭其他串口助手或 Studio 的终端。

启动后按回车出现 msh >,表示 FinSH 的 MSH 模式已工作。常用验证命令包括:

  • help 或空输入后按 Tab:查看当前编译进系统的命令。
  • version:打印内核版本以及本次固件的编译日期和时间;视频中的 Dec 9 2023 16:31:57 不是内核发行日期。
  • list:只输入它会显示参数用法。
  • list thread 或 ps:列出主线程、shell 线程、空闲线程和软件定时器线程等当前对象。

命令是否存在取决于编译配置。课程源码在 components/finsh/cmd.c 中用 MSH_CMD_EXPORT/MSH_CMD_EXPORT_ALIAS 注册命令,msh.c 还注册了 ps;官方 FinSH 文档说明了 MSH、Tab 补全和常用内建命令。

1.2.2.4 任务信息资源导图

到本节结束,应能独立完成以下闭环:从官方渠道安装 Studio 和指定 SDK;按 STM32F103ZET6 建立标准版工程;定位并修复 RT_WEAK/rt_weak 版本不匹配;构建、经 ST-Link 下载;用 UART1 以 115200 8N1 打开 MSH;执行 version、list thread 或 ps 验证系统。

进入下一课前,再用源码回答三个问题:为什么 rt_thread_mdelay(1000) 不会像裸机忙等那样独占 CPU;rtconfig.h 怎样决定 FinSH 是否参与编译;rt_hw_board_init() 为什么要用弱符号。能结合工程文件解释这些问题,环境搭建才真正服务于后续学习。