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.pswp.cn/news/914175.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914175.shtml

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

相关文章

【数据结构初阶】--顺序表(二)

&#x1f525;个人主页&#xff1a;草莓熊Lotso &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &#x1f4d6;个人专栏&#xff1a; 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言&#xff1a;生活是默默的坚持&#xff0c;毅力是永久的…

Java中的方法传参机制

1. 概述Java中的方法传参机制分为两种&#xff1a;值传递&#xff08;Pass by Value&#xff09; 和 引用传递&#xff08;Pass by Reference&#xff09;。然而&#xff0c;Java中所有的参数传递都是值传递&#xff0c;只不过对于对象来说&#xff0c;传递的是对象的引用地址的…

C++——this关键字和new关键字

一、this 关键字1. 什么是 this&#xff1f;this 是 C 中的一个隐式指针&#xff0c;它指向当前对象&#xff08;即调用成员函数的对象&#xff09;&#xff0c;在成员函数内部使用&#xff0c;用于引用调用该函数的对象。每个类的非静态成员函数内部都可以使用 this。使用 thi…

Python中类静态方法:@classmethod/@staticmethod详解和实战示例

在 Python 中&#xff0c;类方法 (classmethod) 和静态方法 (staticmethod) 是类作用域下的两种特殊方法。它们使用装饰器定义&#xff0c;并且与实例方法 (def func(self)) 的行为有所不同。1. 三种方法的对比概览方法类型是否访问实例 (self)是否访问类 (cls)典型用途实例方法…

FastGPT革命:下一代语言模型的极速进化

本文深度解析FastGPT核心技术架构&#xff0c;涵盖分布式推理、量化压缩、硬件加速等前沿方案&#xff0c;包含完整落地实践指南&#xff0c;助你掌握大模型高效部署的终极武器。引言&#xff1a;当大模型遭遇速度瓶颈2023年&#xff0c;ChatGPT引爆全球AI热潮&#xff0c;但企…

Geant4 安装---Ubuntu

安装工具 C/C工具包 sudo apt install build-essentialCmake sudo apt install -y cmakeccmake sudo apt install -y cmake-curses-gui安装Qt可视化工具(不需要可视化可以不安装) sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator 安装Ope…

Spring Boot中请求参数读取方式

目录 一、前言 二、六种参数读取方式 1.RequestParam 2.PathVariable 3.RequestBody 4.RequestHeader 5.CookieValue 6.MatrixVariable 三、对比和搭配 1.适用方法类型及建议使用场景 2.建议使用的请求路径注解 3. 多种参数同时使用 4.同一请求不同方案&#xff1f…

2025华为OD机试真题最新题库 (B+C+D+E+2025A+2025B卷) + 在线OJ在线刷题使用(C++、Java、Python C语言 JS合集)(正在更新2025B卷,目前已收录710道)

2025年&#xff0c;已经开始使用AB卷题库&#xff0c;题目和往期一样&#xff0c;旧题加新题的组合&#xff0c;有题目第一时间更新&#xff0c;大家可以跟着继续学习&#xff0c;目前使用复用题较多&#xff0c;可在OJ上直接找到对应的AB卷学习&#xff0c;可以放心学习&#…

分析新旧因子相关性

计算一组新因子、并分析它们与已有因子间的相关性1. 导入库和初始化环境功能代码解析数据加载2. 定义新因子计算函数功能代码解析因子 1&#xff1a;波动率过滤器&#xff08;filter_001_1&#xff09;因子 2&#xff1a;ATR 过滤器&#xff08;filter_001_2&#xff09;因子 3…

Unity Demo——3D平台跳跃游戏笔记

今天是一个3D平台跳跃游戏的笔记。我们按照以下分类来对这个项目的代码进行学习&#xff1a;核心游戏系统 (Core Game Systems)核心游戏系统是IkunOdyssey项目的基础&#xff0c;负责所有游戏对象&#xff08;如玩家、敌人、道具等&#xff09;的通用行为和物理交互。它通过实体…

