Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
python
SCons
SConstruct
RT-Thread SCons上手指北
发布于 2024-10-11 10:11:51 浏览:283
订阅该版
[tocm] # SCons上手指北 目的:了解RT-Thread构建过程,可上手修改SCons脚本 初心:考虑到有些小伙伴对Python可能不那么熟悉(#include me) PS:内容可能会有瑕疵,感谢指正~ ## 一 SConstruct ### 1. 获取rtconfig.py模块 ```python import os import sys import rtconfig ``` 上述代码用于导入Python的模块,上述代码重要的是最后一句,`import rtconfig`,其中的rtconfig指向bsp目录下的rtconfig.py文件,用于导入rtconfig.py文件中的内容; 这里有必要举例说明一下,将上述代码修改为下述: ```python import os import sys import rtconfig import usr_config ``` 在env中执行scons -j16,日志如下: ```python $ scons -c scons: Reading SConscript files ... ModuleNotFoundError: No module named 'usr_config': File "E:\rt-thread\bsp\stm32\stm32f407-rt-spark\SConstruct", line 4: import usr_config ``` 从输出的日志可以看到,没有`usr_config`这个模块,然后在当前路径下创建一个`usr_config.py`文件,再次执行scons -j16, 正常执行。在`usr_config.py`文件中编写测试代码: ```python import os def hello_RTThread(): print("Hello, RTThread!") ``` 在SConstruct中调用如下代码,执行scons -j16; ```python usr_config.hello_RTThread() ``` 输出日志: ```python $ scons -j16 scons: Reading SConscript files ... Hello, RTThread! ``` 测试符合预期。 ### 2.获取rt-thread源码根路径 ```python if os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT') else: RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') ``` 上述代码用于查找RT-Thread源码的根目录,首先调用Python的OS模块查找系统的环境变量,如果系统中存在`RTT_ROOT`环境变量则将其赋值给RTT_ROOT,否者根据当前BSP所在路径的相对路径找到RT-Thread源码的根目录。 我当前RT-Thread源码的根目录位于电脑的E盘,在上述代码中添加下述代码: ```python print('RTT_ROOT is: ' + RTT_ROOT) ``` 在env中执行scons -j16,日志如下: ```python $ scons -j16 scons: Reading SConscript files ... RTT_ROOT is: E:\rt-thread ``` 测试符合预期。 ### 3.获取rt-thread官方工具路径 ```python sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] ``` `sys.path` 是 Python 中的一个全局变量,保存着 Python 解释器在导入模块时搜索的路径列表。默认情况下,它包含一些标准库路径和当前脚本运行的目录。当执行 `import 模块名` 时,Python 会按照 `sys.path` 列表中的路径顺序依次查找该模块。 ```python os.path.join(RTT_ROOT, 'tools') ``` 上述代码用于拼接一个路径,我们将该路径打印出来: ```python $ scons -j16 scons: Reading SConscript files ... E:\rt-thread\tools ``` 从日志中可以看到,上述代码期望拼接的路径是`E:\rt-thread\tools`,该路径下放的是rt-thread的官方的一些工具,后续用到的一些函数也源于该文件夹下的工具。 我们在上述代码下方添加下述代码: ```python for path in sys.path: print(path) ``` 该段代码可以输出Python搜索当前模块的所有路径,在env中执行scons -j16,日志如下: ```python $ scons -j16 scons: Reading SConscript files ... E:\rt-thread\bsp\stm32\stm32f407-rt-spark E:\env-windows\.venv\Scripts\scons.exe E:\env-windows\tools\python-3.11.9-amd64\python311.zip E:\env-windows\tools\python-3.11.9-amd64\DLLs E:\env-windows\tools\python-3.11.9-amd64\Lib E:\env-windows\tools\python-3.11.9-amd64 E:\env-windows\.venv E:\env-windows\.venv\Lib\site-packages E:\rt-thread\tools ``` 输出的路径就是Python的输出路径。测试符合预期。 ### 4.设置目标文件名称 ```python TARGET = 'rt-thread.' + rtconfig.TARGET_EXT print(TARGET) ``` 上述代码的作用用于拼接一个字符串,该字符串用于编译生成可执行文件的命名,在env中执行scons -j16,日志如下: ```python $ scons -j16 scons: Reading SConscript files ... rt-thread.elf ``` 输出的拼接的名字为rt-thread.elf,测试符合预期。上述代码值得注意的是`rtconfig.TARGET_EXT`,这个字符串是从rtconfig.p中导入,这里起作用的语句就是上述的`import rtconfig`. ### 5.配置编译环境 ```python DefaultEnvironment(tools=[]) ``` 这行代码的效果是创建或修改 SCons 的默认构建环境,使其不包含任何默认的构建工具。可以这么理解,这段代码相当于缺省,或者复位吧,当然执行完上述代码后需要手动设置当前工程的参数。 ```python env = Environment(tools = ['mingw'], AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS, AR = rtconfig.AR, ARFLAGS = '-rc', CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) ``` 这段代码就是手动设置工程的参数,包括工具链,编译链接参数等(因为不同BSP使用的工具链与参数是不同的),所以这里需要这么干。 ```python env.PrependENVPath('PATH', rtconfig.EXEC_PATH) ``` 上述代码用于将工具链的路径添加至环境变量中,这样在执行scons命令构建时就可以找到BSP使用的工具链。 ### 6.配置芯片HAL库与驱动路径 ```python SDK_ROOT = os.path.abspath('./') ``` 该代码用于找到当前BSP的绝对路径,因为对于在当前的目录结构下,rt-thread的源码的文件结构是固定的,所以官方工具可以根据menuconfig配置生成的rtconfig.h配置文件,选择添加需要的源码(C,ASM文件等),但是对于芯片厂的HAL库放置的位置就需要看制作BSP的作者的心情了,所以需要根据具体的BSP,添加相应的代码,能让系统找到芯片HAL库与驱动的位置,示例代码如下: ```python SDK_ROOT = os.path.abspath('./') if os.path.exists(SDK_ROOT + '/libraries'): libraries_path_prefix = SDK_ROOT + '/libraries' else: libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries' SDK_LIB = libraries_path_prefix Export('SDK_LIB') print(libraries_path_prefix) ``` 在env中执行scons -j16,日志如下: ```python $ scons -j16 scons: Reading SConscript files ... libraries_path_prefix: E:\rt-thread\bsp\stm32/libraries ``` 测试符合预期。 ```python stm32_library = 'STM32F4xx_HAL' rtconfig.BSP_LIBRARY_TYPE = stm32_library # include libraries objs.extend(SConscript(os.path.join(libraries_path_prefix, stm32_library, 'SConscript'), variant_dir='build/libraries/'+stm32_library, duplicate=0)) # include drivers objs.extend(SConscript(os.path.join(libraries_path_prefix, 'HAL_Drivers', 'SConscript'),variant_dir='build/libraries/'+'HAL_Drivers', duplicate=0)) ``` 这部分代码的作用就是使系统能找到,芯片的HAL库与驱动的路径下的Scons脚本,并将需要的而源码添加至工程。 ```python objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) ``` 这部分代码的作用是根据系统配置文件,将所需要的rt-thread源码添加至工程。 至此,rt-thread源码与芯片驱动源码都添加至系统编译链表。添加下述代码,输出参与系统编译的源码文件: ```python for obj in objs: print(obj) ``` 在env中执行scons -j16,部分日志如下: ```python $ scons -j16 scons: Reading SConscript files ... libraries_path_prefix: E:\rt-thread\bsp\stm32/libraries Newlib version: 4.1.0 applications\main.c board\board.c E:\rt-thread\bsp\stm32\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\gcc\startup_stm32f407xx.s board\CubeMX_Config\Src\stm32f4xx_hal_msp.c E:\rt-thread\src\idle.c E:\rt-thread\src\scheduler_up.c E:\rt-thread\src\klibc\kstring.c E:\rt-thread\src\ipc.c E:\rt-thread\src\scheduler_comm.c E:\rt-thread\src\kservice.c E:\rt-thread\src\klibc\kerrno.c E:\rt-thread\src\mempool.c E:\rt-thread\src\timer.c E:\rt-thread\src\cpu_up.c E:\rt-thread\src\object.c E:\rt-thread\src\mem.c E:\rt-thread\src\thread.c E:\rt-thread\src\klibc\kstdio.c E:\rt-thread\src\components.c E:\rt-thread\src\clock.c E:\rt-thread\src\irq.c E:\rt-thread\libcpu\arm\common\atomic_arm.c E:\rt-thread\libcpu\arm\common\showmem.c E:\rt-thread\libcpu\arm\common\div0.c E:\rt-thread\libcpu\arm\cortex-m4\cpuport.c E:\rt-thread\libcpu\arm\cortex-m4\context_gcc.S E:\rt-thread\components\drivers\core\device.c E:\rt-thread\components\drivers\i2c\dev_i2c_bit_ops.c E:\rt-thread\components\drivers\i2c\dev_i2c_core.c E:\rt-thread\components\drivers\i2c\dev_i2c_dev.c E:\rt-thread\components\drivers\ipc\completion_up.c E:\rt-thread\components\drivers\ipc\waitqueue.c ... ``` ### 7.执行编译 完成上述代码后,就配置好了整个工程所需要的源码,工具链,编译参数,输出文件等信息,最后执行下述代码即可进行工程的编译链接工作,最终生成期望的可执行文件。 ```ASN.1 DoBuilding(TARGET, objs) ```
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
rv666
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
文章
20
回答
56
被采纳
9
关注TA
发私信
相关文章
1
scons不支持python3吗?
2
编译又出现问题
3
BSP目录下做好一个项目后,怎么把发给别人的包裁剪的小...
4
为什么重新scons --target=mdk 后,以前在MDK工程里保存的C文
5
Scons 添加Group,SConscript已经执行,源码却没有添加进工程
6
scons如何指定输出目录?
7
新人求助。
8
想用env 工具自己构建编译环境想用vscode 进行一些简单程序
9
关于scons脚本问题
10
使用scons --target=makefile的问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部