rust-embedded / cortex-m

Low level access to Cortex-M processors
Apache License 2.0
826 stars 152 forks source link

iprintln!() fails to print after printing certain amount of data #229

Open JOE1994 opened 4 years ago

JOE1994 commented 4 years ago

Hello :crab:, when running the program below that repeatedly calls iprintln!(), it always stops printing at the same point in code, not finishing the printing tasks. It should print "Hello World ~" 77 times in a loop, but the program always stops printing in the middle of 26th invocation of iprintln!().

#[entry]
fn main() -> ! {
    if let (Some(dp), Some(mut cp)) = (
        stm32::Peripherals::take(),
        cortex_m::peripheral::Peripherals::take(),
    ) {
        // Set up the system clock. We want to run at 168MHz for this one.
        let rcc = dp.RCC.constrain();
        let clocks = rcc.cfgr.sysclk(168.mhz()).freeze();
        let mut itm = cp.ITM;
        for i in 0..77 {
            iprintln!(&mut itm.stim[0], "Hello World for the {}-th time", i);            
        }

        loop {
            continue;
        }
    }

    // Failed to access peripherals..
    panic!();
}

logs from ITM are stored locally in itm.txt, and the log is always the same as below (no matter how many times I try running).

Hello World for the 0-th time
Hello World for the 1-th time
Hello World for the 2-th time
Hello World for the 3-th time
Hello World for the 4-th time
Hello World for the 5-th time
Hello World for the 6-th time
Hello World for the 7-th time
Hello World for the 8-th time
Hello World for the 9-th time
Hello World for the 10-th time
Hello World for the 11-th time
Hello World for the 12-th time
Hello World for the 13-th time
Hello World for the 14-th time
Hello World for the 15-th time
Hello World for the 16-th time
Hello World for the 17-th time
Hello World for the 18-th time
Hello World for the 19-th time
Hello World for the 20-th time
Hello World for the 21-th time
Hello World for the 22-th time
Hello World for the 23-th time
Hello World for the 24-th time
Hello World

Is there a maximum limit of data that iprintln! can send in total? If not, I guess this should be considered a bug..

Metadata

bcantrill commented 4 years ago

How are you consuming ITM? For whatever it's worth, your example works for me with an ITM consumer that we have purpose built that consumes ITM via the TPIU; are you using the STLink/V2 on the Discovery and then OpenOCD? And is your program stopping, or is the ITM data being dropped?

JOE1994 commented 4 years ago

How are you consuming ITM? For whatever it's worth, your example works for me with an ITM consumer that we have purpose built that consumes ITM via the TPIU; are you using the STLink/V2 on the Discovery and then OpenOCD? And is your program stopping, or is the ITM data being dropped?

Thank you so much for testing the example on your side! :smile_cat: I am using STLink/V2-1 on the Discovery and with OpenOCD. The program runs to completion and reaches the infinite loop at the end, and only the ITM data is dropped :crying_cat_face:

(Using gdb-multiarch), I tried executing the code instruction-by-instruction using the n command to see if doing that could make the program successfully run all invocations of iprintln!().. But pressing n just once simply executes the program all the way to the end..

(gdb) n

Breakpoint 4, main () at src/main.rs:20
20      #[entry]
(gdb) n
(gdb) ^C
Program received signal SIGINT, Interrupt.
stim_practice::__cortex_m_rt_main () at src/main.rs:37
37              loop {
(gdb) 
JOE1994 commented 4 years ago

Update: I tested the above example program on another board(Nucleo-429ZI), and it also exhibits the same behavior :crying_cat_face:

So far I've tested two devices and they both exhibit the same behavior. Both belong to the STM32F4 series.

At the moment, I'm not sure what's causing this. (guess: issue with OpenOCD?)

jonas-schievink commented 3 years ago

Maybe try with probe-rs' ITM support?