diff --git a/firmware/rust1/src/bin/heizung.rs b/firmware/rust1/src/bin/heizung.rs
index b4c27cc8429711a509183eff64ab27b740b67bb3..e47c553c27c67ddc27d83cfe3763b4d788a215d4 100644
--- a/firmware/rust1/src/bin/heizung.rs
+++ b/firmware/rust1/src/bin/heizung.rs
@@ -419,8 +419,8 @@ impl<'a> ModbusRegisters for ModBusRegs<'a> {
     }
 }
 
-#[embassy_executor::main]
-async fn main(spawner: Spawner) {
+//#[embassy_executor::main]
+async fn main2(spawner: Spawner) {
     let p = embassy_rp::init(Default::default());
     info!("starting");
 
@@ -499,3 +499,37 @@ async fn main(spawner: Spawner) {
         Timer::after(Duration::from_secs(1)).await;
     }
 }
+
+
+/*
+#[embassy_executor::main]
+async fn main(spawner: Spawner) {
+    main2(spawner).await;
+}
+*/
+
+#[::embassy_executor::task()]
+async fn __embassy_main(spawner: Spawner) {
+    main2(spawner).await;
+}
+
+unsafe fn __make_static<T>(t: &mut T) -> &'static mut T {
+    ::core::mem::transmute(t)
+}
+
+#[cortex_m_rt::entry]
+fn main() -> ! {
+    init_early();
+
+    let mut executor = ::embassy_executor::Executor::new();
+    let executor = unsafe { __make_static(&mut executor) };
+    executor.run(|spawner| {
+        spawner.must_spawn(__embassy_main(spawner));
+    })
+}
+
+fn init_early() {
+    use embassy_rp::pac;
+    // release spinlock 31 because we sometimes block on this in the init code
+    unsafe { pac::SIO.spinlock(31).write_value(1); }
+}