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
英文地址,請注明出處:http://en.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…