【C语言】回调函数、转移表、qsort 使用与基于qsort改造冒泡排序

文章目录数组指针/指针数组函数指针函数指针数组函数指针数组用途(转移表)回调函数qsort函数基于qsort改造冒泡排序源码数组指针/指针数组 int arr1[5] { 1,2,3,4,5 };int (*p1)[5] &arr1; //p1是数组指针变量int* arr2[5] { 0 }; //arr2是指针数组指针数组是存放指…

vue3 uniapp 使用ref更新值后子组件没有更新 ref reactive的区别?使用from from -item执行表单验证一直提示没有值

遇到这样一个问题&#xff0c;我有个1个页面A&#xff0c;一个from表单组件&#xff0c;一个form-item组件&#xff0c; 使用是这样的&#xff0c;我在父组件A中使用 &#xff0c;执行表单验证一直提示没有值咱们先来讲一讲ref 和reactive的区别 ref 用来创建一个基本类型或单…

PyQt5布局管理(QBoxLayout(框布局))

QBoxLayout&#xff08;框布局&#xff09; 采用QBoxLayout类可以在水平和垂直方向上排列控件&#xff0c;QHBoxLayout和 QVBoxLayout类继承自QBoxLayout类。 QHBoxLayout&#xff08;水平布局&#xff09; 采用QHBoxLayout类&#xff0c;按照从左到右的顺序来添加控件。QHBoxL…

Grok 4作战图刷爆全网,80%华人横扫硅谷!清华上交校友领衔,95后站C位

来源 | 新智元短短两年&#xff0c;马斯克Grok 4的横空出世&#xff0c;让xAI团队一举站上AI之巅。昨日一小时发布会&#xff0c;Grok 4让所有人大开眼界&#xff0c;直接刷爆了AIME 2025、人类最后的考试&#xff08;HLE&#xff09;两大基准。这是狂堆20万GPU才换来的惊人成果…

AI大模型(七)Langchain核心模块与实战(二)

Langchain核心模块与实战&#xff08;二&#xff09;Langchian向量数据库检索Langchian构建向量数据库和检索器批量搜索返回与之相似度最高的第一个检索器和模型结合得到非笼统的答案LangChain构建代理通过代理去调用Langchain构建RAG的对话应用包含历史记录的对话生成Langchia…

Flutter基础(前端教程①-容器和控件位置)

一个红色背景的 Container垂直排列的 Column 布局中央的 ElevatedButton按钮下方的白色文本import package:flutter/material.dart;void main() {runApp(const MyApp()); }class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);overrideWidget bu…

CSS flex

目录 flex-box和flex-item 主轴和副轴 ​编辑 flex-box的属性 flex-direction flex-wrap flex-flow justify-content ​编辑​align-items align-content flex-item的属性 flex-basis flex-grow flex-shrink flex flex-box和flex-item 当把一个块级元素的displ…

【JMeter】执行系统命令

步骤如下&#xff1a; 添加JSP233 Sampler&#xff1a;右击线程组>添加>取样器>JSR223 Sampler2.填写脚本&#xff0c;执行后查看日志。res "ipconfig".execute().text log.info(res)res "python -c \"print(11)\"".execute().text l…

AI Agent开发学习系列 - langchain之memory(1):内存中的短时记忆

内存中的短时记忆&#xff0c;在 LangChain 中通常指 ConversationBufferMemory 这类“对话缓冲记忆”工具。它的作用是&#xff1a;在内存中保存最近的对话历史&#xff0c;让大模型能理解上下文&#xff0c;实现连续对话。 对话缓冲记忆”工具 主要特点 只保留最近的对话内容…

uniapp实现微信小程序端图片保存到相册

效果图展示 安装插件海报画板导入到项目里面&#xff0c;在页面直接使用 <template><view><button click"saveToAlbum" class"save-button">保存到相册</button><image :src"path" mode"widthFix" v-if&qu…