一文让你了解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,一经查实,立即删除!

相关文章

创建python虚拟环境

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

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

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

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

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

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

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

MVC(dotnet)

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

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

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

跟我领导吃饭

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

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

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

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

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

django 函数装饰器 变为 类装饰器

aaa 转载于:https://www.cnblogs.com/pythonClub/p/9789190.html

写flash,要不要加个判断?

相关文章既生Flash,又何生EEPROM?存储器Flash页、扇区、块的区别这是我一个知识星球朋友的提问刚开始我没有认真去思考这个问题,之后我仔细查了下资料,里面的内容还挺多。先看看EMMC的结构EMMC 是在nand flash的基础上增加了一个控…

IT 事业发展:树立自己的品牌

发展事业并达到事业顶峰是指树立自己的形象并进行自我推销。方法就在这里。 摘自 Sutton Hart Press (2011) 出版的《Fame 101》。 Jay 和 Maggie Jessup Fame 101 的基础以及成名公式很简单:成名 树立个人品牌 宣传 将自己的品牌推向市场 个人财务发展 宣传长…

谈谈JDK8中的字符串拼接

字符串拼接问题应该是每个Java程序员都熟知的事情了,几乎每个Java程序员都读过关于StringBuffer/StringBuilder来拼接字符串。 在大多数的教程中,也许你会看到用号拼接字符串会生成多个String,导致性能过差,建议使用StringBuffer/…

破解STM32F103芯片的方法

大家好,我是写代码的篮球球痴本文介绍ARM系列STM32F103芯片的解密方法,其内核是Cortex-M3,内存从16K-512K都有。该芯片主要应用非常广泛,日常消费类电子产品,工控设备,电机驱动,变频器&#xff…

python标准库怎么用_Python常用标准库使用(一)

自学python一段时间,之前总是学习基本语法,对Python标准库没怎么接触,所以计划从常用的标准库开始,大体了解一遍,下面是学习过程中的笔记。一、OS模块主要对目录、或者文件操作。常用方法如下:os.listdir(p…

英伟达|jetson nano开发使用的基础详细分享

大家好,我是写代码的篮球球痴,最近我朋友写了一篇英伟达开发板的文章,分享给大家。前言:最近拿到一块jetson nano 2GB版本的板子,折腾了一下,从烧录镜像、修改配件等,准备一篇开箱基础文章给大家…

和PP在腾讯

昨天晚上十点,我在会议室搞项目,PP发消息给我说 「你什么时候下班,等我一下,我下去见见你再走」。我说「你赶紧下来,我熬不住了」。因为确实比较晚,然后自己手上开发的事情也还没完成,有时还会冒…

python求回数_用python求回数

今天学到filter函数,做一道练习题,求回数的,我前前后后差不多用了半个小时才把它弄出来,先是有思路了然后写出来后一直报错,又改改换换,最后其实是某个小问题导致的,每次查这种小问题时都先怀疑…

周末生活日记|我们和楠哥

这周是双休,早上跟楠哥一起睡了一个大懒觉。早上11点起来,不过小米音箱在9点的时候就在客厅响音乐,我大叫一声「小爱同学,停止播放」,然后继续蒙头大睡。11点起来,哦,在我们家我还算起的早的&am…

lnmp基于fastcgi实现nginx_php_mysql的分离_LNMP基于FastCGI实现Nginx,PHP,MySQL的分离

LNMP基于FastCGI实现Nginx,PHP,MySQL的分离[日期:2012-11-12]来源:Linux社区作者:laoguang[字体:大 中 小]平时安装LNMP是把它们安装到同一台机器上,我想这个对大家来说丝毫没有挑战,下面我们实现把他们剥离…