91视频免费?看_蜜芽MY188精品TV在线观看_国产免费无遮挡在线观看视频_深夜国产_亚洲精品欧洲精品_欧美黑人粗暴多交

GDB 調試 Rust 嵌入式程序-以國產單片機為例

本篇文章將介紹如何使用GDB命令調試Rust嵌入式代碼,以國產的arm單片機py32為例。開發環境為Mac下,使用Jlink作為下載和調試工具。

原理

我們調試單片機的主要用到該單片機編譯工具鏈的gdb工具arm-none-eabi-gdb。與本地gdb工具調試不一樣的是,嵌入式gdb工具的目標通常在遠端的嵌入式主板上而非本地主機,因此需要一個調試器來連接嵌入式主板和主機,通常可以使用jlink,stlink,cmsis-cap等工具提供服務,通過調試工具將固件燒錄到硬件后,再與gdb程序進行通信,解析調試命令,控制遠程硬件CPU。

測試程序

#![no_std]
#![no_main]

use embedded_hal::timer::CountDown;
use fugit::ExtU32;
use hal::mode::Blocking;
use hal::timer::advanced_timer::AnyTimer;
use py32f030_hal as hal;

use {defmt_rtt as _, panic_probe as _};

#[cortex_m_rt::entry]
fn main() -> ! {
    defmt::info!("timer counter examples start...");
    let p = hal::init(Default::default());

    let timer = AnyTimer::<_, Blocking>::new(p.TIM1).unwrap();
    let mut counter = timer.as_counter();

    let mut cnt = 0;
    loop {
        // 延時 5s
        defmt::info!("repeat...{} ", cnt);
        let _ = counter.start(5u32.secs());
        let _ = counter.wait();
        cnt += 1;
    }
}

開啟GDB

Embed.toml文件配置中開啟GDB服務

[default.general]        
chip = "PY32F030x8"        

[default.rtt]        
enabled = false        

[default.gdb]        
enabled = true        

[default.reset]        
halt_afterwards = true 

執行cargo embed命令燒錄代碼以及自動開啟GDB服務,默認端口1337,保持該命令后臺繼續運行。

gdb調試

在其他終端中執行命令

arm-none-eabi-gdb target/thumbv6m-none-eabi/debug/examples/advanced_timer_block_2

連接GDB服務器target remote:1337即可連接單片機,可查看CPU信息。

如查看arm寄存器:info registers

查看匯編代碼disassemble

可以在匯編文件中看到代碼的起點是cortex_m_rt::DefaultPreInit函數。然后是進入Reset,然后才進入main函數。

通過命令step單步執行,可以在命令disassemble的左側箭頭查看當前運行的地址。

為了快速執行到main函數,可以用斷點命令b main打斷點,然后使用continue命令直接運行到斷點處。

由于匯編后的函數和變量名可能被重新命令,可以使用命令set print asm-demangle on,讓匯編中的函數和變量使用原代碼中的命名。

可以使用list命令查看當前代碼執行的情況,使用break N命令添加指定行的斷點

使用info locals命令查看當前的局部變量,使用print命令打印變量的值

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 1
收藏 2
關注 14
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 宣化县| 康保县| 石河子市| 蕉岭县| 庄河市| 海晏县| 红河县| 德化县| 林西县| 五华县| 富宁县| 焉耆| 南雄市| 阳谷县| 蓬莱市| 陇川县| 南召县| 安义县| 阳城县| 上林县| 孝义市| 阳西县| 徐州市| 保靖县| 民勤县| 和顺县| 金华市| 灵山县| 开江县| 宜君县| 隆安县| 萍乡市| 邯郸市| 西盟| 扶风县| 鞍山市| 邵阳市| 涞水县| 吐鲁番市| 北宁市| 南平市|