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

ubuntu环境下调试 RT-Thread

调试 RT-Thread

下载源码

github 搜索 RT-Thread 下载源码

安装 python scons 环境

你已经安装了 kconfiglib,但 scons --menuconfig 仍然提示找不到它。这种情况通常是由于 Python 环境不一致 导致的:你在一个 Python 环境中安装了 kconfiglib,但 scons 运行时使用的是另一个 Python 解释器。

解决思路如下:


确认当前环境 Python 路径

在你已经激活的 rtenv 环境中,运行:

which python

然后也运行:

which scons

这两个命令的输出路径应该都指向你的虚拟环境路径(~/Code/RTOS/rt-thread/rtenv/ 下)。


确认 scons 使用的 Python

有些系统上的 scons 是全局安装的,用的是系统的 Python,而不是你的虚拟环境中的。

你可以通过下面命令检查 scons 实际使用的是哪个 Python:

scons --version

然后运行:

head -n 1 $(which scons)

查看 scons 的 shebang 行,确认它使用的 Python 是你的虚拟环境中的,比如应为:

#!/home/link/Code/RTOS/rt-thread/rtenv/bin/python

如果不是,那你运行的 scons 用的是系统 Python,自然找不到虚拟环境里的 kconfiglib


解决方案

方法 1:在虚拟环境中安装 scons

确保你在虚拟环境里运行:

pip install scons

然后再运行:

rtenv/bin/scons --menuconfig

或者:

python -m scons --menuconfig

这样能确保 scons 用的是正确的 Python 环境。


✅ 总结

问题的核心是:你安装的 kconfiglib 在虚拟环境中,但运行 scons 的 Python 不是那个虚拟环境。

只要确保 scons 是用虚拟环境里的 Python 运行的,问题就能解决。

编译工程

进入 qemu-vexpress-a9 BSP 根目录,然后输入命令 code . (注意:code 后面有一个点)打开 VS Code,表示使用 VS Code 打开当前目录。
点击 VS Code “查看 -> 终端” 打开 VS Code 内部终端,在终端里输入命令 scons 即可编译工程,终端会打印出编译信息。

修改 VS Code下的 lauch.json

{"version": "0.2.0","configurations": [{"name": "Debug @ Ubuntu with gdb-multiarch","type": "cppdbg","request": "launch","program": "${workspaceFolder}/rtthread.elf","args": [],"stopAtEntry": true,"cwd": "${workspaceFolder}","environment": [],"externalConsole": false,"miDebuggerServerAddress": "localhost:1234","serverLaunchTimeout": 2000,"targetArchitecture": "arm","MIMode": "gdb","miDebuggerPath": "/usr/bin/gdb-multiarch","customLaunchSetupCommands": [],"launchCompleteCommand": "exec-run"}]
}

调试工程

先执行 qemu-vexpress-a9 目录下的 qemu-dbg.sh文件,在 VS Code 里点击调试菜单(小虫子图标),调试平台选择 刚修改的lauch.json,然后按 F5 就可以开启 QEMU 调试模式,断点停留在 main 函数。

在 VS Code 里可以使用 GDB 命令,需要在最前面加上 -exec。 例如 -exec info registers 命令可以查看寄存器的内容:

其他一些主要命令介绍如下所示:

查看内存地址内容:x/<n/f/u> <addr>,各个参数说明如下所示:

n 是一个正整数,表示需要显示的内存单元的个数,也就是说从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的 u 定义
f 表示显示的格式,参见下面。如果地址所指的是字符串,那么格式可以是 s。

其他格式如下表所示:

参数描述
x按十六进制格式显示变量
d按十进制格式显示变量
u按十六进制格式显示无符号整型
o按八进制格式显示变量
t按二进制格式显示变量
a按十六进制格式显示变量
c按字符格式显示变量
f按浮点数格式显示变量

u 表示从当前地址往后请求的字节数,如果不指定的话,GDB 默认是 4 个 bytes。u 参数可以用下面的字符来代替,b 表示单字节,h 表示双字节,w 表示四字 节,g 表示八字节。当我们指定了字节长度后,GDB 会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

addr 表示一个内存地址。

注:严格区分 n 和 u 的关系,n 表示单元个数,u 表示每个单元的大小。

示例: x/3uh 0x54320 表示从内存地址 0x54320 读取内容,h 表示以双字节为一个单位,3 表示输出三个单位,u 表示按十六进制显示。

查看当前程序栈的内容: x/10x $sp–> 打印 stack 的前 10 个元素
查看当前程序栈的信息: info frame----list general info about the frame
查看当前程序栈的参数: info args—lists arguments to the function
查看当前程序栈的局部变量: info locals—list variables stored in the frame
查看当前寄存器的值:info registers(不包括浮点寄存器) info all-registers(包括浮点寄存器)
查看当前栈帧中的异常处理器:info catch(exception handlers)
提示:输入命令时可以只输入每个命令的第一个字母。例如:info registers 可以只输入 i r。

注:如果在 VS Code 目录中额外添加了文件夹,会导致调试不能够启动。 每次开始调试都需要使用 Env 工具在 BSP 根目录使用code .命令打开 VS Code 才能正常调试工程。


这是个非常常见的问题,简洁总结:

