RT-Thread Nano源码浅析

news/2025/10/27 0:00:58/文章来源:https://www.cnblogs.com/lsksp/p/19167627

一、了解源码

从官方下载到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;
}
#endifvoid 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_INITrt_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_CONSOLEstatic 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/947150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《从 “被动听” 到 “主动学”:课堂听讲助力大学生思维成长》

阅读完三篇文章,我首先想到的就是大一到大二的学习状态变化,突然发现上学期的我可能是刚高考完的原因,脑海中还深深印刻着高中生上课必须要认真听讲的烙印。虽然上课给带手机,但是一看到老师走进教室,总是下意识地…

用AI批量生成产品视频!Python+Google Veo 3.1 API让电商转化率飙升

今天跟大家分享一个超实用的电商运营技巧:如何用Python和Google Veo 3.1 AI,把枯燥的产品图片批量变成生动的营销视频。用户原创内容(UGC)现在特别火,对销售的拉动效果非常明显,有了这个工具,你也能轻松制作大量…

关于SQLite - 世界上装机量最多的数据库

关于SQLite - 世界上装机量最多的数据库? 使用C语言开发,使得它小巧精致而高效,直接采用偏底层的语言,使用文件的逻辑,实现SQL数据库的逻辑; 使用方:包括但不限于 Python、Java、C# 等; 无服务器的,…

模拟IIC与硬件IIIC哪个更常用?

在实际项目中,两种方式都被广泛使用,但模拟IIC(软件IIC)的应用场景更多、更普遍。 下面我们来详细解释一下两者的区别、优缺点和适用场景。 硬件IIC 硬件IIC是指由微控制器内部的专用IIC外设电路来实现的。你只需要…

251019 NOIP 模拟赛 T2 | dp 及其优化、调整法最优解性质、数形结合

OJ 传送门 原题: QOJ 5500 题意 有 \(n\) 个屋子排成一列,每个屋子里一个人,每个屋子可以开酒吧。 每个人会去自己左右两侧最近的(分别)酒吧消费。 一个方案的价值为 \(\sum _ {酒吧} 来这个酒吧的人数 \times p_i…

常见问题解决 --- 未识别函数

常见问题解决 --- 未识别函数

小作业 14(2018 北京高考文科)

已知椭圆 \(M:\dfrac{x^2}{3}+y^2=1\),斜率为 \(k\) 的直线 \(l\) 与椭圆 \(M\) 有两个不同的交点 \(A\),\(B\)。设 \(P(-2,0)\),直线 \(PA\) 与椭圆 \(M\) 的另一个交点为 \(C\),直线 \(PB\) 与椭圆 \(M\) 的另一…

第六章习题

下面的机器数都以16进制表示w func1(w) func2(w)机器数 ; 值 机器数 ; 值 机器数 ; 值0000007F;127 0000007F;127 0000007F;12700000080;128 00000080;128 FFFFFF80;-128000000FF;255 000000FF;255 FFFFFFFF;-10000010…

速通 花卉鉴赏 短文

真鲜花灵感来自 P&KU3(上) 第二日《时空花园》一题。 顺带一提,我在查阅资料的时候并没有找到百度百科花钟对应 list 的一个 reference,最后在 wikipedia 里有 reference 的里面选了一些写,如果有知道的朋友可…

Agent常见模式 - 智慧园区

我希望用最直白的方式,让大家理解这四种常见的模式,并且真实商业落地和你想的可能完全相反。 模式讲解 第一种,工作流LLM 这种方式最直观,就是在你原有的工作流上插入Agent,替换掉原来代码做不了,必须人做的事请…

react-router7.9.4使用

安装 新版路由简化了安装,只需要以下命令即可 npm i react-router创建路由文件 在项目根目录下创建路由文件 src\router\index.ts import { lazy } from react import Root from ../components/root import { createH…

AI元人文:从战略能力到价值对话的实现框架

AI元人文:从战略能力到价值对话的实现框架 核心洞见:无需从零创造,“价值对话AI”可通过重构已验证的战略型AI技术基石实现。关键在于对其能力进行目标升华与伦理重塑。 一、四项核心重构架构重构:从利益博弈到价值…

Loneliness

Spending years with a group of people who are fundamentally dissimilar is loneliness. Feeling the passage of time is also so lonely. Memories and regrets can even be so lonely. The speed of time never …

Java流程控制——用户交互Scanner

Java流程控制——用户交互Scanner用户交互Scanner 使用Scanner类实现获取用户输入 Scanner s = new Scanner(System.in);可通过Scanner类的next()与nextLinevitable()方法获取输入的字符串, 在读取前一般用hasNext()与…

概率论测试

后续会上传批改版本

2025.10.26总结

今天做了23年5月份上半场的75道选择,怎么说,没及格,无论是知识点的广度上还是深度上都差的很远,以目前的水平考试,能不能通过完全靠运气。 下午题看了几眼,一共五六道比较固定的答题,熟悉题型和做题方法后应该就…

Python---开发桌面应用程序

早就知道可以使用Python的PyQT构建桌面应用程序了,但是没有具体实际过,以前都是使用前端来开发桌面应用程序的,安装依赖麻烦的要死,打包的时候还各种繁琐。 没想到使用Python来开发桌面应用程序如此的简单。 直接撸…

Python实现验证码识别的完整流程解析

验证码(CAPTCHA)是网络安全防护中最常见的技术之一,主要用于防止恶意程序批量请求服务。然而,随着深度学习和图像处理技术的发展,验证码的自动识别已成为人工智能领域的一个重要应用场景。本文将通过 Python 展示…

基于Python的验证码自动识别方案设计与实现

验证码是互联网安全的重要组成部分,广泛应用于注册、登录、投票等场景。其主要目的是防止机器人程序的恶意请求。然而,随着图像处理和深度学习的发展,验证码自动识别技术逐渐成熟。本文将介绍一种基于 Python 的验证…