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

news2024/10/7 17:36:50

前言

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

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

其实这一切都得益于一个技术的诞生与发展:物联网(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        5

ALIGN(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

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

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

相关文章

eBPF的发展演进---从石器时代到成为神(二)

3. 发展溯源 回顾技术的发展过程&#xff0c;就像观看非洲大草原日出日落一样&#xff0c;宏大的过程让人感动&#xff0c;细节部分引人深思。每天循环不辍&#xff0c;却又每天不同。 BPF的应用早已超越了它最初的设计&#xff0c;但如果要追溯BPF最初的来源&#xff0c;则必…

nginx(七十一)root、alias、index、try_files关系指令再探

一 root、alias、index、try_files辨析 说明&#xff1a; 这个系列很适合前端人员进阶学习 ① 前言回顾 try_files基础知识 配置try_files实现内容重定向 root和alias指令辨析 ​强调&#xff1a; 1) index只能处理以/结尾的请求2) ​index指令有点在location中判断请…

chatGPT账号apikey码-chatGPT 免费APIKEY

ChatGPT API Key免费吗 ChatGPT使用的API密钥可以免费获取&#xff0c;但是其使用可能会受到一些限制。具体而言&#xff0c;根据你所使用的API提供者和服务级别&#xff0c;免费的API密钥可能会受到以下限制&#xff1a; 次数限制&#xff1a;某些API可能会限制您的API调用次…

Centos 磁盘根目录扩容

Centos磁盘根目录扩容 1.扩容前检查 命令: df -Th or df -h 我们要扩张磁盘空间的就是挂载点为:/ (的这个) 2.添加sda磁盘空间查询磁盘 命令&#xff1a; fdisk -l 其实&#xff0c;我们可以将sda的磁盘新增空间分配给处于sda的 / 挂载目录 也可以跨磁盘将sdb(新磁盘…

约瑟夫环的三种解法(循环链表、数组和用数组模拟链表)

目录 前言 一、用循环链表实现 二、用数组实现 三、用数组模拟链表实现 前言 题目描述&#xff1a; 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后&#xff0c;只剩下一个人&am…

dockerfile传参问题和权限问题

dockerfile传参问题和权限问题 一、docker传参 在工作中&#xff0c;使用dockerfile构建镜像的时候&#xff0c;随着业务越来越多&#xff0c;流水线也越来越多&#xff0c;这时候就需要构建一些通用流水线&#xff0c;而通用流水线最大的问题&#xff0c;就是需要传递参数&a…

Linux基础命令和程序部署

Linux基础命令 ls 可以查看当前目录内容ls 后面跟上一个具体路径可以查看指定目录内容ls -l 可以以列表的形式查看&#xff0c;缩写llpwd 查看当前目录的绝对路径cd 切换目录&#xff08;就是window界面的鼠标双击目录进入动作&#xff09;&#xff0c;cd在切换目录时后面可以…

【教学类-34-05】拼图(彩色图片+圆角凹凸拼图)3*4格子(中班主题《个别化拼图》偏美术)

图片展示&#xff1a; 背景需求&#xff1a; 最近班级孩子得了传染病&#xff0c;来了2位孩子。 我觉得&#xff1a;人少的话&#xff0c;孩子们就有充足的时间去拼那些带有凹凸槽的自制彩色图形拼图。 难点&#xff1a; 1、从直线剪切&#xff08;方形拼图&#xff09;转…

Flink Join操作

目录 DataStream API&#xff08;函数编程&#xff09; window Join join coGroup interval Join Table API&#xff08;flink sql) Reguler Join (常规join) inner join left join / right join full join interval join lookup join Window Join INNER/LEFT/RIG…

摄像头录像软件哪款好用?这款就很不错

案例&#xff1a;录屏时怎么录电脑摄像头&#xff1f; 【很多时候我不仅仅需要录制电脑屏幕&#xff0c;还需要在录屏时录入人像&#xff0c;可是我的录屏软件不支持录制人脸。有没有好用的电脑录屏带人脸的屏幕录制工具介绍&#xff1f;】 无论是教学、游戏直播、软件开发、…

HTML + CSS + JS 利用邮编查询 API 实现邮编查询工具

引言 邮政编码是地址信息的重要组成部分&#xff0c;可以帮助快递公司、物流公司等对地址进行快速、准确的识别和派送。因此&#xff0c;邮编查询工具应用在许多业务场景中都有广泛的应用&#xff0c;例如&#xff1a;电商平台、物流公司、金融机构等。通过使用邮编查询 API&a…

fiddler在请求头添加指定信息

下图所示&#xff0c;设置完请求头信息后&#xff0c;点击右上角Actions按钮的Run Filterset now保存信息&#xff0c;即可。

centos7部署FastDFS服务

一、安装需要的相关依赖 yum -y install make cmake gcc gcc-c 因为我的服务器已经安装了gcc&#xff0c;所以略去 使用gcc -v查看版本 yum -y install zip unzip 安装性能事件通知库 yum -y install libevent 安装nginx依赖 yum -y install libevent yum -y install zli…

MITA触摸屏维修WP4053米塔工控机控制屏维修

MITA-TEKNIK米塔触摸屏维修工控机工控屏控制器维修DISPLAY 2COM全系列型号 Mita-Teknik触摸屏维修常见故障&#xff1a;上电无显示&#xff0c;运行报故障&#xff0c;无法与电脑通讯&#xff0c;触摸无反应&#xff0c;触控板破裂&#xff0c;触摸玻璃&#xff0c;上电黑屏&a…

自动化工具 接口自动化测试引擎

一、前言&#xff1a; 1、解决痛点&#xff1a;接口自动化测试用例需要人去开发、去维护。 2、实现第一性原理&#xff1a;根据定义的测试策略自动生成接口测试用例。 二、引擎优势&#xff1a; 1、提升人效&#xff1a;降低传统方式中接口测试开发与维护的工作量。 2、覆盖更…

输电线路在线监拍设备的国网协议对接方案

疫情过后&#xff0c;尤其山东淄博电力建设的发展&#xff0c;电网规模的不断研发&#xff0c;高压远距离架空输电线路日益增多&#xff0c;在复杂地形条件下的电网建设和设备维护工作也越来越多。 如何解决4G模块控制的功耗&#xff0c;和信号传输方面有一套完整的方案。基于合…

【网络安全】红队基础免杀

引言 本文主要介绍“反射型 dll 注入”及“柔性加载”技术。 反射型 dll 注入 为什么需要反射型 dll 注入 常规的 dll 注入代码如下&#xff1a; int main(int argc, char *argv[]) {HANDLE processHandle;PVOID remoteBuffer;wchar_t dllPath[] TEXT("C:\\experime…

从源码全面解析LinkedBlockingQueue的来龙去脉

一、引言 并发编程在互联网技术使用如此广泛&#xff0c;几乎所有的后端技术面试官都要在并发编程的使用和原理方面对小伙伴们进行 360 的刁难。 二、使用 对于阻塞队列&#xff0c;想必大家应该都不陌生&#xff0c;我们这里简单的介绍一下&#xff0c;对于 Java 里面的阻塞…

【 SpringBoot 统⼀功能处理 】

文章目录 引言一、⽤户登录权限效验Spring 拦截器拦截器实现原理扩展&#xff1a;统⼀访问前缀添加 二、统⼀异常处理三、统⼀数据返回格式四、ControllerAdvice 源码分析 引言 接下来是 Spring Boot 统⼀功能处理模块&#xff0c;是 AOP 的实战环节&#xff0c;要实现的课程⽬…

轨道交通信号系统的可靠性与安全性

01.引言 城市轨道交通系统作为大容量公共交通工具&#xff0c;其安全性直接关系到广大乘客的生命安全&#xff0c;所以要求城市轨道交通系统在如此高的运行密度下&#xff0c;还要保证安全和高效率的运行。而信号系统作为保证列车安全、正点、便捷、舒适、高密度不间断运行的重…