当前位置: 首页 > article >正文

STM32F407 + RT-Thread 实战:从工程结构到多线程 LED 闪烁

一、工程简介最近看了一个基于 STM32F407 的 RT-Thread 工程整体结构比较标准功能上也比较适合作为入门练手项目。这个工程的核心功能并不复杂主要是通过 RT-Thread 创建多个线程分别控制不同的 LED 引脚按不同节奏闪烁。虽然只是一个“多线程点灯”实验但它已经把 RTOS 中几个关键概念串起来了比如- 线程创建- 线程调度- GPIO 控制- 板级初始化- 自动初始化机制如果你刚开始接触 RT-Thread这种工程非常适合拿来分析和练手。---二、工程目录结构分析从目录上看这个工程主要包含以下几个部分- applications- drivers- cubemx- rt-thread- .config / rtconfig.h1. applications这是应用层代码目录也是我们最需要关注的部分。当前工程中主要有两个文件- main.c- led_blink.c它们分别完成不同线程的创建与启动。2. drivers这个目录主要是板级支持包相关代码比较关键的是 board.c负责- 堆内存初始化- 底层硬件初始化- 控制台设备设置- 板级组件初始化也就是说RT-Thread 跑起来之前底层环境准备工作主要在这里完成。3. cubemx这个目录里是 STM32CubeMX 生成的底层代码包括- GPIO 初始化- 时钟配置- 中断处理文件- HAL 驱动源码- 启动文件说明这个项目是通过 CubeMX RT-Thread BSP 结合起来搭建的。4. rt-thread这里是 RT-Thread 内核和组件源码包括- 线程调度- 内存管理- 设备驱动框架- FinSH/MSH 命令行组件- 各类内核组件通常做应用开发时不会频繁修改这里的源码但理解其结构对后续学习很有帮助。---三、这个工程实现了什么功能这个工程本质上是一个“多线程控制 3 个 LED 闪烁”的实验。对应引脚如下- PA6LED1- PA4LED2- PA3LEDSYS三个线程的运行节奏不同- LED1 每 100ms 闪烁一次- LED2 每 500ms 闪烁一次- LEDSYS 每 1000ms 翻转一次从实验现象上看就是三个 LED 同时以不同频率闪烁这正好体现了 RTOS 多线程并发运行的基本效果。---四、main.c 中的动态线程创建在 main.c 中定义了两个线程入口函数分别控制 LED1 和 LED2。1. LED1 与 LED2 线程入口函数#include rtthread.h #define DBG_TAG main #define DBG_LVL DBG_LOG #include rtdbg.h #include main.h #include board.h #include rtdbg.h #define LED1_PIN GET_PIN(A,6) #define LED2_PIN GET_PIN(A,4) #define LEDSYS_PIN GET_PIN(A, 3) #define THREAD_PRIORITY 25 #define THREAD_TIMESLICE 5 void led1_thread_entry(void *parameter) { while(1) { rt_pin_write(LED1_PIN, PIN_LOW); rt_thread_mdelay(100); rt_pin_write(LED1_PIN, PIN_HIGH); rt_thread_mdelay(100); } } void led2_thread_entry(void *parameter) { while(1) { rt_pin_write(LED2_PIN, PIN_LOW); rt_thread_mdelay(500); rt_pin_write(LED2_PIN, PIN_HIGH); rt_thread_mdelay(500); } }这里比较容易看懂- led1_thread_entry() 控制 PA6- led2_thread_entry() 控制 PA4- 两个线程都在 while(1) 中循环运行- 通过 rt_thread_mdelay() 实现周期性闪烁2. main 函数中创建线程int main(void) { int count 1; rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT); rt_thread_t thread_led1 rt_thread_create(LED1, led1_thread_entry, RT_NULL, 1024, THREAD_PRIORITY, THREAD_TIMESLICE); if (thread_led1 ! RT_NULL) { rt_thread_startup(thread_led1); } rt_thread_t thread_led2 rt_thread_create(LED2, led2_thread_entry, RT_NULL, 1024, THREAD_PRIORITY, THREAD_TIMESLICE); if (thread_led2 ! RT_NULL) { rt_thread_startup(thread_led2); } while (count) { rt_thread_mdelay(1000); } return RT_EOK; }这部分展示了 RT-Thread 最常见的动态线程创建方式- rt_thread_create()创建线程- rt_thread_startup()启动线程线程创建时传入的参数分别包括- 线程名称- 线程入口函数- 入口参数- 线程栈大小- 线程优先级- 时间片这种方式的优点是使用方便适合快速创建任务缺点是依赖动态内存分配。———五、led_blink.c 中的静态线程创建除了动态线程这个工程还演示了静态线程初始化方式代码在 led_blink.c 中。#include rtthread.h #include board.h #include rtdbg.h #define LEDSYS_PIN GET_PIN(A, 3) #define THREAD_PRIORITY 25 #define THREAD_TIMESLICE 5 ALIGN(RT_ALIGN_SIZE) static char ledsys_stack[256]; static struct rt_thread ledsys; void ledsys_thread_entry(void *parameter) { while(1) { rt_pin_write(LEDSYS_PIN, !rt_pin_read(LEDSYS_PIN)); rt_thread_mdelay(1000); } } int ledsys_thread_init(void) { rt_pin_mode(LEDSYS_PIN, PIN_MODE_OUTPUT); rt_thread_init(ledsys, LEDSYS, ledsys_thread_entry, RT_NULL, ledsys_stack, sizeof(ledsys_stack), THREAD_PRIORITY - 1, THREAD_TIMESLICE); rt_thread_startup(ledsys); return RT_EOK ; } INIT_APP_EXPORT(ledsys_thread_init);这个文件的重点有两个。1. 静态线程对象和栈空间ALIGN(RT_ALIGN_SIZE) static char ledsys_stack[256]; static struct rt_thread ledsys;这表示- 线程栈由用户手动分配- 线程控制块也是静态定义的- 不依赖动态内存这种方式在资源可控、稳定性要求高的场景更常见。2. 自动初始化机制INIT_APP_EXPORT(ledsys_thread_init);这一句非常关键。它的作用是把 ledsys_thread_init() 注册到应用初始化阶段在系统启动时自动调用。也就是说这个线程不需要在 main() 里手动创建系统启动后会自动完成初始化和启动。六、board.c 中的板级初始化在 drivers/board.c 中可以看到 RT-Thread 板级初始化入口RT_WEAK void rt_hw_board_init() { extern void hw_board_init(char *clock_src, int32_t clock_src_freq, int32_t clock_target_freq); #if defined(RT_USING_HEAP) rt_system_heap_init((void *) HEAP_BEGIN, (void *) HEAP_END); #endif hw_board_init(BSP_CLOCK_SOURCE, BSP_CLOCK_SOURCE_FREQ_MHZ, BSP_CLOCK_SYSTEM_FREQ_MHZ); #if defined(RT_USING_DEVICE) defined(RT_USING_CONSOLE) rt_console_set_device(RT_CONSOLE_DEVICE_NAME); #endif #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); #endif }这段代码说明系统上电后主要做了以下几件事- 初始化堆内存- 初始化板级底层硬件- 设置控制台设备- 执行组件初始化这部分代码虽然不直接控制 LED但它是整个 RT-Thread 工程正常运行的基础。———七、工程配置项分析从 rtconfig.h 可以看到该工程启用了一些比较常用的 RT-Thread 功能。例如#define RT_USING_COMPONENTS_INIT #define RT_USING_USER_MAIN #define RT_USING_MSH #define RT_USING_FINSH #define RT_USING_SERIAL #define RT_USING_PIN #define RT_USING_SEMAPHORE #define RT_USING_MUTEX #define RT_USING_EVENT #define RT_USING_MAILBOX #define RT_USING_MESSAGEQUEUE这说明当前工程已经具备- 用户 main() 入口- MSH/FinSH 命令行- 串口驱动支持- GPIO 引脚操作- 常见线程间通信机制不过需要注意的是虽然配置中打开了信号量、互斥锁、事件、邮箱、消息队列这些功能但当前应用层代码还没有实际使用到现阶段主要还是一个线程调度和 GPIO 输出实验。———八、这个工程适合学什么虽然这个工程功能简单但它非常适合作为 RT-Thread 入门项目尤其适合学习以下内容- RT-Thread 工程结构- 动态线程创建方式- 静态线程创建方式- 线程优先级与时间片- GPIO 控制 LED- 自动初始化宏 INIT_APP_EXPORT- 板级初始化流程对于初学者来说这种工程的价值不在于功能复杂而在于它足够清晰能帮助我们快速建立对 RTOS 工程组织方式的理解。———九、总结这个 STM32F407 RT-Thread 工程本质上就是一个“多线程点灯”实验工程。它主要完成了三件事- 在 main.c 中动态创建两个线程- 在 led_blink.c 中静态创建一个自动启动线程- 在 board.c 中完成底层板级初始化虽然目前业务功能比较简单但它已经具备了一个标准 RT-Thread 工程的基本框架。后续如果继续扩展可以很自然地加入- 按键输入任务- 串口通信任务- 消息队列通信- 软件定时器- 传感器采集线程对于刚开始学习 RT-Thread 的同学来说这样一个工程非常适合作为起点。———十、结尾如果你刚开始接触 RT-Thread建议先把这种“多线程点灯”工程彻底跑通再一步一步往里面加功能。先理解线程再理解线程间通信最后再逐步扩展成完整项目这样学习路径会更清晰。如果这篇文章对你有帮助欢迎交流。

