From 6454b55b4a4f450aa3dd9a9b323f5766608b0a4d Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser Date: Tue, 22 Oct 2024 15:22:51 +0200 Subject: [PATCH] fix(threads): xtensa: fix enabling scheduler interrupt --- src/riot-rs-embassy/Cargo.toml | 2 +- src/riot-rs-esp/Cargo.toml | 3 +++ src/riot-rs-esp/src/lib.rs | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/riot-rs-embassy/Cargo.toml b/src/riot-rs-embassy/Cargo.toml index b515bf02d..fb7549971 100644 --- a/src/riot-rs-embassy/Cargo.toml +++ b/src/riot-rs-embassy/Cargo.toml @@ -94,7 +94,7 @@ wifi = [] wifi-cyw43 = ["riot-rs-rp/wifi-cyw43", "net", "wifi"] wifi-esp = ["riot-rs-esp/wifi-esp", "net", "wifi"] -threading = ["dep:riot-rs-threads"] +threading = ["dep:riot-rs-threads", "riot-rs-esp/threading"] override-network-config = [] override-usb-config = [] diff --git a/src/riot-rs-esp/Cargo.toml b/src/riot-rs-esp/Cargo.toml index 9bc87fd51..3e6c31e78 100644 --- a/src/riot-rs-esp/Cargo.toml +++ b/src/riot-rs-esp/Cargo.toml @@ -77,6 +77,9 @@ i2c = [ ## Enables defmt support. defmt = ["dep:defmt", "esp-wifi?/defmt", "fugit?/defmt"] +## Enables threading support. +threading = [] + ## Enables Wi-Fi support. wifi = [] diff --git a/src/riot-rs-esp/src/lib.rs b/src/riot-rs-esp/src/lib.rs index 4feeae9b2..b0e444c30 100644 --- a/src/riot-rs-esp/src/lib.rs +++ b/src/riot-rs-esp/src/lib.rs @@ -65,6 +65,20 @@ pub use esp_hal_embassy::Executor; pub fn init() -> OptionalPeripherals { let mut peripherals = OptionalPeripherals::from(esp_hal::init(esp_hal::Config::default())); + #[cfg(feature = "threading")] + { + use esp_hal::{interrupt, peripherals::Interrupt}; + // Since https://github.com/esp-rs/esp-hal/pull/2091, + // `esp_hal::init()` resets all interrupts. + // That also disables our scheduler interrupt, which was previously enabled + // in `riot_rs_threads::arch::xtensa`. + // So, re-enable it here. + + // Panics if `FROM_CPU_INTR1` is among `esp_hal::interrupt::RESERVED_INTERRUPTS`, + // which isn't the case. + interrupt::enable(Interrupt::FROM_CPU_INTR1, interrupt::Priority::min()).unwrap(); + } + #[cfg(feature = "wifi-esp")] { use esp_hal::timer::timg::TimerGroup;