From a4636d819f4b98a781cc88a05c2e89397c71e1ed Mon Sep 17 00:00:00 2001 From: Dario Nieuwenhuis Date: Sun, 13 Oct 2024 21:47:40 +0200 Subject: [PATCH] rp/multicore: enable fpu on second core only if building for -eabihf targets. --- embassy-rp/build.rs | 22 +++++++++++++++++++++- embassy-rp/src/multicore.rs | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/embassy-rp/build.rs b/embassy-rp/build.rs index 3216a3826..a8d387611 100644 --- a/embassy-rp/build.rs +++ b/embassy-rp/build.rs @@ -1,7 +1,8 @@ use std::env; +use std::ffi::OsStr; use std::fs::File; use std::io::Write; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; fn main() { if env::var("CARGO_FEATURE_RP2040").is_ok() { @@ -16,4 +17,23 @@ fn main() { println!("cargo:rerun-if-changed=build.rs"); println!("cargo:rerun-if-changed=link-rp.x.in"); } + + // code below taken from https://github.com/rust-embedded/cortex-m/blob/master/cortex-m-rt/build.rs + + let mut target = env::var("TARGET").unwrap(); + + // When using a custom target JSON, `$TARGET` contains the path to that JSON file. By + // convention, these files are named after the actual target triple, eg. + // `thumbv7m-customos-elf.json`, so we extract the file stem here to allow custom target specs. + let path = Path::new(&target); + if path.extension() == Some(OsStr::new("json")) { + target = path + .file_stem() + .map_or(target.clone(), |stem| stem.to_str().unwrap().to_string()); + } + + println!("cargo::rustc-check-cfg=cfg(has_fpu)"); + if target.ends_with("-eabihf") { + println!("cargo:rustc-cfg=has_fpu"); + } } diff --git a/embassy-rp/src/multicore.rs b/embassy-rp/src/multicore.rs index 7e2e776ea..81de84907 100644 --- a/embassy-rp/src/multicore.rs +++ b/embassy-rp/src/multicore.rs @@ -170,7 +170,7 @@ where }; // Enable FPU - #[cfg(feature = "_rp235x")] + #[cfg(all(feature = "_rp235x", has_fpu))] unsafe { let p = cortex_m::Peripherals::steal(); p.SCB.cpacr.modify(|cpacr| cpacr | (3 << 20) | (3 << 22));