RT-Thread Nano源码浅析

一、了解源码

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

RT-Thread Nano源码目录

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文件

/*
 * 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文件

#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

posted @ 2025-10-27 00:00  比特向阳  阅读(17)  评论(0)    收藏  举报