当前位置: 首页 > news >正文

开放原子训练营(第三季)RT-Thread Nano学习营一探究竟

前言

不知道从什么时候起,智能设备开始普及到了我们日常生活的方方面面。下班还未到家,热水器就可以调到合适的温度;上班刚进公司,忘关空调也不再是什么烦恼;诸如夜晚的灯光变换,白昼的窗帘适应等更给我们的生活带来诸多方便与快乐。

那么有没有小伙伴曾经困惑或者思考过,为什么汽车可以不需要人来驾驶?为什么工业可以不需要人来把关?为什么便利店不需要收银员来收银结算?为什么小饭馆不需要大厨师来调色增香?

其实这一切都得益于一个技术的诞生与发展:物联网(Internet of Things),或者我们可以更抽象的说它是万物互联。

那么物联网到底是什么呢?

物联网简介

物联网是指通过信息感知设备和信息传输设备,按约定的协议,将物与物、物与人通过网络相连接,物体通过信息传播媒介进行信息交换和通信,以实现智能化识别、定位、跟踪、监控与管理等功能。

这其中,有三个至关重要的概念:

  1. 感知层:通过各种传感器采集信息,识别物体的特征、位置、状态等信息
  2. 网络传输层:通过网络实现物与物、物与人之间的信息交换
  3. 应用层:依据采集的大量数据,通过计算机信息系统进行存储、处理与分析,实现对物体的智能监控与控制

那么你可能有疑问,这么牛逼的东西是怎么运行的,那些能控制硬件的代码是怎么写出来的呢?

物联网操作系统原理探究

接着上面的话继续聊。

想要实现物联网的相关功能,物联网操作系统是不可或缺的部分。物联网操作系统由内核、通信支持(WiFi/蓝牙、2/3/4G等通信支持、NFC、RS232/PLC支持等)、外围组件(文件系统、GUI、Java虚拟机、XML文件解析器等)、集成开发环境等组成。

在这里插入图片描述

简而言之,物联网操作系统是对底层硬件资源进行管理和调度,为上层的应用程序提供稳定可靠的运行环境的一套系统。

从上面的图可以看出,物联网操作系统的主要操作原理如下:

  1. 硬件抽象层:抽象出CPU、内存、总线等底层硬件设备,为上层系统提供统一的接口。
  2. 内核:负责系统的核心功能,包括线程管理、中断管理、定时器管理、内存管理、信号量/消息队列等IPC机制等。
  3. 组件与服务:在内核之上提供文件系统、GUI、数据库、网络协议栈等服务。这些服务由相应的组件实现,开发者可以根据需求配置需要的组件。
  4. 驱动模型:提供统一的设备驱动框架和各种设备的驱动,实现对底层硬件的管理与调度。
  5. 应用程序:运行在操作系统之上的具体应用,通过调用操作系统提供的API实现相应的业务功能。

它们之间的架构关系如下图所示:

描述

从上到下,每一层的运行都依赖于下一层的功能。应用程序通过操作系统提供的 API 调用服务与组件层和内核层,最终管理底层硬件。这就是一个典型物联网操作系统的主要操作原理。

下面介绍一个非常好用的物联网操作系统---- RT-Thread

RT-Thread 简介

正好 CSDN 就有相关的课程,感兴趣的小伙伴可以移步16天入门物联网操作系统——RT-Thread 。

RT-Thread 是一个集实时操作系统(RTOS)内核、中间件组件和开发者社区于一体的国产开源技术,诞生于2006年,由熊谱翔先生带领并集合开源社区力量开发而成。RT-Thread也是一个组件完整丰富、高度可伸缩、简易开发、超低功耗、高安全性的物联网操作系统。

RT-Thread 具备一个IoT OS平台所需的所有关键组件,例如GUI、网络协议栈、安全传输、低功耗组件等等。经过13年的累积发展,RT-Thread已经拥有一个国内最大的嵌入式开源社区,同时被广泛应用于能源、车载、医疗、消费电子等多个行业,累积装机量超过两千万台,成为国人自主开发、国内最成熟稳定和装机量最大的开源RTOS。

RT-Thread 拥有良好的软件生态,支持市面上所有主流的编译工具如GCC、Keil、IAR等,工具链完善、友好,支持各类标准接口,如POSIX、CMSIS、C++应用环境、Javascript执行环境等,方便开发者移植各类应用程序。商用支持所有主流MCU架构,如ARM Cortex-M/R/A, MIPS, X86, Xtensa, C-Sky, RISC-V,几乎支持市场上所有主流的MCU和Wi-Fi芯片。

