RT-Thread嵌入式操作系统

2023-05-16

一、系统架构

  RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统。
  RT-Thread 主要采用 C 语言编写,浅显易懂,方便移植。它把面向对象的设计方法应用到实时系统设计中,使得代码风格优雅、架构清晰、系统模块化并且可裁剪性非常好。针对资源受限的微控制器(MCU)系统,可通过方便易用的工具,裁剪出仅需要 3KB Flash、1.2KB RAM 内存资源的 NANO 版本(NANO 是 RT-Thread 官方于 2017 年 7 月份发布的一个极简版内核);而对于资源丰富的物联网设备,RT-Thread 又能使用在线的软件包管理工具,配合系统配置工具实现直观快速的模块化裁剪,无缝地导入丰富的软件功能包,实现类似 Android 的图形界面及触摸滑动效果、智能语音交互效果等复杂功能。
  近年来,物联网(Internet Of Things,IoT)概念广为普及,物联网市场发展迅猛,嵌入式设备的联网已是大势所趋。终端联网使得软件复杂性大幅增加,传统的 RTOS 内核已经越来越难满足市场的需求,在这种情况下,物联网操作系统(IoT OS)的概念应运而生。物联网操作系统是指以操作系统内核(可以是 RTOS、Linux 等)为基础,包括如文件系统、图形库等较为完整的中间件组件,具备低功耗、安全、通信协议支持和云端连接能力的软件平台,RT-Thread 就是一个 IoT OS。

  RT-Thread 与其他很多 RTOS 如 FreeRTOS、uC/OS 的主要区别之一是,它不仅仅是一个实时内核,还具备丰富的中间层组件,如下图所示。
在这里插入图片描述
它具体包括以下部分:

1、内核层:RT-Thread 内核,是 RT-Thread 的核心部分,包括了内核系统中对象的实现,例如多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等;libcpu/BSP(芯片移植相关文件 / 板级支持包)与硬件密切相关,由外设驱动和 CPU 移植构成。
2、组件与服务层:组件是基于 RT-Thread 内核之上的上层软件,例如虚拟文件系统、FinSH 命令行界面、网络框架、设备框架等。采用模块化设计,做到组件内部高内聚,组件之间低耦合。
3、RT-Thread 软件包:运行于 RT-Thread 物联网操作系统平台上,面向不同应用领域的通用软件组件,由描述信息、源代码或库文件组成。RT-Thread 提供了开放的软件包平台,这里存放了官方提供或开发者提供的软件包,该平台为开发者提供了众多可重用软件包的选择,这也是 RT-Thread 生态的重要组成部分。软件包生态对于一个操作系统的选择至关重要,因为这些软件包具有很强的可重用性,模块化程度很高,极大的方便应用开发者在最短时间内,打造出自己想要的系统。RT-Thread 已经支持的软件包数量已经达到 60+,如下举例:

 <1>物联网相关的软件包:Paho MQTT、WebClient、mongoose、WebTerminal 等等。

 <2>脚本语言相关的软件包:目前支持 JerryScript、MicroPython。
多媒体相关的软件包:Openmv、mupdf。
 <3>工具类软件包:CmBacktrace、EasyFlash、EasyLogger、SystemView。
 <4>系统相关的软件包:RTGUI、Persimmon UI、lwext4、partition、SQLite 等等。
 <5>外设库与驱动类软件包:RealTek RTL8710BN SDK。
其他。

二、文件结构

1、RT-Thread 完整版

在这里插入图片描述
该版本适用于需要使用RT-Thread的丰富功能,如各类外设、物联网组件、软件包等的场景。

2、RT-Thread Nano版

在这里插入图片描述
适用于系统资源紧张或是项目功能较为简单,仅需使用RTOS内核,无需丰富功能的场景,且开发时无需额外的辅助工具。

3 源文件的文件说明

1、applications		RT-Thread 应用程序。

2、rt-thread		RT-Thread 的源文件。
	- components		RT-Thread 的各个组件目录。
	- include			RT-Thread 内核的头文件。
	- libcpu			各类芯片的移植代码,此处包含了 STM32 的移植文件。
	- src				RT-Thread 内核的源文件。
	- tools				RT-Thread 命令构建工具的脚本文件。
