Что я делаю
Я пытаюсь использовать Rust, чтобы сделать прошивку для платы STM32F103 и отладить ее с помощью GDB.
Мой проект более или менее следует за морганием. rs пример из https://github.com/stm32-rs/stm32f1xx-hal автомобиль go ящик, включая автомобиль go .toml. Единственным исключением является то, что я использую ящики cortex-m-semihosting
и panic-semihosting
.
РЕДАКТИРОВАТЬ : src/main.rs
:
#![deny(unsafe_code)]
#![no_std]
#![no_main]
use panic_halt as _;
use cortex_m_rt::entry;
use stm32f1xx_hal::{
prelude::*,
pac,
};
use embedded_hal::digital::v2::OutputPin;
#[entry]
fn main() -> ! {
let dp = pac::Peripherals::take().unwrap();
let mut rcc = dp.RCC.constrain();
let mut gpioc = dp.GPIOC.split(&mut rcc.apb2);
let mut led = gpioc.pc13.into_push_pull_output(&mut gpioc.crh);
led.set_low().unwrap();
loop {}
}
My .cargo/config
выглядит следующим образом:
[target.thumbv7m-none-eabi]
runner = 'arm-none-eabi-gdb'
rustflags = [
"-C", "link-arg=-Tlink.x", # also tried old way with gcc linker, no difference
]
[build]
target = "thumbv7m-none-eabi"
Cargo.toml
:
[package]
name = "blue-pill-rust"
version = "0.1.0"
edition = "2018"
[[bin]]
name = "blue-pill-rust"
test = false
bench = false
[profile.release]
opt-level = "s"
debug = true
[dependencies.stm32f1xx-hal]
version = "0.5.3"
features = ["stm32f103", "rt", "medium"]
[dependencies.cortex-m]
version = "0.6.2"
[dependencies.cortex-m-rt]
version = "0.6.12"
[dependencies]
panic-halt = "0.2.0"
Что происходит
Я использую GDB напрямую для запуска sh прошивки (свойство отладчика BlackMagicProbe), но тот же результат произошел с OpenOCD:
$ arm-none-eabi-gdb
GNU gdb (GDB) 8.3.1
...
(gdb) target extended-remote /dev/ttyBmpGdb
Remote debugging using /dev/ttyBmpGdb
(gdb) attach 1
Attaching to Remote target
warning: No executable has been specified and target does not support
determining executable automatically. Try using the "file" command.
0x0800448c in ?? ()
(gdb) file target/thumbv7m-none-eabi/release/blue-pill-rust
Reading symbols from target/thumbv7m-none-eabi/release/blue-pill-rust...
(gdb) load
...
(gdb) start
Temporary breakpoint 1 at 0x8000130: file src/main.rs, line 27.
Starting program: /media/data/projects/rust/blue-pill-rust/target/thumbv7m-none-eabi/release/blue-pill-rust
Note: automatically using hardware breakpoints for read-only addresses.
Temporary breakpoint 1, main () at src/main.rs:27
27 #[entry]
(gdb) step
blue_pill_rust::__cortex_m_rt_main () at src/main.rs:33
33 hprintln!("hello, world!").unwrap();
(gdb) next
hello, world!
warning: (Internal error: pc 0x80004d2 in read in psymtab, but not in symtab.)
warning: (Internal error: pc 0x80004d2 in read in psymtab, but not in symtab.)
warning: (Internal error: pc 0x80004d2 in read in psymtab, but not in symtab.)
warning: (Internal error: pc 0x80004d2 in read in psymtab, but not in symtab.)
warning: (Internal error: pc 0x80004d2 in read in psymtab, but not in symtab.)
warning: (Internal error: pc 0x80004d2 in read in psymtab, but not in symtab.)
36 let cp = cortex_m::Peripherals::take().unwrap();
(gdb)
Одна и та же проблема повторяется для других строк кода каждый раз, когда я делаю next
, поэтому не должно быть проблем с полуохостингом ARM (который выводит «Hello, World» ! ").
Я попытался отключить оптимизацию времени ссылки в Car go .toml (lto = false
). Похоже, это решило проблему с этой ошибкой, но основная проблема вопроса сохраняется.
В любом случае, если я проверяю backtrace
после next
несколько раз, я получаю следующую картину:
(gdb) bt
...
#407 0x08000152 in blue_pill_rust::__cortex_m_rt_main () at src/main.rs:31
#408 0x08000152 in blue_pill_rust::__cortex_m_rt_main () at src/main.rs:31
#409 0x08000152 in blue_pill_rust::__cortex_m_rt_main () at src/main.rs:31
#410 0x08000152 in blue_pill_rust::__cortex_m_rt_main () at src/main.rs:31
#411 0x08000152 in blue_pill_rust::__cortex_m_rt_main () at src/main.rs:31
#412 0x08000152 in blue_pill_rust::__cortex_m_rt_main () at src/main.rs:31
#413 0x08000152 in blue_pill_rust::__cortex_m_rt_main () at src/main.rs:31
#414 0x08000152 in blue_pill_rust::__cortex_m_rt_main () at src/main.rs:31
...
и это выходит за пределы 1000 записей.
Я попытался заменить 0 уровень оптимизации на "s"
(с отключенным lto) в Car go .toml. Это приводит к аналогичной проблеме, но немного более многословной:
...
#1576 blue_pill_rust::__cortex_m_rt_main () at src/main.rs:34
#1577 0x080001e2 in cortex_m::interrupt::enable ()
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/interrupt.rs:49
#1578 cortex_m::interrupt::free (f=...)
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/interrupt.rs:75
#1579 cortex_m::peripheral::Peripherals::take ()
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/peripheral/mod.rs:152
#1580 blue_pill_rust::__cortex_m_rt_main () at src/main.rs:34
#1581 0x080001e2 in cortex_m::interrupt::enable ()
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/interrupt.rs:49
#1582 cortex_m::interrupt::free (f=...)
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/interrupt.rs:75
#1583 cortex_m::peripheral::Peripherals::take ()
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/peripheral/mod.rs:152
#1584 blue_pill_rust::__cortex_m_rt_main () at src/main.rs:34
#1585 0x080001e2 in cortex_m::interrupt::enable ()
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/interrupt.rs:49
#1586 cortex_m::interrupt::free (f=...)
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/interrupt.rs:75
#1587 cortex_m::peripheral::Peripherals::take ()
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/peripheral/mod.rs:152
#1588 blue_pill_rust::__cortex_m_rt_main () at src/main.rs:34
#1589 0x080001e2 in cortex_m::interrupt::enable ()
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/interrupt.rs:49
#1590 cortex_m::interrupt::free (f=...)
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/interrupt.rs:75
#1591 cortex_m::peripheral::Peripherals::take ()
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/peripheral/mod.rs:152
#1592 blue_pill_rust::__cortex_m_rt_main () at src/main.rs:34
#1593 0x080001e2 in cortex_m::interrupt::enable ()
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/interrupt.rs:49
#1594 cortex_m::interrupt::free (f=...)
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/interrupt.rs:75
#1595 cortex_m::peripheral::Peripherals::take ()
--Type <RET> for more, q to quit, c to continue without paging--
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/peripheral/mod.rs:152
#1596 blue_pill_rust::__cortex_m_rt_main () at src/main.rs:34
#1597 0x080001e2 in cortex_m::interrupt::enable ()
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/interrupt.rs:49
#1598 cortex_m::interrupt::free (f=...)
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/interrupt.rs:75
#1599 cortex_m::peripheral::Peripherals::take ()
at /home/superprower/.cargo/registry/src/github.com-1ecc6299db9ec823/cortex-m-0.6.2/src/peripheral/mod.rs:152
#1600 blue_pill_rust::__cortex_m_rt_main () at src/main.rs:34
#1601 0x080001e2 in cortex_m::interrupt::enable ()
...
Как будто при возврате из функций записи не очищаются или что-то в этом роде.
Среда
Моя GDB (а также другие утилиты для кросс-компиляции) приходят из Arch Linux Репозитории :
$ arm-none-eabi-gdb -v
GNU gdb (GDB) 8.3.1
$ arm-none-eabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-none-eabi-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-none-eabi/9.2.0/lto-wrapper
Target: arm-none-eabi
Configured with: /build/arm-none-eabi-gcc/src/gcc-9.2.0/configure --target=arm-none-eabi --prefix=/usr --with-sysroot=/usr/arm-none-eabi --with-native-system-header-dir=/include --libexecdir=/usr/lib --enable-languages=c,c++ --enable-plugins --disable-decimal-float --disable-libffi --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libssp --disable-libstdcxx-pch --disable-nls --disable-shared --disable-threads --disable-tls --with-gnu-as --with-gnu-ld --with-system-zlib --with-newlib --with-headers=/usr/arm-none-eabi/include --with-python-dir=share/gcc-arm-none-eabi --with-gmp --with-mpfr --with-mpc --with-isl --with-libelf --enable-gnu-indirect-function --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-pkgversion='Arch Repository' --with-bugurl=https://bugs.archlinux.org/ --with-multilib-list=rmprofile
Thread model: single
gcc version 9.2.0 (Arch Repository)
и обновлены.
Любая помощь с устранением неполадок, это будет оценено.