Возврат полон повторяющихся записей при отладке прошивки Rust для STM32 с ARM GDB - PullRequest
3 голосов
/ 03 февраля 2020

Что я делаю

Я пытаюсь использовать 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)

и обновлены.

Любая помощь с устранением неполадок, это будет оценено.

...