RT-Thread

RT-Thread

RT-Thread 版权属于上海睿赛德电子科技有限公司,于 2006年 1月首次发布,初始版 本号为0.1.0,经过 10来年的发展,如今主版本号已经升级到3.0,累计开发者达到数百万, 在各行各业产品中装机量达到了惊人的2000多万,占据国产RTOS的鳌头。


在接触RT-Thread之前我已经深入学习过FreeRTOS实时操作系统,感觉这些操作系统的形式都大差不差,自认为无非是各种功能的函数名字不一样,时间片的实现,启动流程有些许不同。

RT-Thread和FreeRTOS类似,都拥有线程管理(在RT-Thread中叫线程,在FreeRTOS中叫任务),消息队列,信号量(二值,计数),互斥量,事件,软件定时器,内存管理,中断管理。比

FreeRTOS多了个邮箱(目前看来根据野火的源码分析,感觉和消息队列功能差不多)。


 启动流程

接下来讲一下RT-Thread的启动流程

当你拿到一个移植好的 RT-Thread工程的时候,你去看 main函数,只能在 main函数 里面看到创建线程和启动线程的代码,硬件初始化,系统初始化,启动调度器等信息都看 不到

那是因为RT-Thread拓展了main函数,在main函数之前把这些工作都做好了。

我们知道,在系统上电的时候第一个执行的是启动文件里面由汇编编写的复位函数 Reset_Handler。复位函数的最后会调用 C 库函数__main,__main 函数的主要工作是初始化系统的堆和栈,最后调用 C 中 的main函数,从而去到C的世界。

执行完__main之后,并不是跳转到C 中的main函数,而是跳转到component.c中的$Sub$$main函数,这是为什么?因为RT Thread使用编译器(这里仅讲解KEIL,IAR或者GCC稍微有点区别,但是原理是一样的) 自带的$Sub$$和$Super$$这两个符号来扩展了main函数。

使用$Sub$$main可以在执行 main之前先执行$Sub$$main,在$Sub$$main函数中我们可以先执行一些预操作,当做完这 些预操作之后最终还是要执行main函数。

这个就通过调用$Super$$main来实现。当需要扩展的函数不是main的时候,只需要将main换成你要扩展的函数名即可,即$Sub$$function 和$Super$$function。(mdk的扩展功能)


首先执行$Sub$$main函数,在其中包含的内容有:

  1. 关闭中断,除了硬FAULT和NMI可以响应外,其它统统关掉。
  2.  执行rtthread_startup()函数。

rtthread_startup()函数

RT-Thread 启动的时候会调用一个名为 rt_hw_board_init()的函数, 从函数名称我们可以知道它是用来初始化开发板硬件的,需要把硬件相关的初始化都放在 rt_hw_board_int()函数里面完成,比如时钟,比如串口等,具体初 始化什么由用户选择。

当这些硬件初始化好之后,RT-Thread 才继续往下启动,(就是把各种外设初始化放在这个函数之中去执行),RT-Thread该函数需要我们在board.c中自己编写。


由图片可见,在rtthread_startup()函数中先是关闭中断,板级硬件初始化。打印RT-Thread的版本号(要想成功打印,必须重映射一个控制台到rt_kprintf函数  )后面进行定时器,调度器,信号的初始化

最终创建一个初始线程。这个初始线程类似于FREERTOS中的创建任务的任务,就是在这个任务中去创建工程所用到的所有的任务。


RT-Thread的启动流程是这样的: 即先创建一个初始线程,等调度器启动之后,在这个初始线程里面创建各种应用线程,当 所有应用线程都成功创建好后,初始线程就把自己关闭。那么这个初始线程就在 rt_application_init()里面创建。

该函数也在component.c里面定义,我们可以去component.c中修改,一般情况下是在rt_application_init()中创建main主函数的线程,在main主函数线程中去创建其他的线程,其中硬件各种外设的初始化已经在rt_hw_board_int()中完成了,所以main主函数中只需要去创建其他的线程就可以了。


rt_application_init()函数     

在这个函数中判断使用静态还是动态方法创建main线程,也就是void  main_thread_entry(void*parameter),并初始化相关参数。


void  main_thread_entry(void*parameter)

在main主函数线程中除了调用rt_components_init()函数进行 RT-Thread的组件初始化外,最终是调用main的扩展函数$Super$$main()回到main函数。

这个是必须的,因为我们一开始在进入main函数之前,通过$Sub$$main()函数扩展了main 函数,做了一些硬件初始化,RTOS系统初始化的工作,当这些工作做完之后最终还是要 回到main函数,那只能通过调用$Super$$main()函数来实现。$Sub$$和$Super$$是MDK 自带的用来扩展函数的符号,通常是成对使用。


