一文让你了解RT-Thread

前言

要学习一项新知识或新的技能,首先要对其有个初步了解,然后再逐步学习如何运用它。

本文作为快速入门 RT-Thread 系列文章的第一篇,首先介绍一下,我当时是如何学习 RT-Thread 的,以及参与官方组织的活动的情况,希望给读者参考,并有所启发。

然后先介绍一下这款国产 RTOS 的大概内容,做到对 RT-Thread 有个初步的了解。

我的 RT-Thread 学习之路

1. 初识 RT-Thread

记得在 2017 年看到公众号一篇文章介绍 RT-Thread,文章结尾留有联系方式,可以拉入官方群,本着学习的目的,果断加微信入群。

那时还不了解 RT-Thread,但是对于 RTOS 已经不陌生。已经学习过 uCos 和 FreeRTOS 两款 RTOS 系统。

国产 RTOS 还是第一次接触,并且能进官方技术交流群,当然要进群去学习了。

在网上搜了一下 RT-Thread 相关资料,简单了解了这款国产的 RTOS。

RT-Thread 内核的第一个版本是熊谱翔先生在 2006 年年初发布的 0.1 版本。发展到现在,已经有十多年的历史了。

因为 RTOS 中的任务更类似于通用操作系统中的线程,并且这个系统支持基于优先级的抢占式任务调度算法。所以把它命名为 RT-Thread,即实时线程。

后来又加了好多官方群,算得上 RT-Thread 的忠实粉丝了。


54da403994bff268c179de5240dc6480.png


2. 入门 RT-Thread

由于时间原因,一直没有真正开始学习 RT-Thread。直到 2018 年官方组织 15 天入门 RT-Thread 培训,才开始真正地学习 RT-Thread。每天中午抽时间看当天的视频,然后再实际动手实验,复习课程学习的内容。

当初学习的时候,每天还组织抽奖,既学习了知识,还能获得奖品。除了点赞还能说啥。当然,我运气不错,中了一个开发板(备注:此处不是炫耀)。

感谢 RT-Thread 官方组织的学习活动。课程学习完毕,自我感觉已经入门了。

9023b32c9c95d67197e1d419d8905af5.png


现在官方视频学习网址如下:

https://www.rt-thread.org/page/video.html

3. 读内核源码

入门学习结束后,觉得不能止于此。当时的想法是要读一读源码,深入到 RTOS 内部机制的实现。

然后,开始每天抽一部分时间研究 RT-Thread 内核源代码。逐渐地把内核源码研究了一遍,弄懂了其设计思想和实现方法。不得不说,代码写的非常棒

基于此,较深入地理解了 RTOS 内核工作原理。感觉功力又上升了一个层次。

7eb6da308208c2348a9cf11d67c075e5.png


4. 参加网络编程学习

后来参加官方组织的 RT-Thread 网络编程学习营。每周一个任务,一共四周。完成后将实现过程形成笔记发布到官方论坛。

那时候学习劲头足,白天上班,晚上回家研究学习任务。有时候为了解决问题,完成任务,甚至熬夜调试代码。当然对于最后的收获,却是值得的。

这期间,不仅对网络通信有深入了解,还接触到了设备与云端通信,还认识了不少小伙伴。

完成网络编程学习营任务发布的文章,如下图

cf5b8de8a1b017398cc73eece64e54ce.png


5. 新书提前阅读

同年(2018年)官方组织新书提前阅读评审书籍《嵌入式实时操作系统:RT-Thread设计与实现》,当然要参加啦。

每天阅读一个章节,给出修改意见。在阅读过程中,结合之前学习 RT-Thread 的知识,算是把 RT-Thread 又系统地学习了一遍。

通过对 RT-Thread 的学习,对 RTOS 的原理有了较深入的理解。自认为把 RTOS 相关的基础知识夯实了。

新书出版,官方给送了一本,还有熊大的亲笔签名。

e30a4a57de3640c73f190c2b7727b3df.png


感谢熊大,感谢 RT-Thread 的各位小伙伴,提供了这么好的学习平台。祝愿 RT-Thread 发展得越来越好。

了解 RT-Thread

RT-Thread 是一款完全由国内团队开发维护的嵌入式实时操作系统(RTOS),具有完全的自主知识产权 。

