From 65757d246a098f8b1ea00e0810c0549b568ab4c6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Robert=20J=C3=B6rdens?= <rj@quartiq.de>
Date: Sat, 30 Dec 2023 12:56:20 +0000
Subject: [PATCH 1/2] port to rtic2

---
 Cargo.lock            | 172 +++++++++++++++++++++++++++++-------------
 Cargo.toml            |   3 +-
 src/bin/dual-iir.rs   |  97 +++++++++++++-----------
 src/bin/lockin.rs     | 103 ++++++++++++++-----------
 src/hardware/mod.rs   |   2 +-
 src/hardware/setup.rs |   5 +-
 6 files changed, 236 insertions(+), 146 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 8e539dd24..d237f120a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -9,7 +9,7 @@ dependencies = [
  "bit_field",
  "bitflags 2.4.1",
  "bytemuck",
- "embedded-hal",
+ "embedded-hal 0.2.7",
 ]
 
 [[package]]
@@ -173,7 +173,7 @@ dependencies = [
  "bare-metal 0.2.5",
  "bitfield",
  "critical-section",
- "embedded-hal",
+ "embedded-hal 0.2.7",
  "volatile-register",
 ]
 
@@ -197,34 +197,6 @@ dependencies = [
  "syn 1.0.109",
 ]
 
-[[package]]
-name = "cortex-m-rtic"
-version = "1.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d696ae7390bdb9f7978f71ca7144256a2c4616240a6df9002da3c451f9fc8f02"
-dependencies = [
- "bare-metal 1.0.0",
- "cortex-m 0.7.7",
- "cortex-m-rtic-macros",
- "heapless 0.7.16",
- "rtic-core",
- "rtic-monotonic",
- "version_check",
-]
-
-[[package]]
-name = "cortex-m-rtic-macros"
-version = "1.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eefb40b1ca901c759d29526e5c8a0a1b246c20caaa5b4cc5d0f0b94debecd4c7"
-dependencies = [
- "proc-macro-error",
- "proc-macro2",
- "quote",
- "rtic-syntax",
- "syn 1.0.109",
-]
-
 [[package]]
 name = "critical-section"
 version = "1.1.2"
@@ -250,6 +222,12 @@ dependencies = [
  "void",
 ]
 
+[[package]]
+name = "embedded-hal"
+version = "1.0.0-rc.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc402f79e1fd22731ca945b4f97b5ff37e7b3f379312595c42bb2e8811c29920"
+
 [[package]]
 name = "embedded-io"
 version = "0.6.1"
@@ -302,6 +280,12 @@ dependencies = [
  "syn 2.0.38",
 ]
 
+[[package]]
+name = "equivalent"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+
 [[package]]
 name = "form_urlencoded"
 version = "1.2.1"
@@ -320,6 +304,30 @@ dependencies = [
  "gcd",
 ]
 
+[[package]]
+name = "futures-core"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
+
+[[package]]
+name = "futures-task"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
+
+[[package]]
+name = "futures-util"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "pin-project-lite",
+ "pin-utils",
+]
+
 [[package]]
 name = "gcd"
 version = "2.3.0"
