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

RTT工具学习

RT-Thread Studio作为一个开发工具软件,需要一个从了解到熟悉,从熟悉再到熟练应用的过程,特别是对于以前没有用过基于eclipse的开发工具的用户,还是需要先熟悉软件基本使用方法和主要功能入口,然后开发项目。

RT-Thread构建与配置系统

在这里插入图片描述

  • Kconfig:kernel config配置文件(提供系统的配置裁剪功能)
  • SCons:构建工具
  • env工具:主要提供构建系统所需的各种环境变量以及软件包的管理

Kconfig

C语言项目的裁剪配置本质上是通过条件编译和宏的展开来实现的,RT-Thread借助Kconfig这套机制能更方便的实现这一功能。
以Env工具的使用为例。

Kconfig机制包括了Kconfig文件和配置UI界面(如menuconfig,pyconfig等)。

  • Kconfig文件中的配置项会映射至rtconfig.h中。
  • Kconfig文件可以随源码分散至各级子目录,便于灵活修改。
.config片段
CONFIG_RT_USING_TIMER_SOFT=y
CONFIG_RT_TIMER_THREAD_PRIO=4
CONFIG_RT_TIMER_THREAD_STACK_SIZE=512
CONFIG_RT_DEBUG=y

相对应的rtconfig.h片段
#define RT_USING_TIMER_SOFT
#define RT_TIMER_THREAD_PRIO 4
#define RT_TIMER_THREAD_STACK_SIZE 512
#define RT_DEBUG

在这里插入图片描述
Kconfig文件在源码中呈现树形结构,需要在工程的根目录下存在一份顶层Kconfig文件,顶层Kconfig文件在文件中通过source语句显示调用各子目录下的Kconfig文件。

Env在根目录下执行menuconfig命令后会递归解析各级Kconfig文件,然后提供配置界面,完成相应的配置后并保存,根目录下会存在一份.config文件保存当前选择的配置项,并将.config文件转为RT-Thread的系统配置文件rtconfig.h。

在这里插入图片描述
Kconfig源于Linux内核的配置构建系统,当前只介绍RTT中的常用语法。

采用#作为注释标记符

config定义了一组新的配置选项

config BSP_USING_GPIO
	bool "Enable GPIO"
	select RT_USING_PIN
	default y
    help
    config gpio

在这里插入图片描述
语句分析:

  • config表示一个配置选项的开始,紧跟着的BSP_USING_GPIO是配置选项的名称。
  • config下面几行定义了该配置选项的属性。属性可以是该配置选项的。
  • bool 表示配置选项的类型,每个config菜单项都要有类型定义,变量有5种类型。
  • select是反向依赖的关系,即当前配置选项被选中,RT_USING_PIN就会被选中。

通过env选中以上配置界面的选项后,最终在rtconfig.h文件中生成如下两个宏:

#define RT_USING_PIN
#define BSP_USING_GPIO
config RT_CONSOLE_DEVICE_NAME
    string "the device name for console"
    default "uart1"

以上配置项在rtconfig.h文件中生成的宏为
#define RT_CONSOLE_DEVICE_NAME "uart1"
config BSP_I2C1_SCL_PIN
	int "I2C1 scl pin number"
	range 1 176
	default 116

#define BSP_I2C1_SCL_PIN 116

menu语句用于生成菜单,menu之后的字符串是菜单名。
menu和endmenu间有很多config语句。

menu "Hardware Drivers Config"
    menuconfig BSP_USING_CAN
        bool "Enable CAN"
        default n
        select RT_USING_CAN
        if BSP_USING_CAN
            config BSP_USING_CAN1
                bool "Enable CAN1"
                default n
        endif
endmenu

当没有选中“Enable CAN”选项时,if判断的选项并不会显示出来。

menuconfig这个语句和config语句很相似,但它在config的基础上要求所有的子选项作为独立的行显示。

构建工具

构建工具(software construction tool)是一种软件,它可以根据一定的规则或指令,将源代码编译成可执行的二进制程序,这是构建工具最基本也是最重要的功能。

实际上构建工具的功能不止于此,通常这些规则有一定的语法,并组织成文件。这些文件用来控制构建工具的行为,在完成软件构建之外,也可以做其它事情。

目前最流行的构建工具是GNU Make。很多知名开源软件,如Linux内核就采用Make构建。Make通过读取Makefile文件来检测文件的组织结构和依赖关系,并完成Makefile中所指定的命令。

由于历史原因,Makefile的语法比较混乱,不利于初学者学习。此外,在Windows平台上使用Make也不方便,需要安装Cygwin环境。为了克服Make的种种确定,人们开发了其它构建工具,如CMake和SCons等。

