rt-thread 软件安装

image-20251111101408200

image-20251111101443293

rt-thread 软件配置

  • 在项目页面,我们可以点击红框的图标,这是rt-thread 的SDK下载链接,里面包含有rt-thread 系统,芯片BSP库,开发板库等。

  • 如下图,我按需下载了rt-thread 的系统库与STM32BSP库,即可在rt-thread 上开发STM32

image-20251111101534311

image-20251111101610919

rt-thread 新建项目

  • 新建一个rt-thread 项目我们需要点开左上角的文件,然后选择rt-thread 或者NANO项目

image-20251111101712878

  • 这里我们可以基于芯片,比如STM32F103C8T6来创建rt-thread 项目,rt-thread 会默认占用一组串口做调试交互控制台,一般我们会保持默认选择

image-20251111101820851

  • 新建工程的目录如图片左边所示,下面的表格是目录功能的说明
目录 说明
applications 用户代码所在目录
driver RT-Thread 的硬件驱动api
libraries 芯片的BSP库
linkscripts 空间链接脚本
packages 第三方功能包
rt-thread rtt 内核

image-20251111101951739

  • 首先第一件事就是更改时钟配置,在board.c硬件初始化函数可以看到,初始化时要选择时钟,这部分可以在cubemx看到图形化配置时钟的界面。

image-20251111102045260

  • 点进去我们就会在board.h里看到时钟默认时HSI内部时钟,一般我们都会选HSE外部高速8Mhz的时钟,然后倍频到72Mhz

image-20251111102604313

​ 使用外部HSE (8 MHz 外部晶振),经 PLL得到 72 MHz

  • board.c开头有个RT_WEAK,这是rt-thread 官方对C语言弱函数定义weak的二次封装,不过大写版本已经被弃用了,我们需要手动改为小写的rt_weak就可以了,否则编译会报错。

image-20251111102820182

  • 下图红框区域就是编译与下载按键

image-20251111103105998

  • 在上方窗口选项卡可以把终端窗口选项打开,下方多功能区就会多出终端,使用终端可以打开rt-thread 的调试交互控制台,通过log可以看到rt-thread 已经运行起来了

image-20251111103414237

image-20251111103334155

rt-thread 建立线程

  • rt-thread 的学习还是要看rt-thread 官方的文档,可以点击链接查看学习:RT-Thread 文档中心

image-20251111103625138

  • rt-thread 的线程APIfreertos类似,都是调用线程函数,然后实现句柄,函数,优先级与时间片定义等,然后启动线程即可,可把下方代码覆盖main测试。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
* Copyright (c) 2006-2025, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2025-11-11 RT-Thread first version
*/

#include <rtthread.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

/* 使用静态线程时,线程的栈需要设置字节对齐 */
rt_align(RT_ALIGN_SIZE)

#define THREAD_STACK_SIZE_256 256
#define THREAD_PRIORITY_5 5
#define THREAD_TIMESLICE_3 3

static struct rt_thread tid_test;
static rt_uint8_t thread_test_stack[THREAD_STACK_SIZE_256];
rt_uint8_t thread_test(void);

int main(void)
{
int count = 1;
thread_test();
while (count++)
{
LOG_D("Hello RT-Thread!");
rt_thread_mdelay(1000);
}

return RT_EOK;
}

static void Task_test(void *parameter)
{
rt_uint32_t count = 0;

while (1)
{
rt_kprintf("count: %d\n", count++);
rt_thread_mdelay(500);
}
}

rt_uint8_t thread_test(void)
{
/* 初始化线程 */
rt_thread_init(&tid_test, "Thread_check_save", Task_test,
RT_NULL, thread_test_stack,
THREAD_STACK_SIZE_256,
THREAD_PRIORITY_5,
THREAD_TIMESLICE_3);

/* 启动线程 */
rt_thread_startup(&tid_test);
return 0;
}

  • 通过终端,我们可以看到,maintest两个线程已经运行起来了

image-20251111105656235

freertos与rtthread最大的区别

  • rt-thread 还有很多API都在文档中心可以查看示例,freertosrtthread最大的区别,个人认为是rt-thread 进行了硬件二次抽象封装工作,提供了大量第三方库,用户大部分时候可以不用再去学习每一家MCU厂商的API,统一使用相同的rt-thread API,类似于最开始前几代Linux的思想,这样可以减少学习成本。

  • freertos只是与厂商的BSP融合,没做硬件api封装抽象工作,即多线程等操作使用freertosAPI,硬件操作继续使用MCU厂商API

  • 两种方式并没有什么好坏之分,只是使用场景不一样,rt-thread 也有很多硬件功能无法完全抽象,还是需要厂商BSPAPI来实现

image-20251111105928469

image-20251111110240866