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,