RT-Thread,全称是 Real Time-Thread,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务。在 RT-Thread 系统中,任务是通过线程实现的。

RT-Thread 主要采用 C 语言编写,浅显易懂,方便移植。它把面向对象的设计方法应用到实时系统设计中,使得代码风格优雅、架构清晰、系统模块化并且可裁剪性非常好。

RT-Thread 系统完全开源, 3.1.0 及以前的版本遵循 GPL V2 + 开源许可协议。从 3.1.0 以后的版本遵循 Apache License 2.0 开源许可协议,可以免费在商业产品中使用,并且不需要公开私有代码。

RT-Thread 目前分为三个版本:标准版本、Nano 版本、Smart 版本。

详细了解 RT-Thread,可以访问官方网站:

https://www.rt-thread.org

RT-Thread 在线文档网址为:

https://www.rt-thread.org/document/site/#/

f4c20f065911800f101a7d7d59b81729.png


1. 标准版

标准版 RT-Thread 与其他很多 RTOS 如 FreeRTOS、uC/OS 的主要区别之一是,它不仅仅是一个实时内核,还具备丰富的中间层组件

详细介绍可参考官方网站:

https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/README

标准版软件架构如下图所示。

9c60b808194492d7df012f96561d7dfb.png


物联网操作系统是指以操作系统内核(可以是 RTOS、Linux 等)为基础,包括如文件系统、图形库等较为完整的中间件组件,具备低功耗、安全、通信协议支持和云端连接能力的软件平台,RT-Thread 就是一个 IoT OS。

2. Nano版本

RT-Thread Nano 是一个极简版的硬实时内核,是一款可裁剪的、抢占式实时多任务的 RTOS。

其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实时操作系统特性。

详细内容可参考官方在线文档网站:

https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-nano/an0038-nano-introduction

Nano 版软件框图如下,包含支持的 CPU 架构与内核源码,还有可拆卸的 FinSH 组件:

433fa3f0e935f296aa27a39bca6afded.png


3. Smart 版本

RT-Thread Smart 是基于 RT-Thread 操作系统上的混合操作系统,简称为 rt-smart,它把应用从内核中独立出来,形成独立的用户态应用程序,并具备独立的地址空间(32 位系统上是 4G 的独立地址空间)。

详细了解可以访问官方资料网站:

https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/README

rt-smart 的整体结构框图如下,在硬件平台的基础上通过 MMU、系统调用的方式把整个系统分成了内核态及用户态。

09de06d3cf78e845d1ccc04709498511.png


RT-Thread 内核

内核是操作系统最基础也是最重要的部分。下图为 RT-Thread 内核架构图,内核处于硬件层之上,内核部分包括内核库、实时内核实现。

fea5a3a7d10b73628c82930a64da55e7.png


内核库是为了保证内核能够独立运行的一套小型的类似 C 库的函数实现子集。这部分根据编译器的不同自带 C 库的情况也会有些不同,当使用 GNU GCC 编译器时,会携带更多的标准 C 库实现。

实时内核的实现包括:对象管理、线程管理及调度器、线程间通信管理、时钟管理及内存管理等等。

内核最小的资源占用情况是 3KB ROM,1.2KB RAM。

线程调度

线程是 RT-Thread 操作系统中最小的调度单位,线程调度算法是基于优先级的全抢占式多线程调度算法。

在系统中除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的,包括线程调度器自身。

支持 256 个线程优先级(也可通过配置文件更改为最大支持 32 个或 8 个线程优先级),0 优先级代表最高优先级,最低优先级留给空闲线程使用。

时钟管理

RT-Thread 的时钟管理以时钟节拍为基础,时钟节拍是 RT-Thread 操作系统中最小的时钟单位。

RT-Thread 的定时器提供两类定时器机制:单次触发定时器、周期触发定时器。

通常使用定时器定时回调函数(即超时函数),完成定时服务。用户根据自己对定时处理的实时性要求选择合适类型的定时器。

线程同步

RT-Thread 采用信号量、互斥量与事件集实现线程间同步。

线程通过对信号量、互斥量的获取与释放进行同步;互斥量采用优先级继承的方式解决了实时系统常见的优先级翻转问题。

线程通过对事件的发送与接收进行同步;事件集支持多事件的 “或触发” 和“与触发”,适合于线程等待多个事件的情况。