@@ -387,9 +395,9 @@ dependencies = [
 
 [[package]]
 name = "hashbrown"
-version = "0.12.3"
+version = "0.14.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
 
 [[package]]
 name = "heapless"
@@ -438,11 +446,11 @@ dependencies = [
 
 [[package]]
 name = "indexmap"
-version = "1.9.3"
+version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f"
 dependencies = [
- "autocfg",
+ "equivalent",
  "hashbrown",
 ]
 
@@ -503,7 +511,7 @@ version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f05acdc7a7d6da7b9be48c2d1de2f9757d37d3a83564aa82b4ae6d7ad15d0db6"
 dependencies = [
- "embedded-hal",
+ "embedded-hal 0.2.7",
 ]
 
 [[package]]
@@ -535,7 +543,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0c5a338372c83c3eff68c07a23fe00dff2b2c9195583a2d464292919bc27de04"
 dependencies = [
  "bit_field",
- "embedded-hal",
+ "embedded-hal 0.2.7",
  "num_enum 0.5.11",
  "paste",
 ]
@@ -787,6 +795,18 @@ version = "2.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
 
+[[package]]
+name = "pin-project-lite"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
 [[package]]
 name = "pkg-config"
 version = "0.3.27"
@@ -868,29 +888,78 @@ dependencies = [
 ]
 
 [[package]]
-name = "rtic-core"
+name = "rtic"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "857ce76a2517808a303bcb7e5b6d4a9c1d84e5de88b302aec2e53744633c0f4d"
+dependencies = [
+ "atomic-polyfill 1.0.3",
+ "bare-metal 1.0.0",
+ "cortex-m 0.7.7",
+ "critical-section",
+ "rtic-core",
+ "rtic-macros",
+]
+
+[[package]]
+name = "rtic-common"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9369355b04d06a3780ec0f51ea2d225624db777acbc60abd8ca4832da5c1a42"
+checksum = "0786b50b81ef9d2a944a000f60405bb28bf30cd45da2d182f3fe636b2321f35c"
+dependencies = [
+ "critical-section",
+]
 
 [[package]]
-name = "rtic-monotonic"
+name = "rtic-core"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb8b0b822d1a366470b9cea83a1d4e788392db763539dc4ba022bcc787fece82"
+checksum = "d9369355b04d06a3780ec0f51ea2d225624db777acbc60abd8ca4832da5c1a42"
 
 [[package]]
-name = "rtic-syntax"
-version = "1.0.3"
+name = "rtic-macros"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f5e215601dc467752c2bddc6284a622c6f3d2bab569d992adcd5ab7e4cb9478"
+checksum = "8617533990b728e31bc65fcec8fec51fa1b4000fb33189ebeb05fb9d8625444d"
 dependencies = [
  "indexmap",
+ "proc-macro-error",
  "proc-macro2",
  "quote",
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "rtic-monotonic"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb8b0b822d1a366470b9cea83a1d4e788392db763539dc4ba022bcc787fece82"
+
+[[package]]
+name = "rtic-monotonics"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83175938634a0fb86facfc5bf4dd172317b26c4e91056438f27df093626b233f"
+dependencies = [
+ "atomic-polyfill 1.0.3",
+ "cfg-if",
+ "cortex-m 0.7.7",
+ "embedded-hal 1.0.0-rc.3",
+ "fugit",
+ "rtic-time",
+]
+
+[[package]]
+name = "rtic-time"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02f3a0f0828950e308af95960b75fb4284b0c404b1e334ae0abe13f52b7650ab"
+dependencies = [
+ "critical-section",
+ "futures-util",
+ "rtic-common",
+]
+
 [[package]]
 name = "rtt-logger"
 version = "0.2.1"
@@ -1020,7 +1089,7 @@ checksum = "05f8438a40b91c8b9531c664e9680c55b92bd78cd6809a8b45b4512b1e5765f2"
 dependencies = [
  "atomic-polyfill 0.1.11",
  "cortex-m 0.6.7",
- "embedded-hal",
+ "embedded-hal 0.2.7",
  "nb 0.1.3",
 ]
 
@@ -1032,7 +1101,7 @@ checksum = "c6b8d3f0e34309c22ca4a9a27d24fa493e31573485f3493802b75b9d706756a6"
 dependencies = [
  "atomic-polyfill 1.0.3",
  "cortex-m 0.7.7",
- "embedded-hal",
+ "embedded-hal 0.2.7",
  "nb 1.1.0",
 ]
 
@@ -1102,8 +1171,7 @@ dependencies = [
  "built",
  "cortex-m 0.7.7",
  "cortex-m-rt",
- "cortex-m-rtic",
- "embedded-hal",
+ "embedded-hal 0.2.7",
  "embedded-io",
  "embedded-storage",
  "enum-iterator",
@@ -1123,6 +1191,8 @@ dependencies = [
  "postcard",
  "rand_core",
  "rand_xorshift",
+ "rtic",
+ "rtic-monotonics",
  "rtt-logger",
  "rtt-target",
  "sequential-storage",
@@ -1165,7 +1235,7 @@ dependencies = [
  "cast",
  "cortex-m 0.7.7",
  "embedded-dma",
- "embedded-hal",
+ "embedded-hal 0.2.7",
  "embedded-storage",
  "fugit",
  "nb 1.1.0",
@@ -1205,7 +1275,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e948d523b316939545d8b21a48c27aef150ce25321b9f95ff7978647a806a6fe"
 dependencies = [
  "cortex-m 0.7.7",
- "embedded-hal",
+ "embedded-hal 0.2.7",
  "usb-device",
  "vcell",
 ]
@@ -1296,7 +1366,7 @@ name = "usbd-serial"
 version = "0.2.0"
 source = "git+https://github.com/rust-embedded-community/usbd-serial?rev=096742c1c480f6f63c1a936a3c23ede7993c624d#096742c1c480f6f63c1a936a3c23ede7993c624d"
 dependencies = [
- "embedded-hal",
+ "embedded-hal 0.2.7",
  "embedded-io",
  "nb 1.1.0",
  "usb-device",
diff --git a/Cargo.toml b/Cargo.toml
index 4e1db96cf..8ff004ae5 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -46,7 +46,8 @@ rtt-target = "0.3"
 serde = { version = "1.0", features = ["derive"], default-features = false }
 serde-json-core = "0.5"
 heapless = { version = "0.7.16", features = ["serde"] }
-cortex-m-rtic = "1.0"
+rtic = { version = "2.0", features = ["thumbv7-backend"] }
+rtic-monotonics = { version = "1.0", features = ["cortex-m-systick"] }
 embedded-hal = "0.2.7"
 num_enum = { version = "0.7.1", default-features = false }
 paste = "1"
diff --git a/src/bin/dual-iir.rs b/src/bin/dual-iir.rs
index 70e2861fe..9d07b0171 100644
--- a/src/bin/dual-iir.rs
+++ b/src/bin/dual-iir.rs
@@ -25,14 +25,16 @@
 //! ## Livestreaming
 //! This application streams raw ADC and DAC data over UDP. Refer to
 //! [stabilizer::net::data_stream](../stabilizer/net/data_stream/index.html) for more information.
-#![deny(warnings)]
+#![feature(type_alias_impl_trait)]
 #![no_std]
 #![no_main]
 
 use core::mem::MaybeUninit;
 use core::sync::atomic::{fence, Ordering};
 
-use fugit::ExtU64;
+use rtic_monotonics::Monotonic;
+
+use fugit::ExtU32;
 use mutex_trait::prelude::*;
 
 use idsp::iir;
@@ -178,9 +180,6 @@ impl Default for Settings {
 mod app {
     use super::*;
 
-    #[monotonic(binds = SysTick, default = true, priority = 2)]
-    type Monotonic = Systick;
-
     #[shared]
     struct Shared {
         usb: UsbDevice,
@@ -205,8 +204,8 @@ mod app {
     }
 
     #[init]
-    fn init(c: init::Context) -> (Shared, Local, init::Monotonics) {
-        let clock = SystemTimer::new(|| monotonics::now().ticks() as u32);
+    fn init(c: init::Context) -> (Shared, Local) {
+        let clock = SystemTimer::new(|| Systick::now().ticks() as u32);
 
         // Configure the microcontroller
         let (stabilizer, _pounder) = hardware::setup::setup(
@@ -274,13 +273,14 @@ mod app {
         telemetry::spawn().unwrap();
         ethernet_link::spawn().unwrap();
         usb::spawn().unwrap();
-        start::spawn_after(100.millis()).unwrap();
+        start::spawn().unwrap();
 
-        (shared, local, init::Monotonics(stabilizer.systick))
+        (shared, local)
     }
 
     #[task(priority = 1, local=[sampling_timer])]
-    fn start(c: start::Context) {
+    async fn start(c: start::Context) {
+        Systick::delay(100.millis()).await;
         // Start sampling ADCs and DACs.
         c.local.sampling_timer.start();
     }
@@ -308,6 +308,7 @@ mod app {
             settings,
             telemetry,
             signal_generator,
+            ..
         } = c.shared;
 
         let process::LocalResources {
@@ -316,6 +317,7 @@ mod app {
             dacs: (dac0, dac1),
             iir_state,
             generator,
+            ..
         } = c.local;
 
         (settings, telemetry, signal_generator).lock(
@@ -418,7 +420,7 @@ mod app {
     }
 
     #[task(priority = 1, local=[afes], shared=[network, settings, signal_generator])]
-    fn settings_update(mut c: settings_update::Context) {
+    async fn settings_update(mut c: settings_update::Context) {
         let settings = c.shared.network.lock(|net| *net.miniconf.settings());
         c.shared.settings.lock(|current| *current = settings);
 
@@ -446,45 +448,52 @@ mod app {
     }
 
     #[task(priority = 1, shared=[network, settings, telemetry], local=[cpu_temp_sensor])]
-    fn telemetry(mut c: telemetry::Context) {
-        let telemetry: TelemetryBuffer =
-            c.shared.telemetry.lock(|telemetry| *telemetry);
-
-        let (gains, telemetry_period) = c
-            .shared
-            .settings
-            .lock(|settings| (settings.afe, settings.telemetry_period));
-
-        c.shared.network.lock(|net| {
-            net.telemetry.publish(&telemetry.finalize(
-                gains[0],
-                gains[1],
-                c.local.cpu_temp_sensor.get_temperature().unwrap(),
-            ))
-        });
-
-        // Schedule the telemetry task in the future.
-        telemetry::Monotonic::spawn_after((telemetry_period as u64).secs())
-            .unwrap();
+    async fn telemetry(mut c: telemetry::Context) {
+        loop {
+            let telemetry: TelemetryBuffer =
+                c.shared.telemetry.lock(|telemetry| *telemetry);
+
+            let (gains, telemetry_period) = c
+                .shared
+                .settings
+                .lock(|settings| (settings.afe, settings.telemetry_period));
+
+            c.shared.network.lock(|net| {
+                net.telemetry.publish(&telemetry.finalize(
+                    gains[0],
+                    gains[1],
+                    c.local.cpu_temp_sensor.get_temperature().unwrap(),
+                ))
+            });
+
+            Systick::delay((telemetry_period as u32).secs()).await;
+        }
     }
 
     #[task(priority = 1, shared=[usb], local=[usb_terminal])]
-    fn usb(mut c: usb::Context) {
-        // Handle the USB serial terminal.
-        c.shared.usb.lock(|usb| {
-            usb.poll(&mut [c.local.usb_terminal.interface_mut().inner_mut()]);
-        });
-
-        c.local.usb_terminal.process().unwrap();
-
-        // Schedule to run this task every 10 milliseconds.
-        usb::spawn_after(10u64.millis()).unwrap();
+    async fn usb(mut c: usb::Context) {
+        {
+            // Handle the USB serial terminal.
+            c.shared.usb.lock(|usb| {
+                usb.poll(&mut [c
+                    .local
+                    .usb_terminal
+                    .interface_mut()
+                    .inner_mut()]);
+            });
+
+            c.local.usb_terminal.process().unwrap();
+
+            Systick::delay(10.millis()).await;
+        }
     }
 
     #[task(priority = 1, shared=[network])]
-    fn ethernet_link(mut c: ethernet_link::Context) {
-        c.shared.network.lock(|net| net.processor.handle_link());
-        ethernet_link::Monotonic::spawn_after(1.secs()).unwrap();
+    async fn ethernet_link(mut c: ethernet_link::Context) {
+        loop {
+            c.shared.network.lock(|net| net.processor.handle_link());
+            Systick::delay(1.secs()).await;
+        }
     }
 
     #[task(binds = ETH, priority = 1)]
diff --git a/src/bin/lockin.rs b/src/bin/lockin.rs
index c4237c8be..5b85c13c2 100644
--- a/src/bin/lockin.rs
+++ b/src/bin/lockin.rs
@@ -24,7 +24,7 @@
 //! ## Livestreaming
 //! This application streams raw ADC and DAC data over UDP. Refer to
 //! [stabilizer::net::data_stream](../stabilizer/net/data_stream/index.html) for more information.
-#![deny(warnings)]
+#![feature(type_alias_impl_trait)]
 #![no_std]
 #![no_main]
 
@@ -34,7 +34,9 @@ use core::{
     sync::atomic::{fence, Ordering},
 };
 
-use fugit::ExtU64;
+use rtic_monotonics::Monotonic;
+
+use fugit::ExtU32;
 use mutex_trait::prelude::*;
 
 use idsp::{Accu, Complex, ComplexExt, Filter, Lockin, Lowpass, Repeat, RPLL};
@@ -217,9 +219,6 @@ impl Default for Settings {
 mod app {
     use super::*;
 
-    #[monotonic(binds = SysTick, default = true, priority = 2)]
-    type Monotonic = Systick;
-
     #[shared]
     struct Shared {
         usb: UsbDevice,
@@ -245,8 +244,8 @@ mod app {
     }
 
     #[init]
-    fn init(c: init::Context) -> (Shared, Local, init::Monotonics) {
-        let clock = SystemTimer::new(|| monotonics::now().ticks() as u32);
+    fn init(c: init::Context) -> (Shared, Local) {
+        let clock = SystemTimer::new(|| Systick::now().ticks() as u32);
 
         // Configure the microcontroller
         let (mut stabilizer, _pounder) = hardware::setup::setup(
@@ -315,7 +314,7 @@ mod app {
         settings_update::spawn().unwrap();
         telemetry::spawn().unwrap();
         ethernet_link::spawn().unwrap();
-        start::spawn_after(100.millis()).unwrap();
+        start::spawn().unwrap();
 
         // Start recording digital input timestamps.
         stabilizer.timestamp_timer.start();
@@ -323,11 +322,12 @@ mod app {
         // Enable the timestamper.
         local.timestamper.start();
 
-        (shared, local, init::Monotonics(stabilizer.systick))
+        (shared, local)
     }
 
     #[task(priority = 1, local=[sampling_timer])]
-    fn start(c: start::Context) {
+    async fn start(c: start::Context) {
+        Systick::delay(100.millis()).await;
         // Start sampling ADCs and DACs.
         c.local.sampling_timer.start();
     }
@@ -345,6 +345,7 @@ mod app {
         let process::SharedResources {
             settings,
             telemetry,
+            ..
         } = c.shared;
 
         let process::LocalResources {
@@ -355,6 +356,7 @@ mod app {
             lockin,
             signal_generator,
             generator,
+            ..
         } = c.local;
 
         (settings, telemetry).lock(|settings, telemetry| {
@@ -480,7 +482,7 @@ mod app {
     }
 
     #[task(priority = 1, local=[afes], shared=[network, settings])]
-    fn settings_update(mut c: settings_update::Context) {
+    async fn settings_update(mut c: settings_update::Context) {
         let settings = c.shared.network.lock(|net| *net.miniconf.settings());
         c.shared.settings.lock(|current| *current = settings);
 
@@ -492,50 +494,59 @@ mod app {
     }
 
     #[task(priority = 1, local=[digital_inputs, cpu_temp_sensor], shared=[network, settings, telemetry])]
-    fn telemetry(mut c: telemetry::Context) {
-        let mut telemetry: TelemetryBuffer =
-            c.shared.telemetry.lock(|telemetry| *telemetry);
-
-        telemetry.digital_inputs = [
-            c.local.digital_inputs.0.is_high(),
-            c.local.digital_inputs.1.is_high(),
-        ];
-
-        let (gains, telemetry_period) = c
-            .shared
-            .settings
-            .lock(|settings| (settings.afe, settings.telemetry_period));
-
-        c.shared.network.lock(|net| {
-            net.telemetry.publish(&telemetry.finalize(
-                gains[0],
-                gains[1],
-                c.local.cpu_temp_sensor.get_temperature().unwrap(),
-            ))
-        });
+    async fn telemetry(mut c: telemetry::Context) {
+        loop {
+            let mut telemetry: TelemetryBuffer =
+                c.shared.telemetry.lock(|telemetry| *telemetry);
+
+            telemetry.digital_inputs = [
+                c.local.digital_inputs.0.is_high(),
+                c.local.digital_inputs.1.is_high(),
+            ];
+
+            let (gains, telemetry_period) = c
+                .shared
+                .settings
+                .lock(|settings| (settings.afe, settings.telemetry_period));
+
+            c.shared.network.lock(|net| {
+                net.telemetry.publish(&telemetry.finalize(
+                    gains[0],
+                    gains[1],
+                    c.local.cpu_temp_sensor.get_temperature().unwrap(),
+                ))
+            });
 
-        // Schedule the telemetry task in the future.
-        telemetry::Monotonic::spawn_after((telemetry_period as u64).secs())
-            .unwrap();
+            // Schedule the telemetry task in the future.
+            Systick::delay((telemetry_period as u32).secs()).await;
+        }
     }
 
     #[task(priority = 1, shared=[usb], local=[usb_terminal])]
-    fn usb(mut c: usb::Context) {
-        // Handle the USB serial terminal.
-        c.shared.usb.lock(|usb| {
-            usb.poll(&mut [c.local.usb_terminal.interface_mut().inner_mut()]);
-        });
+    async fn usb(mut c: usb::Context) {
+        loop {
+            // Handle the USB serial terminal.
+            c.shared.usb.lock(|usb| {
+                usb.poll(&mut [c
+                    .local
+                    .usb_terminal
+                    .interface_mut()
+                    .inner_mut()]);
+            });
 
-        c.local.usb_terminal.process().unwrap();
+            c.local.usb_terminal.process().unwrap();
 
-        // Schedule to run this task every 10 milliseconds.
-        usb::spawn_after(10u64.millis()).unwrap();
+            // Schedule to run this task every 10 milliseconds.
+            Systick::delay(10.millis()).await;
+        }
     }
 
     #[task(priority = 1, shared=[network])]
-    fn ethernet_link(mut c: ethernet_link::Context) {
-        c.shared.network.lock(|net| net.processor.handle_link());
-        ethernet_link::Monotonic::spawn_after(1.secs()).unwrap();
+    async fn ethernet_link(mut c: ethernet_link::Context) {
+        loop {
+            c.shared.network.lock(|net| net.processor.handle_link());
+            Systick::delay(1.secs()).await;
+        }
     }
 
     #[task(binds = ETH, priority = 1)]
diff --git a/src/hardware/mod.rs b/src/hardware/mod.rs
index 477192466..21746676c 100644
--- a/src/hardware/mod.rs
+++ b/src/hardware/mod.rs
@@ -77,7 +77,7 @@ pub type EthernetPhy = hal::ethernet::phy::LAN8742A<hal::ethernet::EthernetMAC>;
 
 /// System timer (RTIC Monotonic) tick frequency
 pub const MONOTONIC_FREQUENCY: u32 = 1_000;
-pub type Systick = systick_monotonic::Systick<MONOTONIC_FREQUENCY>;
+pub type Systick = rtic_monotonics::systick::Systick;
 pub type SystemTimer = mono_clock::MonoClock<u32, MONOTONIC_FREQUENCY>;
 
 pub type I2c1 = hal::i2c::I2c<hal::stm32::I2C1>;
diff --git a/src/hardware/setup.rs b/src/hardware/setup.rs
index 2733edaaa..657ba43bc 100644
--- a/src/hardware/setup.rs
+++ b/src/hardware/setup.rs
@@ -108,7 +108,6 @@ pub struct EemGpioDevices {
 
 /// The available hardware interfaces on Stabilizer.
 pub struct StabilizerDevices {
-    pub systick: Systick,
     pub temperature_sensor: CpuTempSensor,
     pub afes: (AFE0, AFE1),
     pub adcs: (adc::Adc0Input, adc::Adc1Input),
@@ -293,7 +292,8 @@ pub fn setup(
     // Before being able to call any code in ITCM, load that code from flash.
     load_itcm();
 
-    let systick = Systick::new(core.SYST, ccdr.clocks.sysclk().to_Hz());
+    let mono_token = rtic_monotonics::create_systick_token!();
+    Systick::start(core.SYST, ccdr.clocks.sysclk().to_Hz(), mono_token);
 
     // After ITCM loading.
     core.SCB.enable_icache();
@@ -1129,7 +1129,6 @@ pub fn setup(
     };
 
     let stabilizer = StabilizerDevices {
-        systick,
         afes,
         adcs,
         dacs,

From 98726861288f2f09e26494af1f633565bfe89a16 Mon Sep 17 00:00:00 2001
From: Ryan Summers <ryan.summers@vertigo-designs.com>
Date: Thu, 7 Mar 2024 09:25:51 +0100
Subject: [PATCH 2/2] Updating to RTIC 2.1 to avoid nightly toolchain

---
 Cargo.lock          | 174 +++++++++++++++++++++++++++++++-------------
 Cargo.toml          |   2 +-
 src/bin/dual-iir.rs |   1 -
 src/bin/lockin.rs   |   1 -
 4 files changed, 123 insertions(+), 55 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index def9d3934..cff252bfb 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -9,7 +9,7 @@ dependencies = [
  "bit_field",
  "bitflags 2.4.2",
  "bytemuck",
- "embedded-hal",
+ "embedded-hal 0.2.7",
 ]
 
 [[package]]
@@ -173,7 +173,7 @@ dependencies = [
  "bare-metal 0.2.5",
  "bitfield",
  "critical-section",
- "embedded-hal",
+ "embedded-hal 0.2.7",
  "volatile-register",
 ]
 
@@ -197,34 +197,6 @@ dependencies = [
  "syn 1.0.109",
 ]
 
-[[package]]
-name = "cortex-m-rtic"
-version = "1.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d696ae7390bdb9f7978f71ca7144256a2c4616240a6df9002da3c451f9fc8f02"
-dependencies = [
- "bare-metal 1.0.0",
- "cortex-m 0.7.7",
- "cortex-m-rtic-macros",
- "heapless 0.7.17",
- "rtic-core",
- "rtic-monotonic",
- "version_check",
-]
-
-[[package]]
-name = "cortex-m-rtic-macros"
-version = "1.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eefb40b1ca901c759d29526e5c8a0a1b246c20caaa5b4cc5d0f0b94debecd4c7"
-dependencies = [
- "proc-macro-error",
- "proc-macro2",
- "quote",
- "rtic-syntax",
- "syn 1.0.109",
-]
-
 [[package]]
 name = "critical-section"
 version = "1.1.2"
@@ -250,6 +222,12 @@ dependencies = [
  "void",
 ]
 
+[[package]]
+name = "embedded-hal"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89"
+
 [[package]]
 name = "embedded-io"
 version = "0.6.1"
@@ -302,6 +280,12 @@ dependencies = [
  "syn 2.0.48",
 ]
 
+[[package]]
+name = "equivalent"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+
 [[package]]
 name = "form_urlencoded"
 version = "1.2.1"
@@ -320,6 +304,30 @@ dependencies = [
  "gcd",
 ]
 
+[[package]]
+name = "futures-core"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
+
+[[package]]
+name = "futures-task"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
+
+[[package]]
+name = "futures-util"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "pin-project-lite",
+ "pin-utils",
+]
+
 [[package]]
 name = "gcd"
 version = "2.3.0"
@@ -387,9 +395,9 @@ dependencies = [
 
 [[package]]
 name = "hashbrown"
-version = "0.12.3"
+version = "0.14.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
 
 [[package]]
 name = "heapless"
@@ -438,11 +446,11 @@ dependencies = [
 
 [[package]]
 name = "indexmap"
-version = "1.9.3"
+version = "2.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4"
 dependencies = [
- "autocfg",
+ "equivalent",
  "hashbrown",
 ]
 
@@ -503,7 +511,7 @@ version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f05acdc7a7d6da7b9be48c2d1de2f9757d37d3a83564aa82b4ae6d7ad15d0db6"
 dependencies = [
- "embedded-hal",
+ "embedded-hal 0.2.7",
 ]
 
 [[package]]
@@ -535,7 +543,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0c5a338372c83c3eff68c07a23fe00dff2b2c9195583a2d464292919bc27de04"
 dependencies = [
  "bit_field",
- "embedded-hal",
+ "embedded-hal 0.2.7",
  "num_enum 0.5.11",
  "paste",
 ]
@@ -767,6 +775,18 @@ version = "2.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
 
+[[package]]
+name = "pin-project-lite"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
 [[package]]
 name = "pkg-config"
 version = "0.3.28"
@@ -847,12 +867,48 @@ dependencies = [
  "rand_core",
 ]
 
+[[package]]
+name = "rtic"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f9472edf226fafcaec0af8afeac6d22b28bf4fdbe7c34762b82af540c081f9a"
+dependencies = [
+ "atomic-polyfill 1.0.3",
+ "bare-metal 1.0.0",
+ "cortex-m 0.7.7",
+ "critical-section",
+ "rtic-core",
+ "rtic-macros",
+]
+
+[[package]]
+name = "rtic-common"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0786b50b81ef9d2a944a000f60405bb28bf30cd45da2d182f3fe636b2321f35c"
+dependencies = [
+ "critical-section",
+]
+
 [[package]]
 name = "rtic-core"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d9369355b04d06a3780ec0f51ea2d225624db777acbc60abd8ca4832da5c1a42"
 
+[[package]]
+name = "rtic-macros"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54053598ea24b1b74937724e366558412a1777eb2680b91ef646db540982789a"
+dependencies = [
+ "indexmap",
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.48",
+]
+
 [[package]]
 name = "rtic-monotonic"
 version = "1.0.0"
@@ -860,15 +916,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fb8b0b822d1a366470b9cea83a1d4e788392db763539dc4ba022bcc787fece82"
 
 [[package]]
-name = "rtic-syntax"
-version = "1.0.3"
+name = "rtic-monotonics"
+version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f5e215601dc467752c2bddc6284a622c6f3d2bab569d992adcd5ab7e4cb9478"
+checksum = "058c2397dbd5bb4c5650a0e368c3920953e458805ff5097a0511b8147b3619d7"
 dependencies = [
- "indexmap",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
+ "atomic-polyfill 1.0.3",
+ "cfg-if",
+ "cortex-m 0.7.7",
+ "embedded-hal 1.0.0",
+ "fugit",
+ "rtic-time",
+]
+
+[[package]]
+name = "rtic-time"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75b232e7aebc045cfea81cdd164bc2727a10aca9a4568d406d0a5661cdfd0f19"
+dependencies = [
+ "critical-section",
+ "futures-util",
+ "rtic-common",
 ]
 
 [[package]]
@@ -1000,7 +1069,7 @@ checksum = "05f8438a40b91c8b9531c664e9680c55b92bd78cd6809a8b45b4512b1e5765f2"
 dependencies = [
  "atomic-polyfill 0.1.11",
  "cortex-m 0.6.7",
- "embedded-hal",
+ "embedded-hal 0.2.7",
  "nb 0.1.3",
 ]
 
@@ -1012,7 +1081,7 @@ checksum = "c6b8d3f0e34309c22ca4a9a27d24fa493e31573485f3493802b75b9d706756a6"
 dependencies = [
  "atomic-polyfill 1.0.3",
  "cortex-m 0.7.7",
- "embedded-hal",
+ "embedded-hal 0.2.7",
  "nb 1.1.0",
 ]
 
@@ -1082,8 +1151,7 @@ dependencies = [
  "built",
  "cortex-m 0.7.7",
  "cortex-m-rt",
- "cortex-m-rtic",
- "embedded-hal",
+ "embedded-hal 0.2.7",
  "embedded-io",
  "embedded-storage",
  "enum-iterator",
@@ -1103,6 +1171,8 @@ dependencies = [
  "postcard",
  "rand_core",
  "rand_xorshift",
+ "rtic",
+ "rtic-monotonics",
  "rtt-logger",
  "rtt-target",
  "sequential-storage",
@@ -1146,7 +1216,7 @@ dependencies = [
  "cast",
  "cortex-m 0.7.7",
  "embedded-dma",
- "embedded-hal",
+ "embedded-hal 0.2.7",
  "embedded-storage",
  "fugit",
  "nb 1.1.0",
@@ -1186,7 +1256,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e948d523b316939545d8b21a48c27aef150ce25321b9f95ff7978647a806a6fe"
 dependencies = [
  "cortex-m 0.7.7",
- "embedded-hal",
+ "embedded-hal 0.2.7",
  "usb-device",
  "vcell",
 ]
@@ -1209,7 +1279,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "05458b00a3a73c5b64c0de8f2a5182f6d51eb1aeb54c638e585092d26fc9a971"
 dependencies = [
  "bit_field",
- "embedded-hal",
+ "embedded-hal 0.2.7",
  "num_enum 0.5.11",
 ]
 
@@ -1287,7 +1357,7 @@ name = "usbd-serial"
 version = "0.2.0"
 source = "git+https://github.com/rust-embedded-community/usbd-serial?rev=096742c1c480f6f63c1a936a3c23ede7993c624d#096742c1c480f6f63c1a936a3c23ede7993c624d"
 dependencies = [
- "embedded-hal",
+ "embedded-hal 0.2.7",
  "embedded-io",
  "nb 1.1.0",
  "usb-device",
diff --git a/Cargo.toml b/Cargo.toml
index ce0d7b2f8..1ee59a0cf 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -46,7 +46,7 @@ rtt-target = "0.3"
 serde = { version = "1.0", features = ["derive"], default-features = false }
 serde-json-core = "0.5"
 heapless = { version = "0.7.16", features = ["serde"] }
-rtic = { version = "2.0", features = ["thumbv7-backend"] }
+rtic = { version = "2.1", features = ["thumbv7-backend"] }
 rtic-monotonics = { version = "1.0", features = ["cortex-m-systick"] }
 embedded-hal = "0.2.7"
 num_enum = { version = "0.7.2", default-features = false }
diff --git a/src/bin/dual-iir.rs b/src/bin/dual-iir.rs
index 1e86c2e0c..051479cd9 100644
--- a/src/bin/dual-iir.rs
+++ b/src/bin/dual-iir.rs
@@ -25,7 +25,6 @@
 //! ## Livestreaming
 //! This application streams raw ADC and DAC data over UDP. Refer to
 //! [stabilizer::net::data_stream](../stabilizer/net/data_stream/index.html) for more information.
-#![feature(type_alias_impl_trait)]
 #![no_std]
 #![no_main]
 
diff --git a/src/bin/lockin.rs b/src/bin/lockin.rs
index 5b85c13c2..88524f69a 100644
--- a/src/bin/lockin.rs
+++ b/src/bin/lockin.rs
@@ -24,7 +24,6 @@
 //! ## Livestreaming
 //! This application streams raw ADC and DAC data over UDP. Refer to
 //! [stabilizer::net::data_stream](../stabilizer/net/data_stream/index.html) for more information.
-#![feature(type_alias_impl_trait)]
 #![no_std]
 #![no_main]