当前的 RT-Thread 有多个版本,分别是:标准版,Nano版和Smart版本。

关于这三个版本,伙伴可以去 RT-Thread 官网查看更详细的内容。

前言铺垫了这么多,终于来到我们的主题,RT-Thread Nano 学习营。

RT-Thread Nano使用

RT-Thread Nano 是使用 C 语言开发一个极简版的硬实时内核,它的内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实时操作系统特性。适用于家电、消费电子、医疗设备、工控等领域大量使用的 32 位 ARM 入门级 MCU 的场合。

软件框图:
在这里插入图片描述
Nano 版本支持的架构有 ARM(Cortex M0/ M3/ M4/ M7 等)、RISC-V 及其他,内置的功能有线程管理、线程间同步与通信、时钟管理、中断管理、内存管理。

开发环境搭建

使用 RT-Thread Nano,需要先搭建它的环境。

  • 我们可以从 RT-Thread 官网下载源码包

在这里插入图片描述

  • 或者点击这里直接下载压缩包,这样可以基于其他开发环境移植 RT-Thread Nano,比如 IRA

在这里插入图片描述

  • 或者我们通过一站式的 RT-Thread 开发工具 RT-Thread Studio 来创建 RT-Thread Nano 工程,可以从这里 获取安装RT-Thread Studio

在这里插入图片描述

  • 或者我们也可以基于 Keil MDK 或者 CubeMX 来移植 RT-Thread Nano。

下面重点介绍从 RT-Thread Studio 开始创建项目。

在RT-Thread Studio 上使用 RT-Thread Nano

第一步先安装 RT-Thread Studio,这里就略过了。

安装好以后,我们打开 IDE,先更新 SDK。

在这里插入图片描述

更新完成后,就可以新建 Nano 工程,在左上角依次点击File > New > RT-Thread Nano Project,就会弹出新建项目的配置页面。

下图是基于芯片来创建项目
在这里插入图片描述
如果是基于开发板,就需要我们选择开发板型号,BSP 版本号,RT-Thread 源码版本,调试器和调试接口等信息,如下图:

在这里插入图片描述

这样就创建完成了。接下来写一段代码,比如打印Hello RT-Thread!,连接硬件,进行编译下载

在这里插入图片描述
由于项目配置的时候,我们配置了控制台串口号及引脚号,所以工程中已经实现了 uart 的驱动以及 rt_hw_console_output() ,可以默认进行打印。

在这里插入图片描述

下面我们尝试几个简单的示例:

  1. 这是一个串口通信的示例:
int main()  
{  /* 查找串口设备 */  rt_device_t serial;  serial = rt_device_find("uart1");  /* 打开串口设备 */  rt_device_open(serial, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX);  /* 设置串口接收回调函数 */  rt_device_set_rx_indicate(serial, uart_rx_ind);  /* 发送字符串 */  rt_device_write(serial, 0, "Hello RT-Thread!", 15);  
}  void uart_rx_ind(rt_device_t dev, rt_size_t size)  
{  /* 读取数据 */  rt_uint8_t buff[32] = {0};  rt_device_read(dev, 0, buff, size);  
}  
  1. 这是一个定时器的示例:
/* 定时器控制块 */  
static struct rt_timer timer;  /* 定时器回调函数 */  
static void timeout(void *parameter)  
{  /* 线程函数打印了timeout reached!  */rt_kprintf("timeout reached!\n");  
}  int main()  
{  /* 初始化定时器 */  rt_timer_init(&timer, "timer", timeout, RT_NULL, 10, RT_TIMER_FLAG_ONE_SHOT);  /* 启动定时器 */  rt_timer_start(&timer);  
}  
  1. 创建线程与删除线程
#include <rtthread.h>#define THREAD_PRIORITY         25
#define THREAD_STACK_SIZE       512
#define THREAD_TIMESLICE        5ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t thread_stack[THREAD_STACK_SIZE];
static struct rt_thread tid1;/* 线程入口 */  
static void thread_entry(void* parameter)  
{/* 线程函数打印了Hello RT-Thread!  */rt_kprintf("Hello RT-Thread!\n");  rt_thread_mdelay(500);
}int main()  
{  /* 创建线程,接受线程名称,线程入口函数,线程参数,线程栈及大小,优先级和时间片*/  rt_thread_init(&tid1,"thread1",thread_entry,RT_NULL,thread_stack,THREAD_STACK_SIZE,THREAD_PRIORITY,THREAD_TIMESLICE); /* 启动线程 */  if (&tid1 != RT_NULL) rt_thread_startup(&tid1);  /* 删除线程 */  rt_thread_delete(tid);
}