线程通信

RT-Thread 支持邮箱和消息队列等通信机制。

邮箱中一封邮件的长度固定为 4 字节大小;消息队列能够接收不固定长度的消息,并把消息缓存在自己的内存空间中。

内存管理

RT-Thread 支持静态内存池管理及动态内存堆管理。

动态内存堆管理模块在系统资源不同的情况下,分别提供了面向小内存系统的内存管理算法及面向大内存系统的 SLAB 内存管理算法。

还有一种动态内存堆管理叫做 memheap,适用于系统含有多个地址且不连续的内存堆。使用 memheap 可以将多个内存堆 “粘贴” 在一起,让用户操作起来像是在操作一个内存堆。

I/O 设备管理

RT-Thread 将 PIN、I2C、SPI、USB、UART 等作为外设设备,统一通过设备注册完成。实现了按名称访问的设备管理子系统,可按照统一的 API 界面访问硬件设备。

在设备驱动接口上,根据嵌入式系统的特点,对不同的设备可以挂接相应的事件。当设备事件触发时,由驱动程序通知给上层的应用程序。

后续计划

作为 RT-Thread 的学习者和受益者,以及对国产 RTOS 的支持。愿意付出自己的绵薄之力,把自己学到的知识形成笔记文章分享出来,供有需要的小伙伴作为学习参考。

首先,会尽量以简单的方式,介绍 RT-Thread 提供的资源如何使用,理论结合实践,达到快速入门的效果。

然后,再以专题的形式,介绍内核源码实现的内部机制。争取做到,知其然,知其所以然。

在写作过程中,难免出现纰漏或者理解偏差的地方,欢迎指正,一起探讨交流。

一起学习、一起进步。加油~

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

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

相关文章

Network Service 权限问题

今天在做asp.net的定时删除服务器上的文件时,出了错误,在本地测试都好着呢,可是一部署到服务器上,删除文件的那个方法就不执行,后来在网站查了是Network Service权限设置问题,Network Service 是 Windows S…

创建python虚拟环境

一 windows下如何构建虚拟环境如果系统中只有python2或只有python3,可以直接打开命令行,输入pip install virtualenv 来下载创建虚拟环境的包(如果提示pip不是内部命令,把python文件下的Scripts的文件路径加入计算机环境变量即可可) 1. 选择一…

二分法查找(C/C++)

当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的,默认是按 升序 排好的。时间复杂度:O(logn) 集合中的set和map中使用二分法进行查找的。 int BiSearch(char *str, int n, char find) //返回值是:下标 { int low 0, mi…

电源开关上的 | 和 O 究竟代表了什么?

大家好,我是写代码的篮球球痴,转发张老师的一篇文章。几乎所有的电器、灯具和插座上只要带有电源开关必然会出现“|”和“O”两个符号。如果只看符号判断,“|”和“O”到底代表什么含义呢?能分清:哪个是电路联通,哪个是…

python卸载模块的方法汇总_Python卸载模块的方法汇总

easy_install 卸载通过easy_install 安装的模块可以直接通过 easy_install -m PackageName 卸载,然后删除\python27\Lib\site-packages目录下的egg。setup.py 卸载通过发行包附带的setup.py安装的模块,首选setup.py提供的uninstall选项。如果作者没有提供…

最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用8

辞职创业吴言在经过了几天的反复思考,终于下定决心辞职创业了。做出这个决定真的需要很大的勇气,因为自己的年纪做为程序员来说,已经属于很高龄了,如果创业失败几乎没有退路,再找工作将很难,合适的工作几乎…

重庆大二学生花了6年写出了操作系统

一直以来,国内操作系统都是弱势的地方,可能是国情原因吧,事实上国内也有不少人想改变这种格局,一直以来,笔者的朋友也在一直为这个方向努力,xbook内核,作者花了6年时间,从初中开始就…

逆转一个链表

