aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/export.rs21
-rw-r--r--src/tq.rs15
2 files changed, 33 insertions, 3 deletions
diff --git a/src/export.rs b/src/export.rs
index 27f7f5fb..72d954ab 100644
--- a/src/export.rs
+++ b/src/export.rs
@@ -72,6 +72,11 @@ pub struct Priority {
}
impl Priority {
+ /// Create a new Priority
+ ///
+ /// # Safety
+ ///
+ /// Will overwrite the current Priority
#[inline(always)]
pub unsafe fn new(value: u8) -> Self {
Priority {
@@ -79,12 +84,14 @@ impl Priority {
}
}
+ /// Change the current priority to `value`
// These two methods are used by `lock` (see below) but can't be used from the RTIC application
#[inline(always)]
fn set(&self, value: u8) {
self.inner.set(value)
}
+ /// Get the current priority
#[inline(always)]
fn get(&self) -> u8 {
self.inner.get()
@@ -105,6 +112,13 @@ where
{
}
+/// Lock the resource proxy by setting the BASEPRI
+/// and running the closure with interrupt::free
+///
+/// # Safety
+///
+/// Writing to the BASEPRI
+/// Dereferencing a raw pointer
#[cfg(armv7m)]
#[inline(always)]
pub unsafe fn lock<T, R>(
@@ -135,6 +149,13 @@ pub unsafe fn lock<T, R>(
}
}
+/// Lock the resource proxy by setting the PRIMASK
+/// and running the closure with interrupt::free
+///
+/// # Safety
+///
+/// Writing to the PRIMASK
+/// Dereferencing a raw pointer
#[cfg(not(armv7m))]
#[inline(always)]
pub unsafe fn lock<T, R>(
diff --git a/src/tq.rs b/src/tq.rs
index 9300dbfc..b2a84c85 100644
--- a/src/tq.rs
+++ b/src/tq.rs
@@ -24,18 +24,26 @@ where
N: ArrayLength<NotReady<M, T>>,
T: Copy,
{
+ /// # Safety
+ ///
+ /// Writing to memory with a transmute in order to enable
+ /// interrupts of the SysTick timer
+ ///
+ /// Enqueue a task without checking if it is full
#[inline]
pub unsafe fn enqueue_unchecked(&mut self, nr: NotReady<M, T>) {
let mut is_empty = true;
- if self
+ // Check if the top contains a non-empty element and if that element is
+ // greater than nr
+ let if_heap_max_greater_than_nr = self
.0
.peek()
.map(|head| {
is_empty = false;
nr.instant < head.instant
})
- .unwrap_or(true)
- {
+ .unwrap_or(true);
+ if if_heap_max_greater_than_nr {
if is_empty {
mem::transmute::<_, SYST>(()).enable_interrupt();
}
@@ -47,6 +55,7 @@ where
self.0.push_unchecked(nr);
}
+ /// Dequeue a task from the TimerQueue
#[inline]
pub fn dequeue(&mut self) -> Option<(T, u8)> {
unsafe {