相关文章:

STM32F407 + RT-Thread 实战:从工程结构到多线程 LED 闪烁

一、工程简介最近看了一个基于 STM32F407 的 RT-Thread 工程,整体结构比较标准,功能上也比较适合作为入门练手项目。这个工程的核心功能并不复杂,主要是通过 RT-Thread 创建多个线程,分别控制不同的 LED 引脚按不同节奏闪烁。虽然…...

抖音批量下载完整指南:3步实现无水印视频高效获取

抖音批量下载完整指南:3步实现无水印视频高效获取 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. …...

NoFences:免费开源桌面整理神器,让Windows桌面焕然一新

NoFences:免费开源桌面整理神器,让Windows桌面焕然一新 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 还在为Windows桌面上杂乱无章的图标而烦恼吗&a…...

内网规划练习

本文基于172.16.0.0/16 内网规划,实现双核心交换机互为备份,整合 VLAN、MSTP、VRRP、Eth-Trunk、DHCP 中继、NAT outbound 等技术,满足 PC 自动获取 IP、内网互通、访问公网及 ISP 环回的全业务需求。一、网络需求与规划内网地址:…...

乒乓球教程资源合集

【课程教程资料】乒乓球入门必看,全方位发球技巧教学 文件大小: 3.9GB内容特色: 慢镜拆解12种发球,旋转弧线肉眼可见适用人群: 想靠发球直接拿分的业余玩家核心价值: 一周练成对手接不住的“魔鬼发”下载链接: https://pan.quark.cn/s/8d67c2d65358 乒…...