在一个list中,我们先让头结点的next域指向结点2,再让结点1的next域指向结点3,最后将结点2的next域指向结点1,就完成了第一次交换,顺序就变成了Header-结点2-结点1-结点3-结点4-NULLtypedef struct _list_t{struct _lis…

Django form choices, placeholder

itemCharField(max_length20,min_length1,requiredTrue,widgetwidgets.TextInput({placeholder:testing,}),) typeCharField(min_length1,max_length4,requiredTrue,widgetSelect(choices((0,P),(1,M))),) 转载于:https://www.cnblogs.com/pythonClub/p/9782147.html

《大话存储__网络存储系原理精解与最佳实践》电子书下载

大话存储__网络存储系原理精解与最佳实践,经典图书 网络存储,是近二十年来的新兴行业。从纸带到硬盘再到大型磁盘阵列,存储系统经历了从简单到复杂,从单块硬盘到存储区域网络(SAN)。网络存储行业目前已经是…

辉哥给rockchip修复了一个内存溢出问题

还是周末我也不想说周末,但是不是周末的话,可能也没有特别清净的时间来处理困难的问题。这周末我是要加班的,加班的前一个晚上,我领导找我们吃了一个便饭,聊了很多东西,这篇文章我就不说了,会在…

习题1-3

#include<stdio.h> int main() {int n,sum0;scanf("%d", &n);for (int i 1; i < n1; i){sum sum i;}printf("%d\n",sum);return 0; } 连续和转载于:https://www.cnblogs.com/zhuzehua/p/9783091.html

将一个数组里面的奇数全部排在前面,偶数排在后面

将一个数组里面的奇数全部排在前面&#xff0c;偶数排在后面 方法1&#xff1a;使用数组。 void paixu(int dest[], int n, int src[]) {int i 0, m n-1, k 0;if (0 > n){return ;}for (i 0; i < n; i){if (0 ! (src[i] % 2))///奇数{dest[k] src[i];k ;}else{de…

MVC(dotnet)

一天中吹牛的时间到了&#xff0c;纠正一下自己的思维&#xff0c;要是能让过客收益那是我的荣幸。 前段时间就三层&MVC被一些网友搅的一头雾水....管他萝卜酸菜吃下去了才是自己的。 首先我要说明的是MVC只是一个表现模式&#xff0c;是一种软件架构模式&#xff0c;而三层…

微信小程序轮播图中间变大_微信小程序实现带放大效果的轮播图

本文实例为大家分享了微信小程序实现带放大效果的轮播图&#xff0c;供大家参考&#xff0c;具体内容如下效果如图WXMLWXSS.Carousel{margin-top: 49px;background-color: #fff;}.swiper-container{position: relative;}.swiper-container .swiper{padding-top: 8px;height: 38…

跟我领导吃饭

上篇文章说&#xff0c;下篇文章会说跟我们领导吃饭的事情。我领导是我上上上家公司的领导&#xff0c;不是现在TC的领导。自从离职后&#xff0c;我们差不多6个月没再见面&#xff0c;那时候我想跳槽&#xff0c;是因为得到消息说他要走&#xff0c;我刚开始不相信&#xff0c…

tyvj 1391 走廊泼水节【最小生成树】By cellur925

题目传送门 题意简化&#xff1a;给你一棵树&#xff0c;要求你加边使它成为完全图&#xff08;任意两点间均有一边相连&#xff09; &#xff0c;满足原来的树是这个图的最小生成树。求加边的价值最小是多少。 考虑Kruskal的过程&#xff0c;我们每次找一条最短的&#xff0c;…

分解成质因数

分解成质因数 (如435234251*17*17*3*2) void prim(int m) {int n 2;if (m > n) {while (m%n ! 0) {n;}m / n;prim(m);printf(“%d*”, n);} }

支持向量机-SVM-最优化公式推导记录

1. 简述 SVM涉及的东西很多&#xff0c;如果要理解全面的话&#xff0c;要理解经验风险与置信风险&#xff0c;VC维理论&#xff0c;推导出最优化公式&#xff0c;最优化求解的拉格朗日解法&#xff0c;核函数&#xff0c;等等方面的内容&#xff0c;当前对SVM理解太少&#xf…

mysql innodb 死锁_mysql innodb 死锁分析

mysql Ver 14.14 Distrib 5.7.16, for linux-glibc2.5 (x86_64) using EditLine wrapper #mysql版本 5.7.16Connection id: 10042Current database: china9129Current user: rootlocalhostSSL: Not in useCurrent pager: stdoutUsing outfile: Using delimiter: ;Server versio…