当前位置: 首页 > 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.dtcms.com/a/271222.html

相关文章:

  • 降AI工具有哪些推荐?降AI率网站的选择与使用指南
  • 人工智能-基础篇-27-模型上下文协议--MCP到底怎么理解?对比HTTP的区别?
  • SDR(软件定义无线电)与软件定义声学系统详解
  • ECR仓库CloudFormation模板完整指南
  • 第1章 Excel界面环境与基础操作指南
  • 精准医疗,AR 锚定球囊扩张导管为健康护航​
  • 微信小程序控制空调之微信小程序篇
  • 机器学习(西瓜书) 第四章 决策树
  • 【论文阅读】AdaReasoner: Adaptive Reasoning Enables More Flexible Thinking
  • 量化数据接口,level2历史数据,level2实时数据,逐笔成交,逐笔委托,10档行情接口
  • 姿态估计:捕捉人体动作的科技艺术
  • 科技对生态保育的影响?
  • Git系列--3.分支管理
  • 自学软件测试需要学哪些内容?
  • 图像硬解码和软解码
  • 轻量锁偏向锁重量锁害人不浅!synchronized源码!
  • eggNOG数据库注释文件
  • HCIA暑期作业
  • 阿里云和腾讯云RocketMQ 发消息和消费消息客户端JAVA接口
  • 高速公路门架系统的三种数据(交易流水、牌识流水、雷达轨迹)是怎么生成的
  • 区块链平台以太坊核心原理
  • 人工智能与机器学习暑期科研项目招募(可发表论文)
  • 【Modern C++ Part8】Prefer-nullptr-to-0-and-NULL
  • 小赛安全智脑×动态MCP Server:让组件API对接像搭积木一样简单
  • 基于lottie的微信小程序动画开发指南
  • [论文阅读] 软件工程 | 一篇关于开源许可证管理的深度综述
  • 轻松更改 Power BI 中的数据源类型
  • 川翔云电脑:突破硬件极限,重构设计生产力范式
  • 软件设计师中级概念题
  • Vue+ElementUI聊天室开发指南