你在 Bash 脚本中使用 source 激活环境变量(如 Python 虚拟环境或 env.sh),这些变量只对当前脚本生效,不会影响你在终端中的父 shell 环境。


🔍 举个例子:

假设你这样写一个脚本 env_setup.sh

#!/bin/bash
source rtenv/bin/activate
source ~/.env/env.sh

你执行它:

./env_setup.sh

你会发现:

  • 脚本中的 source 是成功的;
  • 脚本一结束,环境变量(如 RTT_ROOT、PATH、alias、Python venv 等)就“消失”了

原因是:

脚本在子 shell 中运行,环境变更不会传回你的交互式终端


✅ 正确方式:用 source 调用脚本

想让环境变量影响当前终端,你必须这样运行你的脚本:

source ./env_setup.sh
# 或
. ./env_setup.sh

这时 env_setup.sh 中的所有 exportalias、虚拟环境激活、RTT 工具加载等,才会真正“留在”你的终端环境里。


📌 终极总结:

方式会影响当前终端环境吗?
./script.sh❌ 不会(在子 shell 中执行)
bash script.sh❌ 不会
source script.sh✅ 会
. script.sh✅ 会(等同于 source

✅ 推荐:在终端初始化中配置

你也可以把这些写入 .bashrc / .zshrc 末尾:

alias rtenv='source ~/Code/RTOS/rt-thread/rtenv/bin/activate && source ~/.env/env.sh'

以后只需输入:

rtenv

即可一键进入开发环境。


必须先完成配置和编译,再运行 scons --dist,否则 scons --dist 会失败或者打包内容不完整。


✅ 正确的使用顺序如下:

  1. 配置编译环境
export RTT_EXEC_PATH=/usr/bin             # 或你的 arm-none-eabi 工具链路径
scons --menuconfig                        # 生成 .config 和 rtconfig.py
  1. 编译项目,确保能正常构建
scons                                     # 构建 rt-thread 项目,生成 .elf 等产物
  1. 打包项目
scons --dist                              # 在成功构建后打包整个工程为 .zip(含配置、源码、工具)

📦 scons --dist 的作用

该命令会自动打包:

  • 当前 BSP 所需文件(包括 SConscript, board, applications, Kconfig, Makefile 等)
  • .config, rtconfig.py 等配置文件
  • 构建产物(如 .elf, .bin, .map
  • 导出一个 project.zip 或类似压缩包,便于部署、分发、发布或在 RT-Thread Studio 中导入

🧠 如果你还没配置成功或无法构建成功,建议:

  • 不要先 scons --dist
  • 否则打的包是不完整的

使用CLion 开发

打包好的dist下的project 可以拷到别处独立运行,注意RTT-ROOT环境变量变化,

修改SCons 文件,屏蔽掉前面几行即可,因为project中已经包含rt-thread了

# if os.getenv('RTT_ROOT'):
#     RTT_ROOT = os.getenv('RTT_ROOT')
# else:
#     RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')# set RTT_ROOT
if not os.getenv("RTT_ROOT"): RTT_ROOT="rt-thread"

再次执行 scons --target=cmake 生成cmake.txt,即可使用CLION开发。

http://www.lryc.cn/news/583358.html

相关文章:

  • windows部署多实例filebeat监控相同路径下文件
  • 【Kafka】登录日志处理的三次阶梯式优化实践:从同步写入到Kafka多分区批处理
  • SAP-ABAP:SAP中DELECT语句用法详解实例总结
  • Go语言Gin框架实战:开发技巧
  • 2024 睿抗编程技能赛——省赛真题解析(含C++源码)
  • 【Python】遇到 “non-integer arg 1 for randrange() ” 问题的解决方法
  • 技术开发栈中 URL地址末尾加不加 “/“ 有什么区别?
  • 闲庭信步使用图像验证平台加速FPGA的开发:第六课——测试图案的FPGA实现
  • 解决IDEA缺少Add Framework Support选项的可行性方案
  • java中list.remove(item); // 直接移除会导致ConcurrentModificationException
  • 图像自动化处理初探:从拖拽上传到参数设置
  • 基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(5)失败用例截图与重试
  • 制作MikTex本地包可用于离线安装包
  • Synology Cloud Sync构建的企业级跨域数据中台
  • 前端性能优化:从之理论到实践的破局道
  • 【PTA数据结构 | C语言版】一元多项式求导
  • 使用 Docker 搭建 Rust Web 应用开发环境——AI教你学Docker
  • 图像处理中的凸包检测:原理与实现
  • 前端开发自动化设计详解
  • 两种方式清除已经保存的git账号密码
  • AI在垂直领域的深度应用:医疗、金融与自动驾驶的革新之路
  • 分治算法---快排
  • 深度帖:浏览器的事件循环与JS异步
  • Foundry智能合约测试设计流程
  • 【25软考网工】第十章 (3)网络冗余设计、广域网接入技术
  • 【一起来学AI大模型】PyTorch DataLoader 实战指南
  • 前端交互自定义封装类:“双回调自定义信息弹窗”
  • ClickHouse 时间范围查询:精准筛选「本月数据」
  • pytorch 自动微分
  • Git 详解:从概念,常用命令,版本回退到工作流