diff --git a/embassy-rp/src/pio/mod.rs b/embassy-rp/src/pio/mod.rs index 8edbfa95c1..00d33ff3e9 100644 --- a/embassy-rp/src/pio/mod.rs +++ b/embassy-rp/src/pio/mod.rs @@ -1105,10 +1105,17 @@ impl<'d, PIO: Instance> Common<'d, PIO> { // PIO does support that. with only 32 instruction slots it // doesn't make much sense to do anything more fancy. let mut origin = 0; - while origin < 32 { + loop { match self.try_load_program_at(prog, origin as _) { Ok(r) => return Ok(r), - Err(a) => origin = a + 1, + Err(addr_in_use) => { + if addr_in_use < origin { + // wrapped around, theres no more space + break; + } + + origin = addr_in_use + 1; + } } } Err(LoadError::InsufficientSpace) diff --git a/tests/rp/src/bin/pio_multi_load.rs b/tests/rp/src/bin/pio_multi_load.rs index 82bbab2721..6dd1acddaf 100644 --- a/tests/rp/src/bin/pio_multi_load.rs +++ b/tests/rp/src/bin/pio_multi_load.rs @@ -124,6 +124,15 @@ async fn main(_spawner: Spawner) { }; } + // program won't fit + { + let prg = pio_asm!("nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop", "nop"); + match common.try_load_program(&prg.program) { + Err(LoadError::InsufficientSpace) => (), + _ => panic!("program loaded when it shouldn't"), + }; + } + info!("Test OK"); cortex_m::asm::bkpt(); }