安全自动化工具:自动化安全检测和响应

安全自动化工具:自动化安全检测和响应 一、安全自动化工具概述 1.1 安全自动化工具的定义 安全自动化工具是指用于自动化执行安全检测、响应和管理任务的软件工具。它通过自动化脚本和智能算法,提高安全运营效率,降低人为错误风险。 1.2 安全…...

如何用Python快速接入Taotoken并调用多模型API完成数据清洗任务

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 如何用Python快速接入Taotoken并调用多模型API完成数据清洗任务 对于需要处理客户数据的开发者而言,数据清洗与结构化是…...

安装 KubeSphere

安装 KubeSphere KubeSphere Core (ks-core) 是 KubeSphere 的核心组件,为扩展组件提供基础的运行环境。KubeSphere Core 安装完成后,即可访问 KubeSphere Web 控制台。 1. 安装 KubeSphere Core 在集群节点上,执行以下命令安装 KubeSpher…...

可观测性告警:及时发现和响应系统异常

可观测性告警:及时发现和响应系统异常 一、可观测性告警概述 1.1 可观测性告警的定义 可观测性告警是指基于系统的指标、日志和追踪数据,通过预设的规则和阈值,自动检测系统异常并发送通知的机制。它帮助运维人员及时发现问题,快速…...