- 
3、drivers			RT-Thread 的驱动,不同平台的底层驱动具体实现。

4、Libraries		STM32 固件库文件。

5、kernel-sample-0.1.0	RT-Thread 的内核例程。

4 移植后的文件层次

在这里插入图片描述

Applications	它用于存放用户应用代码。
Drivers			它用于存放 RT-Thread 底层的驱动代码。
STM32_HAL		它用于存放 STM32 的固件库文件。
kernel-sample	它用于存放 RT-Thread 的内核例程。
Kernel			它用于存放 RT-Thread 内核核心代码。
CORTEX-M3		它用于存放 ARM Cortex-M3 移植代码。
DeviceDrivers	它用于存放 RT-Thread 驱动框架源码。
finsh			它用于存放 RT-Thread 命令行 finsh 命令行组件。

三、系统启动

  一般了解一份代码大多从启动部分开始,同样这里也采用这种方式,先寻找启动的源头,因为 MDK-ARM 的用户程序入口为 main() 函数,所以先看看 main() 函数在哪个文件中。这里的 main() 函数位于 Startup 组的 startup.c 文件中,它位于 STM32 的启动汇编代码后,与 C 代码的入口跳转前。启动汇编在 STM32_HAL 组的 startup_stm32f103xe.s 中。

下面我们来看看 main() 函数中的这段代码:

 
//components.c 中定义
/* re-define main function */
int $Sub$$main(void)
{
    rt_hw_interrupt_disable();
    rtthread_startup();
    return 0;
}

  在这里 $Sub$$main 函数仅仅调用了 rtthread_startup() 函数。RT-Thread 支持多种平台和多种编译器,而 rtthread_startup() 函数是 RT-Thread 规定的统一入口点,所以 $Sub$$main 函数只需调用 rtthread_startup() 函数即可。例如采用 GNU GCC 编译器编译的 RT-Thread,就是直接从汇编启动代码部分跳转到 rtthread_startup() 函数中,并开始第一个 C 代码的执行的。在 components.c 的代码中找到 rtthread_startup() 函数,我们将可以看到 RT-Thread 的启动流程:

int rtthread_startup(void)
{
    rt_hw_interrupt_disable();
 
    /* board level initalization
     * NOTE: please initialize heap inside board initialization.
     */
    rt_hw_board_init();
 
    /* show RT-Thread version */
    rt_show_version();
 
    /* timer system initialization */
    rt_system_timer_init();
 
    /* scheduler system initialization */
    rt_system_scheduler_init();
 
#ifdef RT_USING_SIGNALS
    /* signal system initialization */
    rt_system_signal_init();
#endif
 
    /* create init_thread */
    rt_application_init();
 
    /* timer thread initialization */
    rt_system_timer_thread_init();
 
    /* idle thread initialization */
    rt_thread_idle_init();
 
    /* start scheduler */
    rt_system_scheduler_start();
 
    /* never reach here */
    return 0;
}
#endif

  这部分启动代码,大致可以分为四个部分 :

1 初始化与系统相关的硬件;
2 初始化系统内核对象,例如定时器,调度器;
3 初始化系统设备,这个主要是为 RT-Thread的设备框架做的初始化;
4 初始化各个应用线程,并启动调度器。

四、用户代码

  上面的启动代码基本上可以说都是和 RT-Thread 系统相关的,那么用户如何加入自己的应用程序的初始化代码呢?RT-Thread 将 main 函数作为了用户代码入口,只需要在 main 函数里添加自己的代码即可。

