From 837d2d8b158bdaa2615385e4cc6cd46956dea92a Mon Sep 17 00:00:00 2001 From: tianrking <10758833+tianrking@users.noreply.github.com> Date: Mon, 27 Jul 2026 01:22:49 +0800 Subject: [PATCH] executor: support rtos-trace without pointer CAS --- embassy-executor/Cargo.toml | 1 + embassy-executor/src/raw/trace.rs | 14 ++++++++++++-- rust-toolchain.toml | 1 + 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/embassy-executor/Cargo.toml b/embassy-executor/Cargo.toml index f5a9f26e72..0d0787c921 100644 --- a/embassy-executor/Cargo.toml +++ b/embassy-executor/Cargo.toml @@ -40,6 +40,7 @@ build = [ {target = "riscv32imac-unknown-none-elf", features = ["platform-riscv32"]}, {target = "riscv32imac-unknown-none-elf", features = ["platform-riscv32", "executor-thread"]}, {target = "riscv32imac-unknown-none-elf", features = ["platform-riscv32", "executor-thread", "trace"]}, + {target = "riscv32imc-unknown-none-elf", features = ["platform-riscv32", "executor-thread", "rtos-trace"]}, {target = "riscv64imac-unknown-none-elf", features = ["platform-riscv64"]}, {target = "riscv64imac-unknown-none-elf", features = ["platform-riscv64", "executor-thread"]}, {target = "riscv64imac-unknown-none-elf", features = ["platform-riscv64", "executor-thread", "trace"]}, diff --git a/embassy-executor/src/raw/trace.rs b/embassy-executor/src/raw/trace.rs index 8301620394..88840e8c4c 100644 --- a/embassy-executor/src/raw/trace.rs +++ b/embassy-executor/src/raw/trace.rs @@ -122,14 +122,15 @@ impl TaskTracker { /// Adds a task to the tracker /// /// This method inserts a task at the head of the intrusive linked list. - /// The operation is thread-safe and lock-free, using atomic operations - /// to ensure consistency even when called from different contexts. + /// The operation is lock-free on targets with pointer compare-and-swap. + /// On targets without it, insertions are serialized by a critical section. /// /// # Arguments /// * `task` - The task reference to add to the tracker pub fn add(&self, task: TaskRef) { let task_ptr = task.as_ptr(); + #[cfg(target_has_atomic = "ptr")] loop { let current_head = self.head.load(Ordering::Acquire); unsafe { @@ -144,6 +145,15 @@ impl TaskTracker { break; } } + + #[cfg(not(target_has_atomic = "ptr"))] + critical_section::with(|_| { + let current_head = self.head.load(Ordering::Acquire); + unsafe { + (*task_ptr).all_tasks_next.store(current_head, Ordering::Relaxed); + } + self.head.store(task_ptr.cast_mut(), Ordering::Release); + }); } /// Performs an operation on each task in the tracker diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 8bafea673c..f73e1e9a5b 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -8,6 +8,7 @@ targets = [ "thumbv7em-none-eabihf", "thumbv8m.main-none-eabihf", "riscv32imac-unknown-none-elf", + "riscv32imc-unknown-none-elf", "riscv64imac-unknown-none-elf", "riscv64gc-unknown-none-elf", "wasm32-unknown-unknown",