diff --git a/firmware/rust1/src/bin/heizung.rs b/firmware/rust1/src/bin/heizung.rs index 7e2e11f401734212a39b17c1d7daa2c6dc81a190..66939909ca41025240b12cc2e8a79a0739e8ddc9 100644 --- a/firmware/rust1/src/bin/heizung.rs +++ b/firmware/rust1/src/bin/heizung.rs @@ -6,6 +6,7 @@ use core::sync::atomic::*; use defmt::*; use embassy_executor::Spawner; +use embassy_executor::_export::StaticCell; //use embassy_futures::join::join; //use embassy_futures::select::*; use embassy_rp::adc::{self, Adc}; @@ -30,6 +31,15 @@ use heizung::rs485::RS485; use heizung::uf2updater::UF2UpdateHandler; use heizung::watchdog::WatchdogFixed; +macro_rules! singleton { + ($val:expr) => {{ + type T = impl Sized; + static STATIC_CELL: StaticCell<T> = StaticCell::new(); + let (x,) = STATIC_CELL.init(($val,)); + x + }}; +} + #[embassy_executor::task] async fn i2c_task(mut i2c_peri: embassy_rp::peripherals::I2C0, mut scl: embassy_rp::peripherals::PIN_13, mut sda: embassy_rp::peripherals::PIN_12, @@ -646,12 +656,10 @@ async fn main2(spawner: Spawner) { static OUTPUTS_ACTIVE: AtomicU8 = AtomicU8::new(0); unwrap!(spawner.spawn(adc_task(&ADC_DATA, p.ADC, en_measure_current, analog_in1, current2, current1, measure_vcc, &OUTPUTS_ACTIVE))); - static mut RX_BUFFER: [u8; 256] = [0; 256]; - //SAFETY: We only borrow it once because this function will only be called once. - let rx_buffer_ref = unsafe { &mut RX_BUFFER }; + let rx_buf = singleton!([0u8; 256]); let rs485 = RS485::new( p.UART0, rx, tx, tx_en, interrupt::take!(UART0_IRQ), - p.DMA_CH1, default_modbus_config(), rx_buffer_ref, + p.DMA_CH1, default_modbus_config(), rx_buf, p.PIO0, p.DMA_CH0, p.DMA_CH2, ModbusServer::new(ModBusRegs { led_g,