文章目录
-
- 一、前言
-
- [1.1 技术背景](#1.1 技术背景)
- [1.2 本文目标](#1.2 本文目标)
- [1.3 技术栈](#1.3 技术栈)
- 二、环境准备
-
- [2.1 硬件准备](#2.1 硬件准备)
- [2.2 软件安装](#2.2 软件安装)
-
- [2.2.1 安装RT-Thread Studio](#2.2.1 安装RT-Thread Studio)
- [2.2.2 安装STM32CubeMX](#2.2.2 安装STM32CubeMX)
- [2.2.3 安装串口驱动](#2.2.3 安装串口驱动)
- [2.3 环境配置验证](#2.3 环境配置验证)
- 三、项目创建与配置
-
- [3.1 使用STM32CubeMX生成基础工程](#3.1 使用STM32CubeMX生成基础工程)
-
- [3.1.1 创建新工程](#3.1.1 创建新工程)
- [3.1.2 配置时钟](#3.1.2 配置时钟)
- [3.1.3 配置GPIO](#3.1.3 配置GPIO)
- [3.1.4 生成代码](#3.1.4 生成代码)
- [3.2 在RT-Thread Studio中导入工程](#3.2 在RT-Thread Studio中导入工程)
-
- [3.2.1 创建RT-Thread项目](#3.2.1 创建RT-Thread项目)
- [3.2.2 项目结构说明](#3.2.2 项目结构说明)
- 四、核心实现
-
- [4.1 配置RT-Thread内核](#4.1 配置RT-Thread内核)
-
- [4.1.1 使用menuconfig配置](#4.1.1 使用menuconfig配置)
- [4.1.2 配置rtconfig.h](#4.1.2 配置rtconfig.h)
- [4.2 实现LED设备驱动](#4.2 实现LED设备驱动)
-
- [4.2.1 创建设备驱动文件](#4.2.1 创建设备驱动文件)
- [4.3 实现LED闪烁任务](#4.3 实现LED闪烁任务)
-
- [4.3.1 创建LED任务文件](#4.3.1 创建LED任务文件)
- [4.4 实现主程序](#4.4 实现主程序)
-
- [4.4.1 修改主函数](#4.4.1 修改主函数)
- [4.5 系统架构流程图](#4.5 系统架构流程图)
- 五、编译与下载
-
- [5.1 编译工程](#5.1 编译工程)
- [5.2 下载程序](#5.2 下载程序)
- [5.3 查看运行结果](#5.3 查看运行结果)
- 六、故障排查与问题解决
-
- [6.1 编译错误](#6.1 编译错误)
-
- 问题1:找不到头文件
- [问题2:链接错误(undefined reference)](#问题2:链接错误(undefined reference))
- [6.2 运行时错误](#6.2 运行时错误)
- [6.3 调试技巧](#6.3 调试技巧)
- 七、进阶扩展
-
- [7.1 多任务LED控制](#7.1 多任务LED控制)
- [7.2 使用信号量同步](#7.2 使用信号量同步)
- 八、总结
-
- [8.1 核心知识点回顾](#8.1 核心知识点回顾)
- [8.2 扩展学习方向](#8.2 扩展学习方向)
- [8.3 学习资源](#8.3 学习资源)
一、前言
1.1 技术背景
在嵌入式开发领域,STM32系列微控制器凭借其强大的性能、丰富的外设资源和完善的生态系统,成为了工业控制、消费电子、物联网等领域的首选平台。然而,传统的裸机开发方式在面对复杂应用时,往往面临代码耦合度高、可维护性差、实时性难以保证等问题。
RT-Thread是一款国产开源实时操作系统(RTOS),具有组件丰富、可裁剪、占用资源少等特点。它为STM32开发带来了多任务调度、设备驱动框架、组件生态等诸多优势,能够显著提升开发效率和系统稳定性。
1.2 本文目标
通过本教程,你将学会:
- RT-Thread开发环境的搭建
- STM32CubeMX与RT-Thread Studio的协同使用
- 基于RT-Thread的多任务编程
- LED闪烁任务的实现与调度
1.3 技术栈
硬件平台:
- STM32F103C8T6(最小系统板)
- ST-Link V2调试器
- USB转TTL串口模块
软件环境:
- RT-Thread Studio v2.2.0+
- STM32CubeMX v6.8.0+
- RT-Thread v4.1.0+
二、环境准备
2.1 硬件准备
| 设备 | 数量 | 说明 |
|---|---|---|
| STM32F103C8T6最小系统板 | 1块 | 主控芯片 |
| ST-Link V2 | 1个 | 程序下载与调试 |
| USB转TTL模块 | 1个 | 串口输出 |
| LED灯 | 1个 | PC13引脚 |
| 杜邦线 | 若干 | 连接使用 |
硬件连接图:
ST-Link V2 STM32F103C8T6
VCC ─────────── 3.3V
GND ─────────── GND
SWDIO ─────────── PA13
SWCLK ─────────── PA14
USB-TTL STM32F103C8T6
TXD ─────────── PA10 (USART1_RX)
RXD ─────────── PA9 (USART1_TX)
GND ─────────── GND
2.2 软件安装
2.2.1 安装RT-Thread Studio
Windows系统:
- 访问RT-Thread官网下载页面:https://www.rt-thread.org/studio.html
- 下载最新版本的RT-Thread Studio安装包
- 双击安装程序,按向导完成安装
- 安装完成后,启动RT-Thread Studio
验证安装:
bash
# 打开RT-Thread Studio后,查看Help -> About
# 确认版本号为 v2.2.0 或更高
2.2.2 安装STM32CubeMX
- 访问ST官网:https://www.st.com/en/development-tools/stm32cubemx.html
- 下载并安装STM32CubeMX
- 安装完成后,下载STM32F1系列的HAL库包
2.2.3 安装串口驱动
根据你的USB转TTL模块芯片型号(如CH340、CP2102、FT232等),安装对应的驱动程序。
验证串口驱动:
设备管理器 -> 端口(COM和LPT)
应能看到类似 "USB-SERIAL CH340 (COM3)" 的设备
2.3 环境配置验证
验证RT-Thread Studio:
- 打开RT-Thread Studio
- 点击
File -> New -> RT-Thread Project - 如果能正常创建项目,说明环境配置正确
验证ST-Link:
- 连接ST-Link到电脑
- 在RT-Thread Studio中,点击
Window -> Show View -> Device Manager - 应能看到连接的ST-Link设备
三、项目创建与配置
3.1 使用STM32CubeMX生成基础工程
3.1.1 创建新工程
- 打开STM32CubeMX
- 点击
File -> New Project - 在MCU选择器中搜索 "STM32F103C8T6"
- 选择芯片,点击
Start Project
3.1.2 配置时钟
- 点击
Clock Configuration标签 - 配置系统时钟为72MHz:
- HSE:8MHz(外部晶振)
- PLL倍频:9倍
- SYSCLK:72MHz
- HCLK:72MHz
- PCLK1:36MHz
- PCLK2:72MHz
3.1.3 配置GPIO
- 点击
Pinout & Configuration标签 - 配置PC13为GPIO_Output(板载LED)
- 配置PA9、PA10为USART1(串口通信)
引脚配置:
PC13: GPIO_Output, 初始状态High, 推挽输出
PA9: USART1_TX, 默认配置
PA10: USART1_RX, 默认配置
3.1.4 生成代码
- 点击
Project -> Settings - 设置工程名称和路径
- Toolchain/IDE选择
MDK-ARM或STM32CubeIDE - 点击
Generate Code
3.2 在RT-Thread Studio中导入工程
3.2.1 创建RT-Thread项目
- 打开RT-Thread Studio
- 点击
File -> New -> RT-Thread Project - 选择
Based on STM32CubeMX configuration - 导入刚才生成的.ioc文件
- 选择RT-Thread版本(推荐v4.1.0+)
- 完成项目创建
3.2.2 项目结构说明
📄 项目目录结构:
rt-thread-stm32-led/
├── applications/ # 应用层代码
│ └── main.c # 主程序入口
├── drivers/ # 驱动层
│ └── board.c # 板级初始化
├── libraries/ # HAL库
├── rt-thread/ # RT-Thread内核
│ ├── components/ # 组件
│ ├── include/ # 头文件
│ └── src/ # 内核源码
├── packages/ # 软件包
├── rtconfig.h # RT-Thread配置
└── SConstruct # 构建脚本
四、核心实现
4.1 配置RT-Thread内核
4.1.1 使用menuconfig配置
- 在RT-Thread Studio中,右键点击项目
- 选择
RT-Thread -> RT-Thread Settings - 或者使用快捷键
Ctrl + Alt + S
关键配置项:
RT-Thread Kernel -->
[*] Enable RT-Thread Kernel
(128) the maximal size of kernel object name
(512) the stack size of main thread
(24) size of thread stack
(8) size of message queue
RT-Thread Components -->
[*] Enable libc APIs
[*] Enable POSIX layer
Device Drivers -->
[*] Using UART device drivers
[*] Using GPIO device drivers
[*] Using PIN device drivers
4.1.2 配置rtconfig.h
📝 修改文件:
rtconfig.h
c
/* RT-Thread内核配置 */
#define RT_NAME_MAX 8
#define RT_ALIGN_SIZE 4
#define RT_THREAD_PRIORITY_MAX 32
#define RT_TICK_PER_SECOND 1000
/* 内核对象配置 */
#define RT_USING_SEMAPHORE
#define RT_USING_MUTEX
#define RT_USING_EVENT
#define RT_USING_MAILBOX
#define RT_USING_MESSAGEQUEUE
/* 内存管理配置 */
#define RT_USING_MEMPOOL
#define RT_USING_HEAP
/* 设备驱动配置 */
#define RT_USING_DEVICE
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 256
#define RT_CONSOLE_DEVICE_NAME "uart1"
/* 组件配置 */
#define RT_USING_COMPONENTS_INIT
#define RT_USING_USER_MAIN
#define RT_MAIN_THREAD_STACK_SIZE 2048
#define RT_MAIN_THREAD_PRIORITY 10
4.2 实现LED设备驱动
4.2.1 创建设备驱动文件
📄 创建文件:
drivers/drv_led.c
c
/*
* drv_led.c - LED设备驱动
*
* 功能:
* - 初始化PC13引脚(板载LED)
* - 提供LED开关控制接口
* - 支持RT-Thread设备框架
*/
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
/* LED引脚定义 */
#define LED_PIN GET_PIN(C, 13)
/* LED设备结构体 */
struct led_device
{
struct rt_device parent;
rt_uint8_t status;
};
static struct led_device led_dev;
/* LED初始化函数 */
static rt_err_t led_init(rt_device_t dev)
{
/* 配置PC13为输出模式 */
rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
/* 初始状态:熄灭(PC13低电平点亮) */
rt_pin_write(LED_PIN, PIN_HIGH);
led_dev.status = 0;
rt_kprintf("LED device initialized\\n");
return RT_EOK;
}
/* LED控制函数 */
static rt_err_t led_control(rt_device_t dev, int cmd, void *args)
{
switch (cmd)
{
case 0: /* 熄灭LED */
rt_pin_write(LED_PIN, PIN_HIGH);
led_dev.status = 0;
break;
case 1: /* 点亮LED */
rt_pin_write(LED_PIN, PIN_LOW);
led_dev.status = 1;
break;
case 2: /* 翻转LED */
rt_pin_write(LED_PIN, led_dev.status ? PIN_LOW : PIN_HIGH);
led_dev.status = !led_dev.status;
break;
default:
return -RT_ERROR;
}
return RT_EOK;
}
/* LED设备注册 */
int led_device_init(void)
{
rt_err_t result;
/* 设置设备操作函数 */
led_dev.parent.init = led_init;
led_dev.parent.open = RT_NULL;
led_dev.parent.close = RT_NULL;
led_dev.parent.read = RT_NULL;
led_dev.parent.write = RT_NULL;
led_dev.parent.control = led_control;
/* 注册设备 */
result = rt_device_register(&led_dev.parent, "led",
RT_DEVICE_FLAG_RDWR);
if (result != RT_EOK)
{
rt_kprintf("LED device register failed!\\n");
return -RT_ERROR;
}
/* 初始化设备 */
led_init(&led_dev.parent);
return RT_EOK;
}
/* 自动初始化 */
INIT_DEVICE_EXPORT(led_device_init);
📄 创建文件:
drivers/drv_led.h
c
/*
* drv_led.h - LED设备驱动头文件
*/
#ifndef __DRV_LED_H__
#define __DRV_LED_H__
#include <rtthread.h>
/* LED控制命令 */
#define LED_CMD_OFF 0
#define LED_CMD_ON 1
#define LED_CMD_TOGGLE 2
/* LED设备初始化 */
int led_device_init(void);
#endif /* __DRV_LED_H__ */
4.3 实现LED闪烁任务
4.3.1 创建LED任务文件
📄 创建文件:
applications/led_task.c
c
/*
* led_task.c - LED闪烁任务实现
*
* 功能:
* - 创建LED闪烁线程
* - 实现周期性LED翻转
* - 支持任务挂起和恢复
*/
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
/* 线程配置 */
#define LED_THREAD_STACK_SIZE 512
#define LED_THREAD_PRIORITY 15
#define LED_THREAD_TIMESLICE 10
/* 闪烁周期(毫秒) */
#define LED_BLINK_PERIOD 500
/* LED线程控制块 */
static struct rt_thread led_thread;
static rt_uint8_t led_thread_stack[LED_THREAD_STACK_SIZE];
/* LED设备句柄 */
static rt_device_t led_device = RT_NULL;
/* LED线程入口函数 */
static void led_thread_entry(void *parameter)
{
rt_err_t result;
rt_tick_t tick_start, tick_end;
RT_UNUSED(parameter);
/* 查找LED设备 */
led_device = rt_device_find("led");
if (led_device == RT_NULL)
{
rt_kprintf("LED device not found!\\n");
return;
}
rt_kprintf("LED task started, blink period: %d ms\\n", LED_BLINK_PERIOD);
while (1)
{
tick_start = rt_tick_get();
/* 翻转LED状态 */
result = rt_device_control(led_device, 2, RT_NULL);
if (result != RT_EOK)
{
rt_kprintf("LED control failed!\\n");
}
/* 计算下一次唤醒时间,确保周期准确 */
tick_end = rt_tick_get();
rt_thread_delay(LED_BLINK_PERIOD - (tick_end - tick_start) * 1000 / RT_TICK_PER_SECOND);
}
}
/* 初始化LED任务 */
int led_task_init(void)
{
rt_err_t result;
/* 初始化线程 */
result = rt_thread_init(&led_thread,
"led_blink",
led_thread_entry,
RT_NULL,
&led_thread_stack[0],
LED_THREAD_STACK_SIZE,
LED_THREAD_PRIORITY,
LED_THREAD_TIMESLICE);
if (result != RT_EOK)
{
rt_kprintf("LED thread init failed!\\n");
return -RT_ERROR;
}
/* 启动线程 */
result = rt_thread_startup(&led_thread);
if (result != RT_EOK)
{
rt_kprintf("LED thread startup failed!\\n");
return -RT_ERROR;
}
rt_kprintf("LED task initialized successfully\\n");
return RT_EOK;
}
/* 导出到自动初始化 */
INIT_APP_EXPORT(led_task_init);
/* MSH命令:手动控制LED */
static void led_cmd(int argc, char *argv[])
{
rt_device_t dev;
int cmd;
dev = rt_device_find("led");
if (dev == RT_NULL)
{
rt_kprintf("LED device not found!\\n");
return;
}
if (argc < 2)
{
rt_kprintf("Usage: led <on|off|toggle>\\n");
return;
}
if (rt_strcmp(argv[1], "on") == 0)
cmd = 1;
else if (rt_strcmp(argv[1], "off") == 0)
cmd = 0;
else if (rt_strcmp(argv[1], "toggle") == 0)
cmd = 2;
else
{
rt_kprintf("Unknown command: %s\\n", argv[1]);
return;
}
rt_device_control(dev, cmd, RT_NULL);
}
MSH_CMD_EXPORT(led_cmd, LED control command);
4.4 实现主程序
4.4.1 修改主函数
📝 修改文件:
applications/main.c
c
/*
* main.c - 主程序入口
*
* 功能:
* - 系统初始化
* - 串口输出系统信息
* - 进入主循环
*/
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
/* 版本信息 */
#define FIRMWARE_VERSION "1.0.0"
#define BUILD_DATE __DATE__
#define BUILD_TIME __TIME__
int main(void)
{
rt_kprintf("\\n");
rt_kprintf("========================================\\n");
rt_kprintf(" RT-Thread LED Demo\\n");
rt_kprintf(" Firmware Version: %s\\n", FIRMWARE_VERSION);
rt_kprintf(" Build Date: %s %s\\n", BUILD_DATE, BUILD_TIME);
rt_kprintf("========================================\\n");
rt_kprintf("\\n");
/* 输出系统信息 */
rt_kprintf("System Information:\\n");
rt_kprintf(" Kernel Version: %s\\n", RTTHREAD_VERSION);
rt_kprintf(" CPU Frequency: %d Hz\\n", SystemCoreClock);
rt_kprintf(" Tick Frequency: %d Hz\\n", RT_TICK_PER_SECOND);
rt_kprintf("\\n");
rt_kprintf("LED task is running...\\n");
rt_kprintf("Use 'led <on|off|toggle>' to control LED\\n");
rt_kprintf("\\n");
/* 主循环 */
while (1)
{
/* 系统空闲处理 */
rt_thread_mdelay(1000);
}
return RT_EOK;
}
4.5 系统架构流程图
led on
led off
led toggle
系统启动
Bootloader引导
RT-Thread内核初始化
板级初始化
drv_led.c
LED设备初始化
led_device_init
应用层初始化
led_task.c
创建LED线程
led_thread_entry
启动调度器
主线程运行
main.c
LED线程运行
周期性翻转
用户命令
翻转LED状态
点亮LED
熄灭LED
rt_device_control
rt_pin_write
GPIO寄存器操作
LED状态改变
五、编译与下载
5.1 编译工程
- 在RT-Thread Studio中,右键点击项目
- 选择
Build Project或按Ctrl + B - 等待编译完成
编译输出:
Building target: rt-thread-stm32-led.elf
Invoking: Cross ARM C Linker
...
Finished building target: rt-thread-stm32-led.elf
Build complete. 0 errors, 0 warnings.
5.2 下载程序
- 连接ST-Link到STM32开发板
- 在RT-Thread Studio中,点击工具栏的下载按钮
- 或右键项目选择
Download
下载成功提示:
Downloading...
Programming...
Verify...
Download complete!
5.3 查看运行结果
- 打开串口调试助手(如SecureCRT、XShell、SSCOM等)
- 配置串口参数:
- 波特率:115200
- 数据位:8
- 停止位:1
- 校验:无
- 打开对应的COM口
预期输出:
========================================
RT-Thread LED Demo
Firmware Version: 1.0.0
Build Date: Apr 13 2026
========================================
System Information:
Kernel Version: 4.1.0
CPU Frequency: 72000000 Hz
Tick Frequency: 1000 Hz
LED task is running...
Use 'led <on|off|toggle>' to control LED
LED device initialized
LED task initialized successfully
观察现象:
- 板载LED(PC13)以500ms为周期闪烁
- 在MSH命令行输入
led on可点亮LED - 输入
led off可熄灭LED - 输入
led toggle可翻转LED状态
六、故障排查与问题解决
6.1 编译错误
问题1:找不到头文件
错误现象:
fatal error: rtthread.h: No such file or directory
#include <rtthread.h>
^~~~~~~~~~~~~
原因分析:
- RT-Thread Studio未正确安装
- 项目配置中头文件路径设置错误
- 工程文件损坏
解决方案:
方案1:检查项目配置
项目右键 -> Properties -> C/C++ General -> Paths and Symbols
确认包含路径中有RT-Thread头文件目录
方案2:重新生成工程
1. 删除项目(保留文件)
2. 重新导入工程
3. 执行 Clean Project 后重新编译
方案3:检查RT-Thread Studio安装
Help -> RT-Thread Studio -> Check for Updates
确保SDK包已正确安装
问题2:链接错误(undefined reference)
错误现象:
undefined reference to `rt_thread_init'
undefined reference to `rt_device_control'
原因分析:
- 未正确链接RT-Thread库
- 某些组件未在menuconfig中启用
- 函数声明与定义不匹配
解决方案:
方案1:检查组件配置
RT-Thread Settings -> Kernel ->
确保启用了以下选项:
[*] Enable RT-Thread Kernel
[*] Enable message queue
[*] Enable semaphore
方案2:检查函数签名
c
// 确保函数声明与RT-Thread API一致
rt_err_t rt_thread_init(struct rt_thread *thread,
const char *name,
void (*entry)(void *parameter),
void *parameter,
void *stack_start,
rt_uint32_t stack_size,
rt_uint8_t priority,
rt_uint32_t tick);
6.2 运行时错误
问题3:LED不闪烁
错误现象:
- 程序下载成功,但LED不闪烁
- 串口无输出或输出异常
原因分析:
- LED引脚配置错误
- 时钟配置不正确
- 线程未正确创建或启动
排查步骤:
步骤1:检查硬件连接
确认PC13引脚与LED连接正确
确认LED极性(PC13低电平点亮)
步骤2:验证GPIO配置
c
// 在drv_led.c中添加调试输出
rt_kprintf("LED_PIN = %d\\n", LED_PIN);
rt_kprintf("Pin mode: %d\\n", PIN_MODE_OUTPUT);
步骤3:检查线程状态
在MSH中输入:list_thread
查看led_blink线程是否存在且状态为running
解决方案:
c
// 确保引脚定义正确
#define LED_PIN GET_PIN(C, 13) // PC13
// 检查引脚模式
rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
// 手动测试GPIO
rt_pin_write(LED_PIN, PIN_LOW); // 点亮
rt_thread_mdelay(1000);
rt_pin_write(LED_PIN, PIN_HIGH); // 熄灭
问题4:串口无输出
错误现象:
- 程序运行,但串口调试助手无显示
- 输出乱码
原因分析:
- 波特率设置不匹配
- 串口引脚配置错误
- 串口驱动未正确初始化
排查步骤:
步骤1:检查串口配置
确认USART1配置:
- 波特率:115200
- PA9: TX, PA10: RX
步骤2:验证时钟配置
c
// 在main.c中添加时钟检查
rt_kprintf("SystemCoreClock = %d\\n", SystemCoreClock);
// 应输出 72000000
步骤3:检查串口驱动
RT-Thread Settings -> Device Drivers ->
[*] Using UART device drivers
[*] Using serial device drivers
解决方案:
c
// 检查串口设备是否存在
rt_device_t console = rt_device_find("uart1");
if (console == RT_NULL)
{
// 尝试初始化串口
rt_hw_usart_init();
}
6.3 调试技巧
使用RT-Thread Shell(MSH)
RT-Thread提供了强大的命令行调试工具:
bash
# 查看所有线程
list_thread
# 查看定时器
list_timer
# 查看内存使用
list_mem
# 查看设备
list_device
# 查看信号量
list_sem
# 查看互斥量
list_mutex
使用日志输出
c
// 不同级别的日志
LOG_E("Error message"); // 错误
LOG_W("Warning message"); // 警告
LOG_I("Info message"); // 信息
LOG_D("Debug message"); // 调试
// 使用rt_kprintf
rt_kprintf("Variable value: %d\\n", var);
使用断点调试
- 在RT-Thread Studio中,双击代码行号设置断点
- 点击
Debug按钮启动调试 - 使用快捷键:
- F5:继续运行
- F6:单步跳过
- F7:单步进入
- F8:单步返回
七、进阶扩展
7.1 多任务LED控制
可以创建多个LED任务,实现不同的闪烁模式:
c
/* 快速闪烁任务 */
static void led_fast_thread_entry(void *parameter)
{
while (1)
{
rt_device_control(led_device, 2, RT_NULL);
rt_thread_mdelay(100); // 100ms周期
}
}
/* 慢速闪烁任务 */
static void led_slow_thread_entry(void *parameter)
{
while (1)
{
rt_device_control(led_device, 2, RT_NULL);
rt_thread_mdelay(1000); // 1s周期
}
}
7.2 使用信号量同步
c
/* 定义信号量 */
static struct rt_semaphore led_sem;
/* LED控制线程 */
static void led_control_thread_entry(void *parameter)
{
while (1)
{
/* 等待信号量 */
rt_sem_take(&led_sem, RT_WAITING_FOREVER);
/* 翻转LED */
rt_device_control(led_device, 2, RT_NULL);
}
}
/* 定时发布信号量 */
static void led_timer_callback(void *parameter)
{
rt_sem_release(&led_sem);
}
八、总结
8.1 核心知识点回顾
- RT-Thread开发环境:掌握RT-Thread Studio的使用,了解工程结构和配置方法
- 设备驱动框架:学会使用RT-Thread的设备驱动框架,实现GPIO设备的注册和控制
- 多任务编程:理解RT-Thread的线程管理,掌握线程创建、调度和同步
- 调试技巧:熟练使用MSH命令行、日志输出和断点调试
8.2 扩展学习方向
- RT-Thread组件:学习使用文件系统、网络协议栈、GUI等高级组件
- 设备驱动开发:深入学习I2C、SPI、UART等外设驱动开发
- 实时系统原理:理解任务调度算法、中断管理、内存管理等核心概念
- 低功耗设计:学习STM32的低功耗模式和RT-Thread的电源管理
8.3 学习资源
官方文档:
官方GitHub:
STM32官方资源: