【MCU学习】RTthread工程介绍

RT-Thread架构

RT-Thread诞生于2006年,是一款以开源、中立、社区化发展起来的物联网操作系统。 RT-Thread主要采用 C 语言编写,浅显易懂,且具有方便移植的特性(可快速移植到多种主流 MCU 及模组芯片上)。RT-Thread把面向对象的设计方法应用到实时系统设计中,使得代码风格优雅、架构清晰、系统模块化并且可裁剪性非常好。

RT-Thread有完整版和Nano版,对于资源受限的微控制器(MCU)系统,可通过简单易用的工具,裁剪出仅需要 3KB Flash、1.2KB RAM 内存资源的 NANO 内核版本;而相对资源丰富的物联网设备,可使用RT-Thread完整版,通过在线的软件包管理工具,配合系统配置工具实现直观快速的模块化裁剪,并且可以无缝地导入丰富的软件功能包,实现类似 Android 的图形界面及触摸滑动效果、智能语音交互效果等复杂功能。
RT-Thread是一个集实时操作系统(RTOS)内核、中间件组件的物联网操作系统,架构如下:
在这里插入图片描述

APP:
业务层代码库,主要代码为业务逻辑。例如LCD控制板业务,超声波板业务,拖地机业务,扫地机业务,吹风机业务,等。

Board:
项目配置;每一个项目,都会根据需求,针对bsp,app,components进行组件选择,然后生成统一的rtconfig.h,以及board_xxx_config.h;

Bsp:
不同的芯片平台,例如GD32F103,STM32F407等;

Components:
硬件无关的纯软代码;设备抽象的纯软代码;

Include:
Src:rtthread操作系统源代码(不需要阅读);

名称描述
BSPBoard Support Package(板级支持包)基于各种开发板的移植
componentsRT-Thread 的各个组件代码,例如 finsh,gui 等。
documentation相关文档,如编码规范等
examples相关示例代码
includeRT-Thread 内核的头文件。
libcpu各类芯片的移植代码。
srcRT-Thread 内核的源文件。
toolsRT-Thread 命令构建工具的脚本文件。

系统编译

首先,安装env,下载源代码,进入board的项目目录下:

menuconfig               //选择组件,配置参数
scons --target=mdk5      //生成keil5的工程
scons                    //使用scons工具链编译

Menuconfig

menuconfig用于配置模块是否编译进系统,以及选择模块参数

主菜单:

在这里插入图片描述

选择BSP:

if RT_USING_BSP_STM32
        choice
        prompt "choice chip name"
        default y
        default RT_USING_CHIP_STM32F103RC
        
        config RT_USING_CHIP_STM32F103RC
                bool "STM32F103RC"
                default "STM32F103RC"
        config RT_USING_CHIP_STM32F103VC
                bool "STM32F103VC"
                default "STM32F103VC"
        config RT_USING_CHIP_STM32F103VE
                bool "STM32F103VE"
                default "STM32F103VE"
        config RT_USING_CHIP_STM32F407ZG
                bool "STM32F407ZG"
                default "STM32F407ZG"
        endchoice
endif

在这里插入图片描述

配置参数:

在这里插入图片描述

Scons

scons用于建立构建关系,并进行构建的一套环境,scons环境也是采用python语言编写。
根据rtconfig.h文件的解析,SConscript 对所有的系统文件建立构建关系,和makefile类似,根据所有的SConscript,将所有的工程文件组织在一起,与makefile不同的是,sconscript的包含关系,是需要手动在父目录包含字目录的。
每个模块都是单独编译自己的c文件,包含自己需要的h文件,编译成独立的o文件。

SconsStruct 编译过程

import os
import sys

print("#########Sconstruct##########")

#设置工程名称
PROJECT_NAME = os.path.basename(os.getcwd())
PROJECT_INC_DIR = os.path.normpath(os.getcwd() + '/board_config')

print("Project name is", PROJECT_NAME)
print("Project include dir is", PROJECT_INC_DIR)

if os.getenv('RTT_ROOT'):
    RTT_ROOT = os.getenv('RTT_ROOT')
else:
    RTT_ROOT = os.path.normpath(os.getcwd() + '/../..')

#设置使用的BSP目录
sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
sys.path = sys.path + [os.path.join(RTT_ROOT, 'bsp/stm32f10x')]  


# 导入全局配置文件
import rtconfig  


try:
    from building import *
except:
    print('Cannot found RT-Thread root directory, please check RTT_ROOT')
    print(RTT_ROOT)
    exit(-1)

#配置target文件名词
TARGET = 'bin/' + 'rtthread.' + rtconfig.TARGET_EXT 




# 配置编译工具链,Keil,iar,gcc
DefaultEnvironment(tools=[])
env = Environment(tools = ['mingw'],
    AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
    CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
    AR = rtconfig.AR, ARFLAGS = '-rc',
    LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
env.
('PATH', rtconfig.EXEC_PATH)

if rtconfig.PLATFORM == 'iar':
    env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
    env.Replace(ARFLAGS = [''])
    env.Replace(LINKCOM = env["LINKCOM"] + ' --map project.map')

Export('RTT_ROOT')
Export('rtconfig')
Export('PROJECT_NAME')
Export('PROJECT_INC_DIR')

# 根据 rtconfig.h ,生成构建依赖关系
# prepare building environment
objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)

# 编译和链接,生成target文件
# make a building
DoBuilding(TARGET, objs)

目标文件:

rtthread.axf :调试文件,包含bin,map,以及所有调试需要的信息,使用axf文件可以直接进行调试
rtthread.bin:烧录使用的二进制文件
rtthread.map:map文件,用于分析Flash和内存分布

Total RO  Size (Code + RO Data)               104364 ( 101.92kB)
Total RW  Size (RW Data + ZI Data)             19624 (  19.16kB)
Total ROM Size (Code + RO Data + RW Data)     104832 ( 102.38kB)

RO:Const段
RW:初始化的全局变量
ZI:未初始化或初始化为0的全局变量;
RAM:RW + ZI
ROM:Code + RO + RW

设备驱动框架

IO设备注册流程:

在这里插入图片描述

IO设备操作流程:

//电机MOS控制
p_robot_ctrl->h_mos_gpio = rt_pin_get("PA.13");
rt_pin_mode(p_robot_ctrl->h_mos_gpio, PIN_MODE_OUTPUT);
rt_pin_write(p_robot_ctrl->h_mos_gpio, PIN_LOW);

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

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

相关文章

cocosCreator 之 ScrollView

版本:3.4.0 参考:ScrollView组件 简介 ScrollView组件作为滚动容器来使用,它的实现通过ScrollBar组件来展示内容的位置和Mask组件显示指定区域,来保证有限的区域内显示更多的内容。 它的构成部分: ScrollBar滚动条相…

03 shell 编程

变量 语言型 编译型语言 解释型语言 shell脚本语言是解释型语言shell脚本的本质:shell命令的有序集合 shell 编程的基本过程 基本过程分为三步: step1. 建立 shell 文件 包含任意多行操作系统命令或shell命令的文本文件; step2. 赋予shell文件执行…

23 自定义控件

案例:组合Spin Box和Horizontal Slider实现联动 新建Qt设计师界面: 选择Widget: 选择类名(生成.h、.cpp、.ui文件) 在smallWidget.ui中使用Spin Box和Horizontal Slider控件 可以自定义数字区间: 在主窗口w…

脑电信号处理与特征提取——1. 脑电、诱发电位和事件相关电位(胡理)

目录 一、 脑电、诱发电位和事件相关电位 1.1 EEG基本知识 1.2 经典的ERPs成分及研究 1.2.1 ERPs命名规则及分类 1.2.2 常见的脑电成分 1.2.3 P300及Oddball范式 1.2.4 N400成分 一、 脑电、诱发电位和事件相关电位 1.1 EEG基本知识 EEG(Electroencephalogram)&#x…

MFC第二十天 数值型关联变量 和单选按钮与复选框的开发应用

文章目录 数值型关联变量数值型关联变量的种类介绍 单选按钮与复选框单选按钮的组内选择原理解析单选按钮和复选框以及应用数值型关联变量的开发CMainDlg.cppCInputDlg.hCInputDlg.cpp 附录 数值型关联变量 数值型关联变量的种类介绍 1、 数值型关联变量: a)控件型…

全志F1C200S嵌入式驱动开发(解决spi加载过慢的问题)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 之前的几个章节当中,我们陆续解决了spi-nor驱动的问题、uboot支持spi-nor的问题。按道理来说,下面要做的应该就是用uboot的loady命令把kernel、dtb、rootfs这些文件下载到ddr,然…

执行 yum install gcc 报 【-bash: $‘yum\302\240install\302\240gcc‘: 未找到命令】

执行 yum install gcc 报错 找了一圈,执行:sudo apt-get install yum 执行:wget http://yum.baseurl.org/download/3.2/yum-3.2.28.tar.gz 在线下载yum完成 对其进行解压:tar zxvf yum-3.2.28.tar.gz 解压后如下: 执行…