期刊论文重复率多少才算合格?

没有一个“全国统一合格线”。很多人想要一个标准答案,比如“10%以下就稳”“15%以下就能投”。现实是:看你投什么期刊、什么学科、什么系统。大致可以这么看:1. 普通国内期刊:通常 10%–30% 区间常见 有些普刊要求比较宽&#xf…...

终极指南:如何利用Py Eddy Tracker实现海洋中尺度涡旋高效识别与追踪

终极指南:如何利用Py Eddy Tracker实现海洋中尺度涡旋高效识别与追踪 【免费下载链接】py-eddy-tracker Eddy identification and tracking 项目地址: https://gitcode.com/gh_mirrors/py/py-eddy-tracker 海洋涡旋识别与中尺度涡旋追踪是海洋科学研究中的核…...

OpenClaw 换 “大脑”!DeepSeek V4 默认集成,离线私有 AI 自由

OpenClaw 接入 DeepSeek 模型完整配置教程 一、前置准备 已安装并正常运行 OpenClaw Windows 客户端;OpenClaw 顶部 Gateway 状态保持在线;电脑网络正常,可稳定访问 DeepSeek 开放平台;准备可接收验证码的手机号或微信账号&…...

DazToBlender:3D创作工作流的无缝桥梁

DazToBlender:3D创作工作流的无缝桥梁 【免费下载链接】DazToBlender Daz to Blender Bridge 项目地址: https://gitcode.com/gh_mirrors/da/DazToBlender 在3D数字创作的世界里,艺术家们常常面临一个现实困境:如何在不同的专业软件之…...

免费在线法线贴图生成器终极指南:3分钟为你的3D模型添加逼真细节

免费在线法线贴图生成器终极指南:3分钟为你的3D模型添加逼真细节 【免费下载链接】NormalMap-Online NormalMap Generator Online 项目地址: https://gitcode.com/gh_mirrors/no/NormalMap-Online 还在为3D模型表面过于平滑、缺乏真实感而烦恼吗?…...

Chrome二维码插件:跨设备链接传输的智能解决方案

Chrome二维码插件:跨设备链接传输的智能解决方案 【免费下载链接】chrome-qrcode :zap: A Chrome plugin to Genrate QRCode of URL / Text, or Decode the QRcode in website. 一个Chrome浏览器插件,用于生成当前URL或者选中内容的二维码,同…...

QTTabBar终极指南:5分钟掌握Windows文件管理标签页神器

QTTabBar终极指南:5分钟掌握Windows文件管理标签页神器 【免费下载链接】qttabbar QTTabBar is a small tool that allows you to use tab multi label function in Windows Explorer. https://www.yuque.com/indiff/qttabbar 项目地址: https://gitcode.com/gh_m…...

2026 Java面试真题库(基础+进阶+大厂场景题)

面试前期准备不充分其实就是对自己的不负责任,也是在浪费自己的时间,今天为大家整理了一份实战文档,让你系统性的弄懂架构师筑基内容:Linux 基础与进阶高性能 Netty 框架MySQL并发编程进阶JVM 性能调优Tomacat注意:以下…...

TrollInstallerX终极指南:iOS 14.0-16.6.1一键安装TrollStore的完整教程

TrollInstallerX终极指南:iOS 14.0-16.6.1一键安装TrollStore的完整教程 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否厌倦了iOS系统的种种限制&…...

