aboutsummaryrefslogtreecommitdiff
path: root/src/export.rs
diff options
context:
space:
mode:
authorJorge Aparicio <jorge@japaric.io>2018-11-03 17:02:41 +0100
committerJorge Aparicio <jorge@japaric.io>2018-11-03 17:16:55 +0100
commitc631049efcadca8b07940c794cce2be58fa48444 (patch)
treef6bd73e5c396fc06072557ee965cc59e9c8e3e9f /src/export.rs
parent653338e7997a0cdc5deaed98b1bb5f60006717ed (diff)
v0.4.0
closes #32 closes #33
Diffstat (limited to 'src/export.rs')
-rw-r--r--src/export.rs84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/export.rs b/src/export.rs
new file mode 100644
index 0000000..cb63e0c
--- /dev/null
+++ b/src/export.rs
@@ -0,0 +1,84 @@
+/// IMPLEMENTATION DETAILS. DO NOT USE ANYTHING IN THIS MODULE
+use core::{hint, ptr};
+
+#[cfg(armv7m)]
+use cortex_m::register::basepri;
+pub use cortex_m::{
+ asm::wfi, interrupt, peripheral::scb::SystemHandler, peripheral::syst::SystClkSource,
+ peripheral::Peripherals,
+};
+pub use cortex_m_rt::{entry, exception};
+pub use heapless::consts;
+use heapless::spsc::Queue;
+
+#[cfg(feature = "timer-queue")]
+pub use crate::tq::{isr as sys_tick, NotReady, TimerQueue};
+
+pub type FreeQueue<N> = Queue<u8, N>;
+pub type ReadyQueue<T, N> = Queue<(T, u8), N>;
+
+#[cfg(armv7m)]
+#[inline(always)]
+pub fn run<F>(f: F)
+where
+ F: FnOnce(),
+{
+ let initial = basepri::read();
+ f();
+ unsafe { basepri::write(initial) }
+}
+
+#[cfg(not(armv7m))]
+#[inline(always)]
+pub fn run<F>(f: F)
+where
+ F: FnOnce(),
+{
+ f();
+}
+
+// TODO(MaybeUninit) Until core::mem::MaybeUninit is stabilized we use our own (inefficient)
+// implementation
+pub struct MaybeUninit<T> {
+ value: Option<T>,
+}
+
+impl<T> MaybeUninit<T> {
+ pub const fn uninitialized() -> Self {
+ MaybeUninit { value: None }
+ }
+
+ pub unsafe fn get_ref(&self) -> &T {
+ if let Some(x) = self.value.as_ref() {
+ x
+ } else {
+ hint::unreachable_unchecked()
+ }
+ }
+
+ pub unsafe fn get_mut(&mut self) -> &mut T {
+ if let Some(x) = self.value.as_mut() {
+ x
+ } else {
+ hint::unreachable_unchecked()
+ }
+ }
+
+ pub fn set(&mut self, val: T) {
+ unsafe { ptr::write(&mut self.value, Some(val)) }
+ }
+}
+
+#[inline(always)]
+pub fn assert_send<T>()
+where
+ T: Send,
+{
+}
+
+#[inline(always)]
+pub fn assert_sync<T>()
+where
+ T: Sync,
+{
+}