RTT学习 开发环境搭建

添加文件到工程

BSP下的applications文件夹用于存放用户自己的应用代码,目前只有一个main.c文件,如果用户的应用代码不是很多,建议相关源文件都放在这个文件夹下面,在applications文件夹下新增两个简单的文件hello.c和hello.h。

applications文件夹下新增的2个文件需要使用scons --target=xxx命令生成新的工程,才会添加到工程项目中。每次新增文件都要重新生成工程。

applications文件夹下新增的文件是怎么样添加到工程中的呢?每个BSP的applications文件夹里都有一个SConscript文件,这些文件的功能都相似。

RTT使用SCons构建系统,SCons使用SConscript和SConstruct文件来组织源码结构。通常来说一个项目只有一个SConstruct,但是会有多个SConscript。一般情况下,每个存放有源代码的子目录下都会放置一个SConscript。

SConscript文件是使用Python语言编写,applications文件夹里面的内容如下:

Import('RTT_ROOT')
Import('rtconfig')
from building import *# str(Dir('#') 表示获取工程的 SConstruct 所在的目录, 也就是 D:\repository\rt-thread\bsp\stm32f4xx-HAL
# os.path.join() 表示将 `str(Dir('#')` 表示的目录和 applications 一起拼接成一个完整目录。
# 也就是获得当前目录 `D:\repository\rt-thread\bsp\stm32f4xx-HAL\applications`
cwd     = os.path.join(str(Dir('#')), 'applications')# 获取当前目录下所有的 C 文件
src = Glob('*.c')# 将当前目录和 SConstruct 所在的目录保存到 list 变量 CPPPATH 中
CPPPATH = [cwd, str(Dir('#'))]# 将 src 包含的源文件创建为 Applications 组。depend 为空表示该组不依赖 rtconfig.h 中的任何宏。
# CPPPATH = CPPPATH 表示将右边 CPPPATH 变量包含的目录添加到系统的头文件路径中,左边的 CPPPATH 表示头文件路径。
# 这个 Applications 组也就对应 MDK 或者 IAR 工程里面的 Applications 分组。
group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)Return('group')

通过这个SConscript文件,applications目录下的所有源文件和相关头文件目录就添加到了工程中,而不需要用户手动添加。

添加模块到工程

前文提到在自己源代码不多的情况下,建议所有源代码文件都放在applications文件夹里面。

同样以上文提到的hello.c和hello.h为例,需要把他们作为一个单独的模块管理,并且在MDK或者IAR的工程文件里有自己的分组,且可以通过menuconfig选中是否使用这个模块。在BSP下新增hello文件夹。

在这里插入图片描述
注意文件夹里多了一个SCoscript文件,如果想要将自己的一些源代码加入到SCons编译环境中,一般可以创建或修改已有SConscript文件。
SConscript 文件可以控制源码文件的加入,并且可以指定文件的 Group(与 MDK/IAR 等 IDE 中的 Group 的概念类似)。对于这个新增的 hello 模块 SConscript 文件内容如下,# 号后面的内容为注释。

# -*- coding: UTF-8 -*-             # 指定文件的编码格式是 UTF-8,文件可以用中文
Import('RTT_ROOT')
Import('rtconfig')
from building import *cwd          = GetCurrentDir()      # 将当前路径赋值给字符串 cwd
include_path = [cwd]                # 将当前头文件路径保存到 list 变量 include_path 中
src          = []                   # 定义一个 list 变量 srcif GetDepend(['RT_USING_HELLO']):   # hello.c 依赖宏 RT_USING_HELLOsrc += ['hello.c']              # 保存 hello.c 字符串到 list 变量 src 中# 将 src 包含的源文件创建为 hello 组。depend 为空表示该组不依赖 rtconfig.h 的任何宏。
# CPPPATH = include_path 表示将当前目录添加到系统的头文件路径中
group = DefineGroup('hello', src, depend = [''], CPPPATH = include_path)Return('group')

通过上面几行简单的python代码就创建了一个新的hello分组,并且可以通过宏定义控制要加入到组里面的源文件。

增加menuconfig菜单

那么自定义宏RT_USING_HELLO又是通过怎样的方式定义呢?
这里要介绍一个新的文件Kconfig。
Kconfig用来配置内核,menuconfig命令通过读取工程的各个KConfig文件,生成配置界面供用户配置内核,最后所有配置相关的宏定义都会自动保存到BSP目录里的rtconfig.h文件中,每个BSP都有一个rtconfig.h文件,这也就是BSP的配置信息。

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

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

相关文章

什么是正向代理和反向代理

正向代理和反向代理是两种不同的代理服务器配置方式,它们在代理的方向和作用上有所不同。 一、正向代理(Forward Proxy) 代表客户端发送请求到其他服务器的代理服务器。客户端将请求发送给正向代理服务器,然后由正向代理服务器代…

如何使用OSI七层模型的思路进行Linux网络问题排障?

在运维工作中,我们可能经常遇到诸如服务器无法远程连接、网站无法访问等各种网络问题。此时你是否想过,我们常背的OSI七层模型,能在处理这样的实际问题中发挥什么样的作用呢? 基于OSI架构的方法论,我们可以使用自下而…

ATFX汇市:欧元区和美国的制造业PMI将发布,市场预期乐观

ATFX汇市:今日16:00,市场研究机构Markit将发布欧元区4月制造业PMI初值,前值为46.1,预期值46.6,预期将增加0.5个百分点。历史数据看,最近三个月,欧元区的制造业PMI均处于较高水平,期间…

Springboot+Vue项目-基于Java+MySQL的房屋租赁系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