基本上在使用 RT-Thread Studio 开发的时候,我们大体上可以分为这几个步骤:创建项目、编写代码、构建项目、下载、调试、优化。所以总体感觉还是比较简单。

总结

RT-Thread Nano 具有非常多的优点。

  1. 代码足够简洁:Nano 不含 Scons 构建系统,不需要 Kconfig 以及 Env 配置工具,也去除了完整版特有的 device 框架和组件,仅是一个纯净的内核。
  2. 资源占用小:Nano 对 RAM 与 ROM 的开销非常小,在支持 semaphore 和 mailbox 特性,并运行两个线程 (main 线程 + idle 线程) 情况下,RAM 占用约 1K 左右,ROM 占用 4K 左右。
  3. 使用方便:Nano 在配置文件 rtconfig.h 中列出了内核中的所有宏定义,有些默认没有打开,如需使用,打开即可。具体的配置可见教程

除此之外,Nano 还有很多让人眼前一亮的特性,这里就不一一列举了。
感兴趣的伙伴们,赶紧行动起来吧👉https://edu.csdn.net/course/detail/22983

相关文章:

开放原子训练营(第三季)RT-Thread Nano学习营一探究竟

前言 不知道从什么时候起&#xff0c;智能设备开始普及到了我们日常生活的方方面面。下班还未到家&#xff0c;热水器就可以调到合适的温度&#xff1b;上班刚进公司&#xff0c;忘关空调也不再是什么烦恼&#xff1b;诸如夜晚的灯光变换&#xff0c;白昼的窗帘适应等更给我们…...

数据库系统概论(二)关系数据库,SQL概述和数据库安全性

作者的话 前言&#xff1a;总结下知识点&#xff0c;自己偶尔看一看。 目录 一、关系模型概述 1.1关系数据结构及形式化定义 1.1.1域&#xff08;Domain&#xff09; 1.1.2笛卡尔积&#xff08;Cartesian Product&#xff09; 1.1.3关系&#xff08;Relation&#xff09; …...

【VM服务管家】VM4.x算子SDK开发_3.1 环境配置类

目录 3.1.1 环境配置&#xff1a;CSharp算子SDK开发环境配置方法3.1.2 算子封装&#xff1a;使用C封装算子SDK的方法3.1.3 异常中断&#xff1a;算子SDK软件运行报错“托管调试助手”中断的解决方法3.1.4 深度学习&#xff1a;GPU运行深度学习算子引发StackOverFlow异常的方法 …...

Java核心书籍1

1.《Java核心技术》是一本深入浅出的Java编程指南&#xff0c;适合初学者和有一定Java编程基础的读者。这本书的主要作者是Cay S. Horstmann和Gary Cornell&#xff0c;他们都是Java领域的知名专家。这本书的最新版本是第10版&#xff0c;其中涵盖了Java SE 9、10和11的新特性&…...

crontab详细用法 定时任务

使用crontab可以在指定时间执行一个shell脚本或者一系列Linux命令 crontab的使用方法 方法1.使用crontab命令 例如添加一个新的或者编辑已有的,使用: crontab -e就可以进入配置文件.此时配置crontab的执行者是当前登入用户,如果当前有用户是root,需要为其他用户配置,可以使用…...

基于ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局

查看原文>>>基于ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局 目录 第一章、生态安全评价理论及方法介绍 第二章、平台基础 第三章、数据获取与清洗 第四章、基于USLE模型的土壤侵蚀评价 第五章、基于风蚀修正模型的防风固…...

开心档之MySQL 创建数据类型

MySQL 数据类型 MySQL 中定义数据字段的类型对你数据库的优化是非常重要的。 MySQL 支持多种类型&#xff0c;大致可以分为三类&#xff1a;数值、日期/时间和字符串(字符)类型。 数值类型 MySQL 支持所有标准 SQL 数值数据类型。 这些类型包括严格数值数据类型(INTEGER、S…...

【C++ Primer(第5版) 课后习题题目及答案 第一章】