int main(void)
{
  /* user app entry */
  return 0;
}

  为了在进入 main 程序之前,完成系统功能初始化,可以使用 $sub 和 $super 函数标识符在进入主程序之前调用另外一个例程,这样可以让用户不用去管 main() 之前的系统初始化操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RT-Thread嵌入式操作系统 的相关文章

  • EventLoop execute() 怎么保证线程安全

    EventLoop 的 execute 是在 SingleThreadEventLoop 中实现的 64 Override public void execute Runnable task if task 61 61 null throw
  • EventLoop execute() 怎么保证线程安全

    EventLoop 的 execute 是在 SingleThreadEventLoop 中实现的 64 Override public void execute Runnable task if task 61 61 null throw
  • 关于 find grep xargs 命令总结

    1 定义 amp 区别 xff1a 1 find命令是根据文件的属性进行查找 xff0c 如文件名 xff0c 文件大小 xff0c 所有者 xff0c 所属组 xff0c 是否为空 xff0c 访问时间 xff0c 修改时间等 2 gre
  • ubuntu如何在当前文件夹下打开终端

    1 打开终端 xff0c 执行以下命令 xff1a sudo apt get install nautilus open terminal 2 在终端中执行下列命令 xff0c 重新加载文件管理器 nautilus q 3 执行以上指令后在
  • 解决libssl.so.1.0.0: 找不到的问题

    安装了多个版本的openssl后 xff0c 导致adb或svn无法使用 xff0c 出现以下错误 xff1a libssl so 1 0 0 no version information available 记录下最后的解决方法 xff0
  • JS对象—5.文档对象(document)

    document对象 一 span class token punctuation span 元数据 span class token number 1 span characterSet span class token operator
  • Keil5及芯片包的安装以及 Keil5打开Keil4工程编译出错解决方法

    一 温馨提示 1 安装路径不能带中文 xff0c 必须是英文路径 2 安装目录不能跟 51 的 KEIL 或者 KEIL4 冲突 xff0c 三者目录必须分开 3 KEIL5 的安装比起 KEIL4 多了一个步骤 xff0c 必须添加 MC
  • 上下文切换

    上下文切换是操作系统比较重要的一部分 xff0c 提到它 xff0c 我们第一时间想到的会是使用时间片轮转方式调度的os中涉及的进程之间上下文切换 再问还有没有其他 xff0c 也许会想到中断时 xff0c 上下文似乎也要切换 这两种切换是
  • Android系统 应用图标显示未读消息数(BadgeNumber) 桌面app图标的角标显示

    http www 51itong net android badgenumber 9789 html
  • smbclient介绍

    smbclient介绍 1 Smbclient介绍1 1 SMB 协议介绍 2 Smbclient命令使用技巧2 1 Smbclient 功能说明2 2 语法2 3 参数2 4 使用举例 1 Smbclient介绍 Smbclient sa
  • 关于void指针的地址问题

    如图 void指针指向其他类型的数据时对其地址加1 它可指向几乎任何数据 xff0c 且指针加1时相当于字符指针加1 xff0c 利用这一特性可将void指针作为形参类型 xff0c 可传入任意数据且对形参操作时可类比字符指针 xff0c
  • Ubuntu apt update无论使用什么源都出现类似的错误

    下面是清华源执行后的情况 Ign 1 https mirrors tuna tsinghua edu cn ubuntu jammy InRelease Ign 2 https mirrors tuna tsinghua edu cn ub
  • 从源码分析C++中forward完美转发和move移动语义的本质区别

    完美转发可以看做一种能够按照原来类型转发到另一个地方 xff08 函数 xff09 的方法 xff08 废话 xff09 咱不如直接上源代码 xff08 move h xff09 xff1a template lt typename Tp
  • 实现对单链表的倒置

    我们知道数组的倒置比较简单 xff0c 只需要知道数组的头 xff0c 和数组的尾 xff0c 将其数据互换 xff0c 再将第二个和倒数第二个互换 xff0c 一直这样操作下去 xff0c 数组就实现倒置了 那么单链表也可以通过这样的方法
  • 立创开源|18650锂电池四路充电器

    该工程为18650四路电池充电器 xff0c 支持DC Micro USB USB typec输入 xff0c 同时四路充电 充电芯片采用价格便宜的TP4056 xff0c 电池盒采用直插电池盒 每节电池充电电流为1A xff0c 由于电流
  • 无法连接上 archive.ubuntukylin.com:10006 (120.79.211.60),连接超时

    无法连接上 archive ubuntukylin com 10006 120 79 211 60 xff0c 连接超时解决方法 问题描述 执行sudo apt get update时出现如下错误 xff1a 错误 12 http arch
  • 【C++】模板与泛型编程

    泛型编程 泛型编程最初诞生于C 43 43 中 xff0c 由Alexander Stepanov 2 和David Musser 3 创立 目的是为了实现C 43 43 的STL xff08 标准模板库 xff09 其语言支持机制就是模板
  • LXC(Linux containers)常用命令介绍

    lxc version 用于显示系统LXC的版本号 xff08 可以通过此命令判断系统是否安装了lxc xff09 用法 xff1a lxc version 例如 lxc version lxc checkconfig 用于判断linux内
  • Docker 大势已去,Podman 万岁

    前言 郑重声明 xff1a 本文不是 Podman 的入门篇 xff0c 入门请阅读这篇文章 xff1a 再见 Docker xff0c 是时候拥抱下一代容器工具了 Podman 原来是 CRI O 项目的一部分 xff0c 后来被分离成一
  • 使用node开发一个解放双手的小工具《二》- vsCode插件包装

    背景 xff1a 此篇是上篇 使用node开发一个解放双手的小工具 的后续 xff0c 前边遗留了一些问题 xff0c 最近完善了一下 因为发现实际使用起来 xff0c 有很多的不方便 xff1a 使用上 xff0c 需要配置对应的根目录

