RT-Thread Nano源码浅析

5k words

一、了解源码

从官方下载到RT-Thread Nano源码目录如下图所示

![RT源码文件夹](D:\个人文档\blog\RT-Thread Nano源码浅析\RT源码文件夹.png)

1、bsp文件夹

bsp文件夹里面存放的是板级支持包(board support package),用于存放RT-Thread为各种半导体厂商的评估板写好的驱动程序,其中重要的主要是两个文件

  • board.c:RT-Thread用来初始化开发板硬件的相关函数;
  • rtconfig.h:RT-Thread功能的配置头文件,可以裁剪RT-Thread的功能;

2、components文件夹

其它第三方加进来的组件,比如gui、fatfs、lwip和finsh等。nano版本只放了finsh,是RT- Thread组件里面最具特色的,它通过串口打印的方式来输出各种信息,方便我们调试程序。

3、docs文件夹

其他文件

4、include文件夹

include目录下面存放的是RT-Thread内核的头文件,是内核不可分割的一部分。

5、libcpu文件夹

存放软件和硬件的接口文件,通常由汇编和C联合编写。

6、src文件夹

src目录下面存放的是RT-Thread内核的源文件,是内核的核心

二、官方移植

1、修改board.c文件

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
* Copyright (c) 2006-2019, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-05-24 the first version
*/

#include <rthw.h>
#include <rtthread.h>
#include "main.h"

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
/*
* Please modify RT_HEAP_SIZE if you enable RT_USING_HEAP
* the RT_HEAP_SIZE max value = (sram size - ZI size), 1024 means 1024 bytes
*/
#define RT_HEAP_SIZE (15*1024)
static rt_uint8_t rt_heap[RT_HEAP_SIZE];

RT_WEAK void *rt_heap_begin_get(void)
{
return rt_heap;
}

RT_WEAK void *rt_heap_end_get(void)
{
return rt_heap + RT_HEAP_SIZE;
}
#endif

void SysTick_Handler(void)
{
/* 进入中断 */
rt_interrupt_enter();
/* 更新时基 */
rt_tick_increase();
/* 离开中断 */
rt_interrupt_leave();
}
/**
* This function will initial your board.
*/
void rt_hw_board_init(void)
{
/* 添加HAL初始化、时钟配置、滴答时钟配置 */
extern void SystemClock_Config(void);
HAL_Init();
SystemClock_Config();
SystemCoreClockUpdate();
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/RT_TICK_PER_SECOND);


/* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
rt_components_board_init();
#endif

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}

#ifdef RT_USING_CONSOLE

static int uart_init(void)
{
#error "TODO 2: Enable the hardware uart and config baudrate."
return 0;
}
INIT_BOARD_EXPORT(uart_init);

void rt_hw_console_output(const char *str)
{
#error "TODO 3: Output the string 'str' through the uart."
}

#endif

2、修改rtconfig.h文件

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#ifndef __RTTHREAD_CFG_H__
#define __RTTHREAD_CFG_H__



/*----------------------------------------------------------------------------*/
/* 配置启用标志(一般用 #define 或 #undef) */

/* 表示RT-Thread支持libc函数(标准库) */
#define RT_USING_LIBC

/* 表示RT-Thread支持的最大优先级数目,取值范围为8-256,默认为32 */
#define RT_THREAD_PRIORITY_MAX 8

/* 表示操作系统每秒的 tick 数,系统时钟周期为 1ms */
#define RT_TICK_PER_SECOND 1000

/*----------------------------------------------------------------------------*/
/* 内核配置选项(一般用 #define 或 #undef) */

/* CPU 数据对齐字节数,默认为 4 */
#define RT_ALIGN_SIZE 4
/* 内核对象名称最大长度,默认为 8 */
#define RT_NAME_MAX 8
/* 使用 RT-Thread 组件初始化,启用 */
#define RT_USING_COMPONENTS_INIT
/* 使用用户 main 函数,启用 */
#define RT_USING_USER_MAIN
/*----------------------------------------------------------------------------*/
/* 线程配置(main 线程) */

/* main 线程栈大小,默认为 512 */
#define RT_MAIN_THREAD_STACK_SIZE 256
/*----------------------------------------------------------------------------*/
/* 调试配置 */

/* 内核调试启用(建议设为 0) */
//#define RT_DEBUG
/* 初始化调试启用(默认关闭) */
#define RT_DEBUG_INIT 0
/* 线程栈溢出检查启用 */
//#define RT_USING_OVERFLOW_CHECK
/*----------------------------------------------------------------------------*/
/* 钩子配置(用于调试,可选) */

/* 钩子函数启用 */
//#define RT_USING_HOOK
/* 空闲线程钩子启用 */
//#define RT_USING_IDLE_HOOK
/*----------------------------------------------------------------------------*/
/* 定时器配置(可选) */

/* 使用软件延时(默认关闭) */
#define RT_USING_TIMER_SOFT 0
#if RT_USING_TIMER_SOFT == 0
#undef RT_USING_TIMER_SOFT
#endif

#define RT_TIMER_THREAD_PRIO 4

#define RT_TIMER_THREAD_STACK_SIZE 512
/*----------------------------------------------------------------------------*/
/* 内部通信配置,包括信号量、互斥量、事件、邮箱和消息队列,根据需要配置 */

//#define RT_USING_SEMAPHORE /* 信号量*/
//#define RT_USING_MUTEX /* 互斥量 */
//#define RT_USING_EVENT /* 事件 */
//#define RT_USING_SIGNALS /* 信号 */
//#define RT_USING_MAILBOX /* 邮箱 */
//#define RT_USING_MESSAGEQUEUE /* 消息队列 */

/*----------------------------------------------------------------------------*/
/* 内存配置(可选) */

/* 是否使用内存池 */
//#define RT_USING_MEMPOOL

/* 是否使用动态内存堆 */
//#define RT_USING_HEAP

/* 是否使用小内存 */
//#define RT_USING_SMALL_MEM
#define RT_USING_SMALL_MEM_AS_HEAP

/* 示是否使用极小内存 */
//#define RT_USING_TINY_SIZE
/*----------------------------------------------------------------------------*/
/* 控制台配置(用于调试输出) */

/* 是否使用控制台(调试接口) */
//#define RT_USING_CONSOLE
/* 控制台缓冲区大小,默认为 256 */
#define RT_CONSOLEBUF_SIZE 256
/*----------------------------------------------------------------------------*/
/* 驱动与设备配置(可选) */

/* 使用设备驱动接口 */
//#define RT_USING_DEVICE
/*----------------------------------------------------------------------------*/
/* 系统启动与运行配置(可选) */


/* 控制台提供 FINSH 命令行支持 */
//#include "finsh_config.h"


#endif