aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar bors[bot] <26634292+bors[bot]@users.noreply.github.com> 2022-05-31 18:10:42 +0000
committerGravatar GitHub <noreply@github.com> 2022-05-31 18:10:42 +0000
commite0bfe3ae21903e9dbd80e903e726f7341662e12b (patch)
tree60fee9596f4e85344aac3f889741f8891d0b4e4d
parentb581ec74b295811387b4a2a4f4cfeeb91ec788d8 (diff)
parentbba4f0f83287b2c642f074cbcc96312ca7688135 (diff)
downloadcortex-m-e0bfe3ae21903e9dbd80e903e726f7341662e12b.tar.gz
cortex-m-e0bfe3ae21903e9dbd80e903e726f7341662e12b.tar.zst
cortex-m-e0bfe3ae21903e9dbd80e903e726f7341662e12b.zip
Merge #441v0.7.5
441: Prepare for v0.7.5 r=newAM a=adamgreig Currently with cortex-m 0.7.4 it's not possible for stable Rust users to enable the inline-asm feature, even though their compiler might support it, because of the `![cfg_attr(feature = "inline-asm", feature(asm))]` line. I propose a new 0.7.5 release that removes this line, which means users on stable Rust >=1.59 could enable the previously nightly-only feature to get stable inline asm. I wouldn't enable the feature by default, because that would be a significant MSRV bump, but at least this way more users could enable it before we release 0.8 with the revamped and inline-only asm. I've also backported the bugfix from #380 which I don't believe is a breaking change. I haven't had a chance to test this yet so it would be great if someone could try it out and just make sure the inline-asm feature does work before merging. Any thoughts on anything else worth backporting from 0.8? Co-authored-by: Adam Greig <adam@adamgreig.com> Co-authored-by: bors[bot] <26634292+bors[bot]@users.noreply.github.com>
-rw-r--r--CHANGELOG.md14
-rw-r--r--Cargo.toml2
-rw-r--r--cortex-m-semihosting/src/lib.rs6
-rw-r--r--src/lib.rs4
-rw-r--r--src/macros.rs32
5 files changed, 40 insertions, 18 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ddc03a7..95ed203 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,10 +7,21 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
## [Unreleased]
+## [v0.7.5] - 2022-05-15
+
### Deprecated
- the `ptr()` function on all peripherals register blocks in favor of
the associated constant `PTR` (#386).
+### Changed
+
+- The `inline-asm` feature no longer requires a nightly Rust compiler, but
+ does require Rust 1.59 or above.
+
+### Fixed
+- Fixed `singleton!()` statics sometimes ending up in `.data` instead of `.bss` (#364, #380).
+ (Backported from upcoming 0.8 release).
+
## [v0.7.4] - 2021-12-31
### Added
@@ -735,7 +746,8 @@ fn main() {
- Functions to get the vector table
- Wrappers over miscellaneous instructions like `bkpt`
-[Unreleased]: https://github.com/rust-embedded/cortex-m/compare/v0.7.4...HEAD
+[Unreleased]: https://github.com/rust-embedded/cortex-m/compare/v0.7.5...HEAD
+[v0.7.5]: https://github.com/rust-embedded/cortex-m/compare/v0.7.4...v0.7.5
[v0.7.4]: https://github.com/rust-embedded/cortex-m/compare/v0.7.3...v0.7.4
[v0.7.3]: https://github.com/rust-embedded/cortex-m/compare/v0.7.2...v0.7.3
[v0.7.2]: https://github.com/rust-embedded/cortex-m/compare/v0.7.1...v0.7.2
diff --git a/Cargo.toml b/Cargo.toml
index dcbd3bd..dc0678e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,7 +11,7 @@ license = "MIT OR Apache-2.0"
name = "cortex-m"
readme = "README.md"
repository = "https://github.com/rust-embedded/cortex-m"
-version = "0.7.4"
+version = "0.7.5"
edition = "2018"
links = "cortex-m" # prevent multiple versions of this crate to be linked together
diff --git a/cortex-m-semihosting/src/lib.rs b/cortex-m-semihosting/src/lib.rs
index a67b84d..721ac45 100644
--- a/cortex-m-semihosting/src/lib.rs
+++ b/cortex-m-semihosting/src/lib.rs
@@ -153,8 +153,7 @@
//!
//! ## `inline-asm`
//!
-//! When this feature is enabled semihosting is implemented using inline assembly (`llvm_asm!`) and
-//! compiling this crate requires nightly.
+//! When this feature is enabled semihosting is implemented using inline assembly (`asm!`).
//!
//! When this feature is disabled semihosting is implemented using FFI calls into an external
//! assembly file and compiling this crate works on stable and beta.
@@ -179,7 +178,6 @@
//!
//! [pdf]: http://infocenter.arm.com/help/topic/com.arm.doc.dui0471e/DUI0471E_developing_for_arm_processors.pdf
-#![cfg_attr(feature = "inline-asm", feature(llvm_asm))]
#![deny(missing_docs)]
#![no_std]
@@ -213,7 +211,7 @@ pub unsafe fn syscall1(_nr: usize, _arg: usize) -> usize {
#[cfg(all(thumb, feature = "inline-asm", not(feature = "no-semihosting")))]
() => {
let mut nr = _nr;
- llvm_asm!("bkpt 0xAB" : "+{r0}"(nr) : "{r1}"(_arg) :: "volatile");
+ core::arch::asm!("bkpt #0xab", inout("r0") nr, in("r1") _arg, options(nostack, preserves_flags));
nr
}
diff --git a/src/lib.rs b/src/lib.rs
index beff6e8..4790f98 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -22,7 +22,8 @@
//! - Some of the `register` API only becomes available only when `inline-asm` is enabled. Check the
//! API docs for details.
//!
-//! The disadvantage is that `inline-asm` requires a nightly toolchain.
+//! The disadvantage is that `inline-asm` requires a Rust version at least 1.59 to use the `asm!()`
+//! macro. In the future 0.8 and above versions of `cortex-m`, this feature will always be enabled.
//!
//! ## `cm7-r0p1`
//!
@@ -55,7 +56,6 @@
//! This crate is guaranteed to compile on stable Rust 1.38 and up. It *might*
//! compile with older versions but that may change in any new patch release.
-#![cfg_attr(feature = "inline-asm", feature(asm))]
#![deny(missing_docs)]
#![no_std]
#![allow(clippy::identity_op)]
diff --git a/src/macros.rs b/src/macros.rs
index 66b75b1..512c932 100644
--- a/src/macros.rs
+++ b/src/macros.rs
@@ -30,9 +30,12 @@ macro_rules! iprintln {
/// `None` variant the caller must ensure that the macro is called from a function that's executed
/// at most once in the whole lifetime of the program.
///
-/// # Note
+/// # Notes
/// This macro is unsound on multi core systems.
///
+/// For debuggability, you can set an explicit name for a singleton. This name only shows up the
+/// the debugger and is not referencable from other code. See example below.
+///
/// # Example
///
/// ``` no_run
@@ -50,15 +53,24 @@ macro_rules! iprintln {
/// fn alias() -> &'static mut bool {
/// singleton!(: bool = false).unwrap()
/// }
+///
+/// fn singleton_with_name() {
+/// // A name only for debugging purposes
+/// singleton!(FOO_BUFFER: [u8; 1024] = [0u8; 1024]);
+/// }
/// ```
#[macro_export]
macro_rules! singleton {
- (: $ty:ty = $expr:expr) => {
+ ($name:ident: $ty:ty = $expr:expr) => {
$crate::interrupt::free(|_| {
- static mut VAR: Option<$ty> = None;
+ // this is a tuple of a MaybeUninit and a bool because using an Option here is
+ // problematic: Due to niche-optimization, an Option could end up producing a non-zero
+ // initializer value which would move the entire static from `.bss` into `.data`...
+ static mut $name: (::core::mem::MaybeUninit<$ty>, bool) =
+ (::core::mem::MaybeUninit::uninit(), false);
#[allow(unsafe_code)]
- let used = unsafe { VAR.is_some() };
+ let used = unsafe { $name.1 };
if used {
None
} else {
@@ -66,16 +78,16 @@ macro_rules! singleton {
#[allow(unsafe_code)]
unsafe {
- VAR = Some(expr)
- }
-
- #[allow(unsafe_code)]
- unsafe {
- VAR.as_mut()
+ $name.1 = true;
+ $name.0 = ::core::mem::MaybeUninit::new(expr);
+ Some(&mut *$name.0.as_mut_ptr())
}
}
})
};
+ (: $ty:ty = $expr:expr) => {
+ $crate::singleton!(VAR: $ty = $expr)
+ };
}
/// ``` compile_fail