main函数执行到最后,通过LR寄存器指定的链接地址退出,在 创建main线程的时候,线程栈对应LR寄存器的内容是rt_thread_exit()函数,在 rt_thread_exit里面会把main线程占用的内存空间都释放掉。

至此,结束了,RT-Thread的整个启动流程。

在我看来这也是RT-Thread和FreeRTOS的主要区别。


重映射串口到rt_kprintf函数

在RT-Thread中,有一个打印函数rt_kprintf()供用户使用,方便在调试的时候输出各 种信息。如果要想使用rt_kprintf(),则必须将控制台重映射到rt_kprintf(),这个控制台可以 是串口、CAN、USB、以太网等输出设备,用的最多的就是串口,


SysTick_Handler()

这一部分是rtthread用于更新时基,实现时间片的功能代码。将这一部分直接放在SysTick_Handler()中执行。


在线程里面的延时函数必须使用RT-Thread里面提供的延时函数,并 不能使用我们裸机编程中的那种延时。这两种的延时的区别是RT-Thread里面的延时是阻 塞延时,

即调用rt_thread_delay()函数的时候,当前线程会被挂起,调度器会切换到其它就 绪的线程,从而实现多线程。如果还是使用裸机编程中的那种延时,那么整个线程就成为 了一个死循环,如果恰好该线程的优先级是最高的,那么系统永远都是在这个线程中运行, 根本无法实现多线程。

该特性在所有操作系统都是一样的,可以在所有外设初始化的时候使用delay,在任务或者线程中只能使用操作系统提供的延时函数。

关于RT-Thread的其他系统功能,其实和FreeRTOS差不多,总而言之还是去查询API函数的使用方法在工程中。感觉掌握了一款实时操作系统其他的操作系统入门相对来说也更加容易了。

共勉,绝望之为虚妄,正与希望相对。我的理解是现实有多绝望的同时,希望就有多大!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

zabbix“专家坐诊”第241期问答

问题一 Q:华为交换机的100GE 1/0/1口的光模块收光值监测不到,有没有人碰到过这个问题呢?其他的端口都能监测到收光值,但是100GE 1/0/1口监测不到收光值。底层能查到,zabbix 6.0监控不到,以下是端口的报错信…

引用(C++)和内联函数

前言&#xff1a;本文主要讲解C语法中引用如何使用和使用时的一些技巧 基本语法 引用就是取别名 #include <iostream> using namespace std; int main() {int a 10;int& b a;//给a取别名为bcout << a << endl;cout << b << endl;return 0…

Apple开发者macOS描述文件创建

1.选择Profiles然后点击加号创建 2.选择类型为macOS App Development然后点击继续 3.选择描述类型与App ID 然后点击继续 4.选择证书然后点击继续 5.选择设备,然后点击继续 6.输入描述文件后,点击生成 生成成功,点击下载描述文件 下载完成会自动打开描述文件

1.Rust安装

目录 一、安装1.1 在Windows上安装1.2 在Linux下安装 二、包管理工具三、Hello World3.1 安装IDE3.2 输出Hello World 一、安装 1.1 在Windows上安装 点击页面 安装 Rust - Rust 程序设计语言 (rust-lang.org)&#xff0c;选择"下载RUSTUP-INIT.EXE(64位&#xff09;&qu…

一.网络基础——OSI七层模型

一.OSI七层模型 OSI&#xff08;Open System Interconnection&#xff0c;开放系统互连&#xff09;七层网络模型被称为开放式系统互联参考模型&#xff0c;它是一个逻辑上的定义和规范; 它把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备&#xff0c;比如路由器&…

SpringBoot高手之路04-Aop

文章目录 AOP 基础AOP概述start依赖,开发某一个功能,只需要下载这一个依赖,关于他的依赖都会下载下来 AOP快速入门AOP核心概念 切入点表达式-execution AOP 基础 AOP概述 AOP 对特定的方法做增强 AOP 快速入门 start依赖,开发某一个功能,只需要下载这一个依赖,关于他的依赖…

python数据文件处理库-pandas

内容目录 一、pandas介绍二、数据加载和写出三、数据清洗四、数据转换五、数据查询和筛选六、数据统计七、数据可视化 pandas 是一个 Python提供的快速、灵活的数据结构处理包&#xff0c;让“关系型”或“标记型”数据的交互既简单又直观。 官网地址: https://pandas.pydata.o…

Polar Web 【简单】- 被黑掉的站