卡梅德生物技术快报|多肽库筛选:基于全质粒 PCR 的噬菌体文库构建与小分子表位淘选实战

正文摘要本文面向生物研发、实验技术、噬菌体展示方向开发者,系统讲解多肽库筛选完整流程:从问题分析、瓶颈定位、实验方案设计到质控与结果输出,提供可复现的技术方案与关键参数。内容基于真实学位论文研究,聚焦高库容、高多样性…...

跟着 MDN 学CSS day_7:(层叠优先级与继承)

CSS的全称是层叠样式表(Cascading Style Sheets),其中"层叠"这个词绝非随意选用的。理解层叠、优先级和继承这三个核心概念,是真正掌握CSS的关键所在。当你发现某个样式没有按预期生效时,十有八九是这三个机…...

STM32F407VET6现货

随着科技的发展,越来越多的应用场景需要更强大的处理能力、更丰富的外设支持以及更高的性价比。STM32F407VET6作为意法半导体(STMicroelectronics)旗下的一款高性能微控制器,在工业自动化、医疗设备、家用电器等多个领域展现出了卓…...

免费屏幕标注神器gInk:让你的演示和教学更加生动高效的完整指南

免费屏幕标注神器gInk:让你的演示和教学更加生动高效的完整指南 【免费下载链接】gInk An easy to use on-screen annotation software inspired by Epic Pen. 项目地址: https://gitcode.com/gh_mirrors/gi/gInk 还在为在线会议时无法直观标注屏幕内容而烦恼…...

Windows热键冲突终极指南:如何用Hotkey Detective快速定位“键盘小偷“

Windows热键冲突终极指南:如何用Hotkey Detective快速定位"键盘小偷" 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey…...

多模型选型实验场景下Taotoken模型广场的价值与应用

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 多模型选型实验场景下Taotoken模型广场的价值与应用 在模型技术快速迭代的今天,无论是学术研究还是产品开发&#xff0…...

写给前端的 CANN-AscendSiPBoost:昇腾信号处理加速库到底是啥?

写给前端的 CANN-AscendSiPBoost:昇腾信号处理加速库到底是啥? 之前有兄弟做音频处理,问我:“哥,昇腾上有没有信号处理的加速库?FFT、滤波这些。” 好问题。今天一次说清楚。 AscendSiPBoost 是啥&#xff…...

Windows平台苹果USB网络共享驱动自动化部署方案

Windows平台苹果USB网络共享驱动自动化部署方案 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_mirrors/ap/Apple-Mob…...

FlashAttention 反向传播:删掉 O(N²) 的中间结果,怎么还能算对梯度?

FlashAttention 反向传播:删掉 O(N) 的中间结果,怎么还能算对梯度? 之前有人跟我争:FlashAttention 反向传播不存注意力矩阵,那梯度从哪来?你前向传播的时候 Softmax 的分母、分子都扔了,反向传…...

【Lovable前端黄金标准】:基于87万行生产代码分析出的4项可量化体验指标及达标路径

更多请点击: https://intelliparadigm.com 第一章:Lovable前端黄金标准的提出背景与核心价值 在现代Web应用复杂度持续攀升、用户期望指数级增长的背景下,前端开发已从“功能可用”迈向“体验可感、情感可触”的新阶段。传统以性能、兼容性、…...

【全新 v 2.7.5 版本】Open Claw 本地环境一键部署教程

前言 2026 年开源圈爆火的「数字员工」OpenClaw(昵称小龙虾),GitHub 星标狂揽 28 万 ,凭「本地运行 零代码操作 自动干活」的核心优势圈粉无数!很多人误以为它是普通聊天 AI,实则是能真正操控电脑的自动…...

意法半导体STM32F407VET6代理商

在当今快速发展的电子行业中,选择一家可靠且专业的微控制器(MCU)供应商至关重要。对于那些正在寻找意法半导体STM32F407VET6系列单片机解决方案的企业而言,深圳市粤科源兴科技有限公司凭借其优质的服务、合理的价格及充足的库存量…...