RT-Thread——概述与体验_~Old的博客-程序员秘密

技术标签: stm32  实时操作系统  RT-Thread  嵌入式硬件  

目录

1、RT-Thead目录结构

1.2 核心文件

1.3 移植时涉及的文件

1.3.1 CPU部分

1.3.2 BSP部分、

1.4 内存管理

1.5 启动流程及main函数

1.5.1 启动流程

1.5.2 移植目录结构

1.6 RT-Thread编程规范

1.7 手把手教你移植RT-Thread到STM32


1、RT-Thead目录结构

以RT-Thread Nano的源码结构为例子:

主要涉及3个目录

  • bsp
    • bsp目录下是各单板的板级支持包(Board support package),即针对某个特定单板兼容适配的工程。比如ST官方公板:stm32f407-st-duscovery
    • 移植时,需要针对特定单板适配串口端口、GPIO等
  • libcpu
    • 为了在不同CPU架构芯片上运行,RT-Thread提供libcpu抽象层对内核提供统一接口,包括全局中断开关、线程初始化等。
    •  移植时,需要针对特地CPU架构实现全局中断开关、线程上下文切换等, 
  • src
  • RT-Thread的核心文件

1.2 核心文件

以理解使用RT-Thread为目标的话,最核心的文件只有5个:

src\thread.c

src\timer.c

src\scheduler.c

src\ipc.c

include\rtservice.h

这些文件的作用列表如下:

重要的文件         作用
src\thread.c        线程相关的文件,比如创建线程、启动线程
src\timer.c 定时器相关的文件        
src\scheduler.c 调度器:维护线程的就绪链表、提供临界区的进出函数
src\ipc.c 实现了线程间通信的各类对象:消息队列、信号量、互斥量、事件等
include\rtservice.h 提供链表操作

1.3 移植时涉及的文件

移植RT-Thread,包含CPU部分移植和BSP部分移植

1.3.1 CPU部分

CPU部分移植就是移植libcpu目录,主要涉及cpuport.c和context.xx.S

比如:libcpu\arm\contex-m3\cpuport.c和context_rvds.S,这表示Context-M3架构在RVDS或Keil工具上的移植文件

  • cpuport.c:主要用类初始化线程的栈
  • context_rvds,S:主要线程切换、全局中断开关

如果,RT-Thread还没支持你使用的CPU,你才需要实现这两个文件。

一般来说,对于大部分的CPU,RT-Thread都已经支持,不需要我们移植

1.3.2 BSP部分、

BSP就是Board Support Package,板级支持包,就是开发板的相关文件

BSP部分主要涉及main.c board.c和rtconfig.h

比如:bsp\stm32\stm32f103-simulator目录下,包含applications\main.c、board\board.c、和rtconfig.h

  • main.c:工程的主函数入口
  • board.c:该单板的系统时钟相关配置
  • rtconfig.h:内核配置文件,配置裁剪系统功能

1.4 内存管理

RT-Thread操作系统在内存管理上,根据上层应用及系统资源的不同,有针对性地提出了不同的内存分配管理算法

总体上可以分为3类:内存堆管理和内存池管理,而内存对管理又根据具体内存设备划分为三种情况

总结起来就是:

内存堆管理:它可以分为3种,三种只能选择一种

针对小内存块的分配管理算法(小内存管理算法):src\mem.c

针对大内存块的分配管理算法:(slab管理算法):src\slab.c

针对多内存堆的分配情况(memheap管理算法):src\memheap.c

内存池管理:先从内存堆里申请空间、然后进行二次管理,对应文件src\memppool.c

注意:

src\mem.c、src\slab.c、src\memheap.c这三个文件只能选择一个文件

src\mempool.c:先从堆里分配的到一块内存,把这块内存当作内存池

1.5 启动流程及main函数

1.5.1 启动流程

RT-Thread启动流程如下所示,在图中标出颜色的部分需要用户特别注意(黄色表示libcpu移植相关的内容,绿色部分表示板级移植相关的内容)

RT-Thread启动代码统一入口为rtthread_startup(),芯片启动文件在完成必要工作(初始化时钟、配置中断向量表、初始化堆栈、初始化PC指针、调用C库函数-main最终去到C的世界)后,最终会在程序跳转市,跳转至RT-Thread的启动入口中,RT-Thread的启动流程如下;

1、全局关中断,初始化与系统相关的硬件、

2、打印系统版本信息、初始化系统内核对象(如定时器、调度器)

3、初始化用户 main线程,同时会初始化线程栈,在main线程中对各类模块依次进行初始化、

4、初始化软件定时器线程、初始化空闲线程、

5、启动调度器,系统切换到第一个线程开始执行(如mian)线程,并打开全局中断

我们习惯从main函数开始阅读源码,但是RT-Thread的主要启动流程反而不在main函数里

可以分析看到,在stm32的启动代码中,先调用SystemInit:系统初始化、比如初始化时钟,调用__main函数:重定位,比如把代码段从Flash复制到内存,然后执行$Sub$$main

第二个文件:src\components.c:执行一系列的 初始化,调用rt_application_init(初始化RTT组件包括创建SHEEL线程:因为有SHEEL线程,所以即使main函数为空,也是可以操作开发板的),调用main函数:可以写为空函数;启动调度器:rt_system_scheduler_start

整体启动流程详细可以见上图

1.5.2 移植目录结构

这里不详细展开,RT-Thread的官方文档中有详细的说明