随机推荐

  • 使用网络调试助手时,踩坑

    在使用网络调试助手时 xff0c 踩坑很多 xff1a 1 作为tcp的客户端 xff0c 或者服务端 xff0c 没有注意发送设置以ASCII还是HEX 导致目标环境接收解析数据异常出现段错误 2 xff1a 作为UDP作为客户端 xff
  • Win7 32 不能安装STM32 虚拟串口驱动解决方法

    1 对于一些精简过的系统 xff0c 无法安装虚拟串口 xff0c 是由于系统缺少mdmcpq inf和usbser sys文件所造成的 只需要将文件下载下来放在相应的文件夹下面就行了 文件对应的目录如下 xff1a mdmcpq inf在
  • gitee使用教程

    目录 版本控制 1 Gitee上注册账户 2 新建一个远程代码仓 xff0c 点击右上方的加号 3 修改远程仓为开源的 编辑 4 本地下载git 5 克隆远程仓到本地 xff0c 复制地址 6 创建代码并提交到远程仓库 7 将本地代码提交到
  • Telnet 接口的使用(一):Telnet的安装与开启

    什么是 Telnet 简介 telnet 用于远程登录 xff0c Telnet的工作方式为 服务器 客户端 方式 xff0c 它提供了从一台设备 xff08 Telnet客户端 xff09 远程登录到另一台设备 xff08 Telnet服
  • Android系统四层体系架构

    Android体系架构分为四层 xff1a 应用层 应用框架层 库层 内核层 xff08 盗用一张图 xff09 一 应用层 应用层包括手机上的所有APP xff0c 无论是系统自带的还是用户开发的 他们都是基于第二层应用框架层开发的 二
  • 芯片的开发板和评估板的区别

    评估版一般都是半导体生产厂家所提供的 xff0c 用于器件性能评估用 xff0c 大公司不用他来赚钱 xff1b 开发板大多说是通过板子赚钱的 xff0c 就是很多的网友工程师做的 xff1b 目标板是在开发产品的过程中 xff0c 相对于
  • 增量式pid+位置式PID(电机位置闭环控制)

    ps xff1a 2022更新 pid详细解释 一般很少用增量式 xff0c 都是用位置式 xff0c 下文增量式可以不看 本文分为几个部分 xff1a 1 编码器 2 定时器输入捕获 xff08 把定时器初始化为编码器模式 xff09 3
  • Vmware 扩容磁盘

    Vmware 扩容磁盘 第一步 xff0c 首先添加一块磁盘 xff0c 进行分区第二步 xff0c 创建物理卷加入组第三步 xff0c 进行扩容 目录第四步 xff0c 刷新逻辑卷 第一步 xff0c 首先添加一块磁盘 xff0c 进行分
  • 思科模拟器中的交换机使用方法

    思科模拟器中的交换机使用方法 思科模拟器中有较多种交换机型号 xff0c 这里只是简单的介绍一下二层交换机2960 xff0c 以及三层交换机中的3560 1 关于交换机的原理 xff1a 交换机是通过其保存的MAC地址表来进行工作的 xf
  • 计算机发展15件重大事件(图说)

    链接 xff1a https vision xitek com famous 201001 28 36559 html 一 1946年 xff0c 第一台电子计算机 埃尼阿克 问世 二 1976年 xff0c 苹果电脑Apple I现世 三
  • vsftp登录报530 Login incorrect无法登录问题解决

    vsftp登录报530 Login incorrect无法登录问题解决 今天在搭建FTP服务器的时候遇到了530 Login incorrect这个问题 通过修改配置文件解决了 总结了一下在搭建FTP服务器的时要注意的地方大概有下面这几点
  • Linux上SMB挂载提示mount: block device //xxx.xxx.xx.xx/xx is write-protected, mounting read-only时解决办法

    当在Linux上挂载SMB服务器时候有时会提示如下错误 xff1a root 64 test mount o username 61 lisi 192 168 23 32 smb test mount block device 192 16
  • Linux下的LAMP环境搭建时访问PHP页面时变成下载页面的原因

    在搭建LAMP环境的时候遇到了配置完PHP环境后测试访问PHP页面的时候却变成下载的情况 xff0c 主要的影响有一下两个方面 1 PHP的配置问题 2 主要原因是httpd conf配置文件内容出错大致有下面几个地方 xff1a Load
  • 服务器肉鸡/入侵被恶意利用的排查和优化方案

    排查方法 xff1a 1 账户方面 xff1a Windows xff1a xff08 1 xff09 检查服务器内是否有异常的账户 xff0c 查看下服务器内是否有非系统和用户本身创建的账户 xff0c 一般黑客创建的账户账户名 后会有
  • Opensuse如何安装桌面环境

    安装必须的范式 xff1a zypper install t pattern kde kde plasma 编辑 etc sysconfig displaymanager 文件并设定 DISPLAYMANAGER 61 kdm xff0c
  • 怎么用谷歌学术检索下载外文文献

    谷歌学术是一个可以免费搜索外文学术文章的搜索引擎 xff0c 包括了世界上绝大部分出版的学术期刊 xff0c 可广泛搜索学术文献 谷歌学术可了解有关某一领域的学术文献 xff1b 了解某一作者的著述 xff0c 并提供书目信息 xff08
  • 英文文献去哪里查找,8个超强英文文献查找网站建议收藏

    英文文献去哪里查找 xff1f 找对方向用对工具可大幅提升学习和研究效率 xff01 下面详细介绍8个查找英文文献非常好用的网站 一 文献党下载器 xff08 wxdown org xff09 xff1a 该网站几乎整合汇聚了所有文献数据库
  • 基于STM32系列的模拟串口(非阻塞式)

    STM32单片机一般少则3个串口 多则5个 而我这次的项目还偏偏5个硬件串口还是不够用 至于不够用的原因 哎 是项目做到后面有定制 随便哪个串口都省不得 没得办法 只能另想法子咯 板子上有几个预留IO口 可以用来模拟串口 模拟串口一般都选9
  • 复制一个目录下的所有文件到另外一个目录(Java实现)

    首先说说我的思路 xff0c 要复制一个目录下的所有文件到另外的一个目录下 xff0c 我们不知道目录下的结构是怎么样的 xff0c 也不知道目录有多少层 xff0c 文件有多少个 xff0c 这样我们会想用循环 xff0c for 但是我
  • RT-Thread嵌入式操作系统

    一 系统架构 RT Thread xff0c 全称是 Real Time Thread xff0c 顾名思义 xff0c 它是一个嵌入式实时多线程操作系统 RT Thread 主要采用 C 语言编写 xff0c 浅显易懂 xff0c 方便移