前端开发攻略---封装日历calendar组件(纯手搓),可以根据您的需求任意改变,可玩性强

1、演示 2、代码 <template><div class"box" v-if"startMonth.year"><div class"left"><div class"top"><span class"iconfont" click"changeMonth(-1)">左</span><span&…

Python学习从0开始——项目一day02数据库连接

Python学习从0开始——项目一day02数据库连接 一、在线云数据库二、测试数据库连接三、数据库驱动介绍四、SQL执行4.1插入测试数据4.2安装数据库连接模块4.3测试SQL语句执行4.4执行SQL的固定步骤及示例 一、在线云数据库 找了一个在线数据库&#xff0c;需要邮箱注册&#xff…

甄美天使1+3退休模式开发|最新升级模式

我是新零售商业架构师肖琳&#xff0c;易创客社交新零售创始‌‌‌‌‌人&#xff0c;擅长品牌从0-1、1-10起盘全过程。易创客新零售&#xff0c;提供商业模式解决方案系统&#xff0c;包括分销系统、微商系统、新零售系统&#xff1b;提供社交新零售陪跑代运营&#xff0c;提供…

Uds的0x10服务

0x10为诊断会话控制&#xff0c;该服务下有三种子功能&#xff0c;分别为默认会话&#xff0c;扩展会话&#xff0c;编程会话。 如果长时间在非默认会话下&#xff0c;没有用诊断仪跟ECU通讯&#xff0c;那么ECU会调回或者是返回到默认会话下。一般UDS协议上推荐是5000毫秒&…

云原生的基石:containerd引领未来容器发展趋势

文章目录 一、Containerd简介&#xff1a;容器技术的心脏二、Containerd核心原理解析三、Containerd与Docker的关系四、Containerd在云原生应用部署中的作用五、Containerd的扩展性和插件机制六、Containerd的安全特性七、Containerd的性能优化八、Containerd的社区和生态系统九…

C++面向对象程序设计 - 运算符重载

函数重载就是对一个已有的函数赋予新的含义&#xff0c;使之实现新的功能。因此一个函数名就可以用来代表不同功能的函数&#xff0c;也就是一名多用。运算符也可以重载&#xff0c;即运算符重载&#xff08;operator overloading&#xff09;。 一、运算符重载的方法 运算符重…

indexDB 大图缓存

背景 最近在项目中遇到了一个问题&#xff1a;由于大屏背景图加载速度过慢&#xff0c;导致页面黑屏时间过长&#xff0c;影响了用户的体验。从下图可以看出加载耗时将近一分钟 IndexDB 主要的想法就是利用indexDB去做缓存&#xff0c;优化加载速度&#xff1b;在这之前&am…

在选择试验台底座时,应注意哪些问题——河北北重

在选择试验台底座时&#xff0c;应注意以下几个方面&#xff1a; 底座尺寸和承载能力&#xff1a;底座的尺寸和承载能力应与试验台的尺寸和所需承载的设备重量相匹配&#xff0c;确保底座能够稳定承载试验台和设备。 材料和质量&#xff1a;底座的材料应具有足够的强度和耐久性…

软件测试之【合理的利用GPT来辅助软件测试一】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 前言GPT的原理及技巧GPT辅助接口自动化测试 前言 在编程基础栏目中&#xff…

Kafak详解(1)

简介 消息队列 为什么要有消息队列 图-1 消息队列的使用 消息队列 1)消息Message&#xff1a;网络中的两台计算机或者两个通讯设备之间传递的数据。例如说&#xff1a;文本、音乐、视频等内容。 2)队列Queue&#xff1a;一种特殊的线性表(数据元素首尾相接)&#xff0c;特…

2024平替电容笔买哪个品牌好?iPad电容笔全能榜单热门款TOP5分享!

2024年&#xff0c;随着科技的不断发展和消费者对生活品质的追求&#xff0c;电容笔作为一种创新的无纸化工具&#xff0c;逐渐走进人们的生活和工作中。然而&#xff0c;在电容笔市场的繁荣背后&#xff0c;也隐藏着品质良莠不齐的现象。众多品牌为了追求利润&#xff0c;推出…

JS----随机数字,字符,数组

随机数字 function random(min 0, max 100) {if (min > 0 && max > 0 && max > min) {const gab max - min 1return Math.floor(Math.random() * gab min)}return 0 }输入格式 随机字符 function randomStr (len 32) {var s for (; s.lengt…

电力调度自动化系统由什么构成?

电力调度自动化系统由什么构成&#xff1f; 电力调度自动化系统通过数据采集与传输、数据处理与存储、监视与控制、优化与决策、通信网络和系统应用软件等构成&#xff0c;实现对电力系统的监控、控制和优化。 电力调度自动化系统是一种集成了计算机技术、通信技术、自动化技术…

SpringBoot下载Excel模板功能

目录 一、前端只需要填写一个a标签调用一下后端接口即可 二、后端 2.1 准备一个excel模板 &#xff0c;将其复制到resource目录下的templates文件夹下 2.2 接着复制下列代码即可 三、运行效果 一、前端只需要填写一个a标签调用一下后端接口即可 1.1 先代理一下防止跨域 e…

40-50W 1.5KVDC 隔离 宽电压输入 DC/DC 电源模块 ——TP40(50)DC 系列

TP40(50)DC系列电源模块额定输出功率为40-50W、应用于2:1、4&#xff1a;1电压输入范围 9V-18V、18V-36V、36V-75V、9V-36V、18V-75V的输入电压环境&#xff0c;输出电压精度可达1%&#xff0c;可广泛应用于通信、铁路、自动化以及仪器仪表等行业。