Nano 移植原理 (rt-thread.org)

1.6 RT-Thread编程规范

官方的代码风格和编程风格文档如下:

documentation/contribution_guide/coding_style_cn.md · RT-Thread/rt-thread - Gitee.com

1.7 手把手教你移植RT-Thread到STM32

最后在添加一个个人认为比较详细的将RT-Thread移植到STM32上的博客,本人亲测有效

(4条消息) 手把手教你移植RT-Thread系统_嵌入式@hxydj的博客-程序员秘密_rt-thread

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43460068/article/details/126872875

智能推荐

php 5.3.9 thread safe,PHP5.3的VC9、VC6、Thread Safe、Non Thread Safe的差别_weixin_39876650的博客-程序员秘密

PHP一共给了四个版本,VC9 x86 Non Thread Safe、VC9 x86 Thread Safe、VC6 x86 Non Thread Safe、VC6 x86 Thread Safe,这让我这个菜鸟头疼啊,还好 PHP 官网供给的处所左边有个英文 choose 我看懂了,我估摸着就是如何来选择版本的意思吧,于是开端查字典及上彀查找,终于看熟悉打听了具体意思,拿来做个备忘先。一、如何...

Android 11 R 调用系统剪切图片 crop_Dullyoung的博客-程序员秘密

针对android 11 intent1.setDataAndType(uri, “image/*”);,如果是7.0及以上的系统使用FileProvider的方式创建一个Uri,7一下 Uri.fromFile,不要传cut.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));//保存到uri指定的位置,指定位置就剪切不了,不指定位置 在onAcrivityResult里面data.getdata就可以获取到uri,然后用Glide.asfile就可

css 中 /deep/ 的使用_css deep_星星的泪痕的博客-程序员秘密

vue中组件的样式是有作用域的,默认是全局样式。如果不希望当前组件中的样式影响到别的组件,可以添加作用域。通过给style添加 scoped<style scoped></style>在有作用域的组件中如何给子组件设置样式?默认只能作用到子组件的根节点(组件的class 默认作用到组件的根节点)使用子组件的根节点本身的class类名如果是第三方组件,不知道它的根节点的类名,那就审查元素查看,或者添加一个类名//APP.vue<style sc

面试题、例题、知识点 汇总_weixin_33696822的博客-程序员秘密

centos 7 卸载 mariadb 的正确命令列出所有被安装的rpm package rpm -qa | grep mariadb卸载 rpm -e mariadb-libs-5.5.37-1.el7_0.x86_64错误:依赖检测失败:libmysqlclient.so.18()(64bit) 被 (已安裝) postfix-2:2.10.1-6.el7.x86_64 需要强制卸载...

NPM 使用介绍_WGH100817的博客-程序员秘密

转载自:https://blog.csdn.net/qq_27626333/article/details/52304091NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:(1)、允许用户从NPM服务器下载别人编写的第三方包到本地使用。(2)、允许用户从NPM...

随便推点

富文本编辑器漏洞_weixin_33851604的博客-程序员秘密

.net 一般的富文本编辑器都是使用 一般处理程序上传图片或者文件的 那么黑客就可以利用开发者的疏忽(没有判断权限)直接通过伪造表单上传经过他更改过的木马文件 伪装成.jpg(各种图片格式)。提交上传完成之后只要访问一下这个路径(上传完成后会返回)以上就是没有加权限判断导致的。任何人都能通过富文本编辑器上传文件为了防止这样事情的发生,我们做一下调整我...

Python爬取近十年编程语言热度数据并可视化可视化_IT农民工1的博客-程序员秘密

公众号后台回复“图书“,了解更多号主新书内容作者:叶庭云来源:早起Python本文介绍如何利用requests+正则表达式爬取TIOBE编程语言热度数据,并使用????openpyx...

SQL&MySQL 查询添加字段为行号_yyfq521的博客-程序员秘密

SQL:点击(此处)折叠或打开select row_number() over(partition by name order by col desc) ,* from table;函数“row_number”必须有使用 ORDER BY 的 OVER 子句,按照字段col来排列自动取值partition by name order by

python的类程序的结构_Python程序员学习路径之数据结构篇_weixin_39638012的博客-程序员秘密

原标题:Python程序员学习路径之数据结构篇点击标题下「异步图书」可快速关注在计算机科学中,数据结构是一门进阶性课程,概念抽象,难度较大。Python语言的语法简单,交互性强。用Python来讲解数据结构等主题,比C语言等实现起来更为容易,更为清晰。而对于自学Python的朋友往往会遇到数据结构的问题,和所有的现代编程语言一样,Python也有大量的功能和构造。然而,Python是少数的几种基本...

Exploring Visual Relationship for Image Captioning_土豆面炸鸡饭的博客-程序员秘密

原论文名称:Exploring Visual Relationship for Image Captioning作者:Ting Yao, Yingwei Pan, Yehao Li, and Tao Mei论文地址摘要人们总是相信,对象之间的建模关系将有助于表示和最终描述图像。然而,没有现有技术支持从建模对象关系出发进行image caption生成。在本文中,介绍了一种新的设计-...

es6 类,继承,原型链_揭开ES6类和原型继承的神秘面纱_culiu9261的博客-程序员秘密

es6 类,继承,原型链In the early history of the JavaScript language, a cloud of animosity formed over the lack of a proper syntax for defining classes like in most object oriented languages. It wasn’t until t...

推荐文章

热门文章

相关标签