aboutsummaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs129
1 files changed, 120 insertions, 9 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 7d12d9af..da556a5c 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,14 +1,125 @@
-pub fn add(left: usize, right: usize) -> usize {
- left + right
+//! Real-Time Interrupt-driven Concurrency (RTIC) framework for ARM Cortex-M microcontrollers.
+//!
+//! **IMPORTANT**: This crate is published as [`cortex-m-rtic`] on crates.io but the name of the
+//! library is `rtic`.
+//!
+//! [`cortex-m-rtic`]: https://crates.io/crates/cortex-m-rtic
+//!
+//! The user level documentation can be found [here].
+//!
+//! [here]: https://rtic.rs
+//!
+//! Don't forget to check the documentation of the `#[app]` attribute (listed under the reexports
+//! section), which is the main component of the framework.
+//!
+//! # Minimum Supported Rust Version (MSRV)
+//!
+//! This crate is compiled and tested with the latest toolchain (rolling) as of the release date.
+//! If you run into compilation errors, try the latest stable release of the rust toolchain.
+//!
+//! # Semantic Versioning
+//!
+//! Like the Rust project, this crate adheres to [SemVer]: breaking changes in the API and semantics
+//! require a *semver bump* (since 1.0.0 a new major version release), with the exception of breaking changes
+//! that fix soundness issues -- those are considered bug fixes and can be landed in a new patch
+//! release.
+//!
+//! [SemVer]: https://semver.org/spec/v2.0.0.html
+
+#![deny(missing_docs)]
+#![deny(rust_2021_compatibility)]
+#![deny(rust_2018_compatibility)]
+#![deny(rust_2018_idioms)]
+#![no_std]
+#![doc(
+ html_logo_url = "https://raw.githubusercontent.com/rtic-rs/cortex-m-rtic/master/book/en/src/RTIC.svg",
+ html_favicon_url = "https://raw.githubusercontent.com/rtic-rs/cortex-m-rtic/master/book/en/src/RTIC.svg"
+)]
+//deny_warnings_placeholder_for_ci
+#![allow(clippy::inline_always)]
+
+use cortex_m::{interrupt::InterruptNumber, peripheral::NVIC};
+pub use rtic_core::{prelude as mutex_prelude, Exclusive, Mutex};
+pub use rtic_macros::app;
+pub use rtic_monotonic::{self, Monotonic};
+
+/// module `mutex::prelude` provides `Mutex` and multi-lock variants. Recommended over `mutex_prelude`
+pub mod mutex {
+ pub use rtic_core::prelude;
+ pub use rtic_core::Mutex;
+}
+
+#[doc(hidden)]
+pub mod export;
+#[doc(hidden)]
+pub mod sll;
+#[doc(hidden)]
+mod tq;
+
+/// Sets the given `interrupt` as pending
+///
+/// This is a convenience function around
+/// [`NVIC::pend`](../cortex_m/peripheral/struct.NVIC.html#method.pend)
+pub fn pend<I>(interrupt: I)
+where
+ I: InterruptNumber,
+{
+ NVIC::pend(interrupt);
}
-#[cfg(test)]
-mod tests {
- use super::*;
+use core::cell::UnsafeCell;
- #[test]
- fn it_works() {
- let result = add(2, 2);
- assert_eq!(result, 4);
+/// Internal replacement for `static mut T`
+///
+/// Used to represent RTIC Resources
+///
+/// Soundness:
+/// 1) Unsafe API for internal use only
+/// 2) ``get_mut(&self) -> *mut T``
+/// returns a raw mutable pointer to the inner T
+/// casting to &mut T is under control of RTIC
+/// RTIC ensures &mut T to be unique under Rust aliasing rules.
+///
+/// Implementation uses the underlying ``UnsafeCell<T>``
+/// self.0.get() -> *mut T
+///
+/// 3) get(&self) -> *const T
+/// returns a raw immutable (const) pointer to the inner T
+/// casting to &T is under control of RTIC
+/// RTIC ensures &T to be shared under Rust aliasing rules.
+///
+/// Implementation uses the underlying ``UnsafeCell<T>``
+/// self.0.get() -> *mut T, demoted to *const T
+///
+#[repr(transparent)]
+pub struct RacyCell<T>(UnsafeCell<T>);
+
+impl<T> RacyCell<T> {
+ /// Create a ``RacyCell``
+ #[inline(always)]
+ pub const fn new(value: T) -> Self {
+ RacyCell(UnsafeCell::new(value))
+ }
+
+ /// Get `*mut T`
+ ///
+ /// # Safety
+ ///
+ /// See documentation notes for [`RacyCell`]
+ #[inline(always)]
+ pub unsafe fn get_mut(&self) -> *mut T {
+ self.0.get()
+ }
+
+ /// Get `*const T`
+ ///
+ /// # Safety
+ ///
+ /// See documentation notes for [`RacyCell`]
+ #[inline(always)]
+ pub unsafe fn get(&self) -> *const T {
+ self.0.get()
}
}
+
+unsafe impl<T> Sync for RacyCell<T> {}