C Primer5th 课后习题答案 第一章 1.1&#xff1a;查阅你使用的编译器的文档&#xff0c;确定它所使用的文件命名约定。编译并运行main程序。1.2&#xff1a;改写程序&#xff0c;让它返回-1。返回值-1通常被当作程序错误的标识。重新编译并运行你的程序&#xff0c;观察你的系…...

【英语】100个句子记完7000个托福单词

其实主要的7000词其实是在主题归纳里面&#xff0c;不过过一遍100个句子也挺好的&#xff0c;反正也不多。 文章目录 Sentence 01Sentence 02Sentence 03Sentence 04Sentence 05Sentence 06Sentence 07Sentence 08Sentence 09Sentence 10Sentence 11Sentence 12Sentence 13Sent…...

六、CANdelaStudio入门-通信参数编辑

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的通信参数编辑,欢迎各位朋友订阅、评论,…...

【致敬未来的攻城狮计划】— 连续打卡第十三天:FSP固件库开发启动文件详解

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…...

Java中mybatis是否支持延迟加载?延迟加载的原理是什么?

是的&#xff0c;MyBatis支持延迟加载。延迟加载是指在查询对象时&#xff0c;只加载其基本属性&#xff0c;而将关联对象的数据暂不加载&#xff0c;等到真正需要使用关联对象时再去查询加载其数据的一种技术。 MyBatis通过在映射文件中配置lazyLoadingEnabled属性来开启延迟加…...

真题详解(磁盘)-软件设计(五十八)

真题详解&#xff08;MTTR&#xff09;-软件设计&#xff08;五十七)https://blog.csdn.net/ke1ying/article/details/130354940 1、2021年上半年 解析&#xff1a; 哈希地址 0 1 2 3 4 5 6 7 8 9 10 构建哈希表 第一步&#xff1a;3%11 3 &#xff0c;放在哈希地址3的位置…...

MATLAB连续时间信号的实现和时域基本运算(八)

1、实验目的&#xff1a; 1&#xff09;熟悉常用连续时间信号的实现方法&#xff1b; 2&#xff09;掌握连续时间信号的时域基本运算&#xff1b; 3&#xff09;掌握实现基本函数及其运算的函数的使用方法&#xff1b; 4&#xff09;加深对信号基本运算的理解。 2、实验内容&am…...

MongoDB 聚合管道中使用字符串表达式运算符

字符串表达式运算符主要用于实现字符串操作&#xff0c;主要包括了大小写转换、字符串截取、拼接、替换等 一、准备工作 初始化字符串数据 db.strings.insertMany([{ "_id": "1", "comment": " Abc" },{ "_id": "2&…...

用Python分析周杰伦歌曲并进行数据可视化

大家好&#xff0c;今天我们用python分析下周杰伦歌曲。为了尽量完整地呈现从原始数据到可视化的过程&#xff0c;接下来我们会先简单讲解数据的预处理过程&#xff0c;即如何将 JSON 数据转化为Excel 格式&#xff0c;以及如何对周杰伦的歌曲进行分词。 本案例中的歌词数据来…...

培训技能 GET

技巧 调整语速和语调&#xff1a;讲解者需要注意语速和语调的调整&#xff0c;以便让听众更好地理解和接受内容。 使用案例和实例&#xff1a;讲解者可以使用案例和实例来帮助听众更好地理解和记忆内容&#xff0c;同时也可以增强听众的兴趣和参与度。 互动式讲解&#xff1a…...

数据库安全性案例分享

1 概述1.1 适用范围 本规范明确了Oracle数据库安全配置方面的基本要求。 1.2 符号和缩略语 缩写 英文描述 中文描述 DBA Database Administrator 数据库管理员 VPD Virtual Private Database 虚拟专用数据库 OLS Oracle Label Security Oracle标签…...

2023,你了解Kafka吗?深入详解

- 消息队列的核心价值 - 解耦合。 异步处理 例如电商平台&#xff0c;秒杀活动。一般流程会分为&#xff1a;1: 风险控制、2&#xff1a;库存锁定、3&#xff1a;生成订单、4&#xff1a;短信通知、5&#xff1a;更新数据。 通过消息系统将秒杀活动业务拆分开&#x…...

奇舞周刊第 491 期 初探 Web 客户端追踪技术

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 初探 Web 客户端追踪技术 浏览器的追踪技术是一把双刃剑&#xff0c;它建立了用户个人信息和网站之间的连接&#xff0c;合理地使用能够大大提高用户的体验&#xff0c;但是同时也…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...