Polar Web 【简单】- 被黑掉的站 Contents Polar Web 【简单】- 被黑掉的站思路EXP运行&总结 思路 如题目所述&#xff0c;这是一个被黑掉的站点&#xff0c;由此不禁要了解该黑客发现了哪些可以入手的路径&#xff0c;或是留下了什么样的文件供持续访问。 目录扫描该站点发…

AI和机器人引领新一轮农业革命

AI和机器人技术在农业领域的应用正在迅速发展&#xff0c;未来它们可能会实现厘米级精度的自主耕作。 精确种植&#xff1a;AI算法可以分析土壤条件、气候数据和作物生长周期&#xff0c;以决定最佳种植地点和时间。 土壤管理&#xff1a;利用传感器和机器学习&#xff0c;机器…

Windows安装运行elasticsearch服务

官方下载地址&#xff1a;Download Elasticsearch | Elastic 我在linux上执行的下载命令&#xff1a;wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.5.3-linux-x86_64.tar.gz Elasticsearch&#xff08;简称ES&#xff09;是一款基于Apache Lu…

JVM学习-Arthas

Arthas Alibaba开源的Java诊断工具&#xff0c;在线排查问题&#xff0c;无需重启&#xff0c;动态跟踪Java代码&#xff0c;实时监控JVM状态Arthas支持JDK6&#xff0c;支持Linux/Mac/Windows&#xff0c;采用命令行交互模式&#xff0c;同时提供丰富的Tab自动补全功能&#…

前端传参数后端变量类型能够接受到List却无法接收到值

问题描述 今天写了个接口&#xff0c;下图所示 ReqVO里是这样的&#xff1a; 然后前端去请求&#xff0c;从请求结果中看发现这里值是在的&#xff08;有经验的可能就看出来了otherInfo.id: 这样以参数后端是接收不到的&#xff0c;但是当时没发现&#xff09; 传进来后端…

【cmake】cmake cache

cmake cache是什么 cmake cache是cmake在配置好后生成的一个CMakeCache.txt的文件&#xff0c;里面存储了一堆变量&#xff0c;这些变量一般都是关于项目的配置和环境的。 比如你用的什么编译器&#xff0c;编译器选项&#xff0c;还有项目目录。 例如&#xff08;在cmakelist…

uniAPP @input时报错

<input :maxlength"8" v-model"item.value" placeholder"请输入金额" input"inputFn" /> 这些些时会报以下错误 定位了好久之后发现input不支持 v-model和input一起使用 改成以下这般就正常啦 <input :maxlength"8&q…

【Cityengine】Cityengine生产带纹理的建筑模型导入UE4/UE5(下)

【Cityengine】Cityengine生产带纹理的建筑模型导入UE4/UE5&#xff08;下&#xff09; 一、导出数据&#xff08;2022中文版案例&#xff09;二、安装datasmith插件三、导入数据四、检查导入材质是否正常五、编辑替换材质六、安装模型编辑插件七、编辑替换建筑规则 一、导出数…

⌈ 传知代码 ⌋ 辅助任务改进社交帖子多模态分类

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

WPS表格插件方方格子【凑数】功能:选出和等于固定数字的数

文章目录 后来发现可以下载方方格子插件&#xff0c;使用【凑数】功能https://ffcell.lanzouj.com/iwhfc1kjhayh【凑数】快速【凑数】 导师让沾发票&#xff0c;需要选出若干个数额的发票&#xff0c;使它们的和等于一个指定数。不知道怎么办了&#xff0c;查了一下&#xff0c…

实验9 浮动静态路由配置

--名称-- 一、 原理描述二、 实验目的三、 实验内容四、 实验配置五、 实验步骤 一、 原理描述 浮动静态路由也是一种特殊的静态路由&#xff0c;主要考虑链路冗余。浮动静态路由通过配置一条比主路由优先级低的静态路由&#xff0c;用于保证在主路由失效的情况下&#xff0c;…

为什么我们需要在软件本地化过程中使用术语服务?

你知道软件翻译和本地化的术语服务吗&#xff1f;此解决方案涵盖源术语和目标术语的创建、开发和维护。所有术语都存储在具有多个字段的数据库中&#xff0c;包括术语定义、用法示例、上下文和历史记录。这使我们能够正确处理每个术语的创建或更改请求&#xff0c;避免创建重复…

orbslam2代码解读(1):数据预处理过程

写orbslam2代码解读文章的初衷 首先最近陆陆续续花了一两周时间学习视觉slam&#xff0c;因为之前主要是做激光slam&#xff0c;有一定基础所以学的也比较快&#xff0c;也是看完了视觉14讲的后端后直接看orbslam2的课&#xff0c;看的cvlife的课&#xff08;课里大部分是代码…