調試 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
中的所有 export
、alias
、虛擬環境激活、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
會失敗或者打包內容不完整。
? 正確的使用順序如下:
- 配置編譯環境
export RTT_EXEC_PATH=/usr/bin # 或你的 arm-none-eabi 工具鏈路徑
scons --menuconfig # 生成 .config 和 rtconfig.py
- 編譯項目,確保能正常構建
scons # 構建 rt-thread 項目,生成 .elf 等產物
- 打包項目
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開發。