Tiny Player (js) - 轻量好用、免费开源的 web 视频播放开发组件,内置硬解、软解视频功能

一款简单好用的 JS 视频播放器,完美解决我遇到的移动端播放视频的需求,安利给各位。 关于 Tiny Player Tiny Player 是一个极简的视频播放器 JS 库,内置硬解、软解视频功能,支持原生控件样式以及自定义控件样式,小巧…

Android Service启动ANR原理

一、前言 在Service组件StartService()方式启动流程分析文章中,针对Context#startService()启动Service流程分析了源码,其实关于Service启动还有一个比较重要的点是Service启动的ANR,因为因为线上出现了上百例的"executing service &quo…

vue三级路由的写法

{path: "/trafficmanagement",component: Layout,redirect: "/trafficmanagement",alwaysShow: true,meta: {title: "通行模块",icon: "excel",},children: [{path: "carline",name: "carline",alwaysShow: true,…

OpenCV图像处理-视频分割静态背景-MOG/MOG2/GMG

视频分割背景 1.概念介绍2. 函数介绍MOG算法MOG2算法GMG算法 原视频获取链接 1.概念介绍 视频背景扣除原理:视频是一组连续的帧(一幅幅图组成),帧与帧之间关系密切(GOP/group of picture),在GOP中,背景几乎…

LeetCode116. 填充每个节点的下一个右侧节点指针

116. 填充每个节点的下一个右侧节点指针 文章目录 [116. 填充每个节点的下一个右侧节点指针](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/)一、题目二、题解方法一:迭代方法二:递归 一、题目 给定一个 完美二叉树 &…

【nginx】nginx中root与alias的区别:

文章目录 root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。 root的处理结果是:root路径+location路径 alias的处理结果是:使用alias路径替换location路径 alias是一…

Qt Core学习日记——第七天QMetaObject(上)

每一个声明Q_OBJECT的类都具有QMetaObject对象 Q_OBJECT宏源代码: #define Q_OBJECT \ public: \ QT_WARNING_PUSH \ Q_OBJECT_NO_OVERRIDE_WARNING \ static const QMetaObject staticMetaObject; \ virtual const QMetaObject *metaObject() const; \ vir…

istio安装部署总结

istio安装部署总结 大纲 istio基础概念版本选择安装istio核心主件卸载istiokiali安装 istio基础概念 https://istio.io/latest/zh/docs/ 中文文档 istio是一个服务治理平台,治理服务间的访问,(例如流量控制,安全策略&#xf…

【C++链表】

目录 前言一、搭建链表实现的框架二、链表的构造函数三、链表的尾插四、链表的遍历(重点)迭代器的遍历const修饰的迭代器 五、代码实现 前言 最近用C写了一下list的基本功能,感触颇深。本以为会跟之前用C写list一样会很轻松,没想到更难了。要考虑的东西…

代码随想录| 图论04 查并集 ●查并集理论知识 ●1971.寻找图中是否存在路径 ●684.冗余连接 ●685.冗余连接II

#查并集理论知识 并查集用处:解决连通性问题 将两个元素添加到一个集合中。判断两个元素在不在同一个集合 思路:将三个元素A,B,C (分别是数字)放在同一个集合,其实就是将三个元素连通在一起&a…

k8s常见的资源对象使用

目录 一、kubernetes内置资源对象 1.1、kubernetes内置资源对象介绍 1.2、kubernetes资源对象操作命令 二、job与cronjob计划任务 2.1、job计划任务 2.2、cronjob计划任务 三、RC/RS副本控制器 3.1、RC副本控制器 3.2、RS副本控制器 3.3、RS更新pod 四、Deployment副…

IBM:2023 年数据泄露的平均成本将达到 445 万美元

IBM 发布年度《数据泄露成本报告》,显示 2023 年全球数据泄露平均成本达到 445 万美元,比过去 3 年增加了 15%。创下该报告的历史新高。 报告显示,企业在计划如何应对日益增长的数据泄露频率和成本方面存在分歧。研究发现,虽然 95…

自定义MVC

目录 一.什么是MVC 1.1.三层架构和MVC的区别 二.自定义MVC工作原理图 三.自定义mvc实现 3.1 创建web工程 3.2 中央处理器 3.3 Action接口定义 3.4 实现子控制器 3.5 完善中央控制器 3.5.1 请求分发功能 3.5.2 使用配置文件配置action 3.5.3 请求参数处理 1. 定义接…