RT-Thread构建工具

RTT早期使用Make/Makefile构建。
从RTT 3.0开始,RT-Thread开发团队逐渐引入了SCons构建系统,引入SCons唯一的目的是:使大家从复杂的Makefile配置、IDE配置中脱离出来,把精力集中在RTT功能开发上。

IDE通过图形化界面的操作完成构建,大部分IDE会根据用户添加的源码生成类似Makefile或SConscript的脚步文件,在底层调用类似Make或SCons的工具来构建源码。

SCons

SCons是一套由Python语言编写的开源构建系统,类似于GNU Make。
它采用不同于通常Makefile文件的方式,而是使用SConstruct和SConscript文件来替代。这些文件是Python脚本,能够使用标准的 Python 语法来编写。所以在 SConstruct、SConscript 文件中可以调用 Python 标准库进行各类复杂的处理,而不局限于 Makefile 设定的规则。

SCons使用SConscript和SConstruct文件来组织源码结构并进行构建,SConstruct是scons构建的主脚本,SConscript存放在源代码的子目录下,以达到分层构建的目的。
一个项目只有一个SConstruct,但会有多个SConscript,一般情况下,每个存放有源代码的子目录下都会放置一个SConscript。

/
  -- rtconfig.py    ---- 控制SCons构建的配置文件,存放了如工具链,构建参数等配置。
  -- SConscript
  -- SConstruct    ---- SCons的入口脚本,初始化了SCons构建rt-thread所需的必要环境
  -- Kconfig        ---- 顶层Kconfig文件,menuconfig的入口Kconfig文件
  -- rt-thread/
  --- src/
  ---- SConscript   ---- 各级源码的scons子脚本,控制当前级别下的源码构建行为
  ---- Kconfig      ---- 各级源码的Kconfig子脚本,存放当前级别下的配置项
  ---- **.c

为了方便开发者使用SCons,RTT构建了如图所示的构建框架,rtconfig.py是控制SCons构建的配置文件,存放了如工具链,构建参数等配置。

Env开发工具

Env是RTT推出的开发辅助工具,针对基于RTT操作系统的项目工程,提供编译构建环境、图形化系统配置以及软件包管理功能。

其内置的menuconfig提供了简单易用的配置裁剪工具,可对内核、组件和软件包进行自由裁剪,使系统以搭积木的方式进行构建。

  • menuconfig图形化配置界面,交互性好,操作逻辑强;
  • 丰富的文字帮助说明,配置无需查阅文档;
  • 使用灵活,自动处理依赖,功能开关彻底;
  • 自动生成rtconfig.h,无需手动修改;
  • 使用Scons工具生成工程,提供编译环境,操作简单;
  • 提供多种软件包,模块化软件包耦合关联少,可维护性好;
  • 软件包可在线下载,软件包持续集成,包可靠性高。

scons --dist:搭建项目框架,使用此命令会在BSP目录下生成dist目录,这便是开发项目的目录结构,包含了RT-Thread源码及BSP相关工程,不相关的BSP文件夹及libcpu都会被移除,并且可以随意拷贝此工程到任何目录下使用。


http://www.kler.cn/a/372133.html

相关文章:

  • 鸿蒙开发:了解帧动画
  • Spring Boot 项目创建
  • 精准提升:从94.5%到99.4%——目标检测调优全纪录
  • openssl交叉编译(这次基本上正规了)
  • 使用TC命令模拟弱网丢包
  • Hadoop集群(HDFS集群、YARN集群、MapReduce​计算框架)
  • AI技术的应用前景如何?它会不会改变我们的生活和工作方式?
  • 阿里云VPC机器如何访问公网
  • Vue.observable vs Vuex:何时使用轻量级状态管理?
  • 【python】flash-attn安装
  • 【Clickhouse】客户端连接工具配置
  • 面试 Java 基础八股文十问十答第二十九期
  • Javaee:阻塞队列和生产者消费者模型
  • Brainpy的jit编译环境基础
  • 【LeetCode】跳跃游戏ⅠⅡ 解题报告
  • 如何在Linux系统中使用Netcat进行网络调试
  • Transformer中的Encoder
  • 基于STM32G0的USB PD协议学习(3)
  • 基于微信小程序的图书馆座位预约系统+LW示例参考
  • 数据结构算法学习方法经验总结
  • 经典面试题——抽象类和接口的区别
  • 【Linux】Kafka部署
  • SpringBoot实现的扶贫成效监测平台
  • 保研考研机试攻略:python笔记(2)
  • 【Windows】Redis 部署
  • Unity构建WebGL知识点