From 4d0c797a9080f9ed52e39c8573937db1892c31b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rom=C3=A1n=20C=C3=A1rdenas?= Date: Thu, 5 Oct 2023 09:33:17 +0200 Subject: [PATCH] Simplified API --- .github/workflows/ci.yml | 21 ++++++++++----------- riscv-slic-macros/src/api.rs | 3 --- riscv-slic-macros/src/swi.rs | 2 +- riscv-slic/src/lib.rs | 2 +- riscv-slic/src/slic.rs | 16 +++++++--------- 5 files changed, 19 insertions(+), 25 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9fb2794..8dc68d2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,15 +19,8 @@ jobs: - stable - nightly - 1.59.0 - target: - - x86_64-unknown-linux-gnu - - riscv32i-unknown-none-elf - - riscv32imc-unknown-none-elf - - riscv32imac-unknown-none-elf - - riscv64gc-unknown-linux-gnu - - riscv64gc-unknown-none-elf cargo_flags: - - "--features=clint-backend,unsafe-assume-single-core" + - "clint-backend" include: # Nightly is only for reference and allowed to fail - rust: nightly @@ -39,6 +32,12 @@ jobs: - uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.toolchain }} - targets: ${{ matrix.target }} - - name: Build library - run: cargo build --target ${{ matrix.target }} ${{ matrix.cargo_flags }} + targets: riscv32i-unknown-none-elf,riscv32imc-unknown-none-elf,riscv32imac-unknown-none-elf,riscv64gc-unknown-none-elf + - name: Build riscv32i-unknown-none-elf + run: cargo build --target riscv32i-unknown-none-elf --features=${{ matrix.cargo_flags }},unsafe-assume-single-core + - name: Build riscv32imc-unknown-none-elf + run: cargo build --target riscv32imc-unknown-none-elf--features=${{ matrix.cargo_flags }},unsafe-assume-single-core + - name: Build riscv32imac-unknown-none-elf + run: cargo build --target riscv32imac-unknown-none-elf--features=${{ matrix.cargo_flags }} + - name: Build riscv64gc-unknown-none-elf + run: cargo build --target riscv64gc-unknown-none-elf--features=${{ matrix.cargo_flags }} diff --git a/riscv-slic-macros/src/api.rs b/riscv-slic-macros/src/api.rs index c31d023..8755f1e 100644 --- a/riscv-slic-macros/src/api.rs +++ b/riscv-slic-macros/src/api.rs @@ -34,7 +34,6 @@ pub fn api_mod() -> TokenStream { #[inline] #[no_mangle] pub unsafe fn __slic_get_priority(interrupt: u16) -> u8 { - let interrupt: Interrupt = InterruptNumber::try_from(interrupt).unwrap(); __SLIC.get_priority(interrupt) } @@ -43,7 +42,6 @@ pub fn api_mod() -> TokenStream { #[inline] #[no_mangle] pub unsafe fn __slic_set_priority(interrupt: u16, priority: u8) { - let interrupt: Interrupt = InterruptNumber::try_from(interrupt).unwrap(); __SLIC.set_priority(interrupt, priority); } @@ -51,7 +49,6 @@ pub fn api_mod() -> TokenStream { #[inline] #[no_mangle] pub unsafe fn __slic_pend(interrupt: u16) { - let interrupt: Interrupt = InterruptNumber::try_from(interrupt).unwrap(); __SLIC.pend(interrupt); if __SLIC.is_ready() { export_swi_set(); diff --git a/riscv-slic-macros/src/swi.rs b/riscv-slic-macros/src/swi.rs index 4036dc9..8f4f001 100644 --- a/riscv-slic-macros/src/swi.rs +++ b/riscv-slic-macros/src/swi.rs @@ -42,7 +42,7 @@ pub fn swi_mod(input: &CodegenInput) -> TokenStream { self as _ } - fn try_from(value: u16) -> Result { + fn from_number(value: u16) -> Result { if value > Self::MAX_INTERRUPT_NUMBER { Err(value) } else { diff --git a/riscv-slic/src/lib.rs b/riscv-slic/src/lib.rs index 4ffc960..19578ba 100644 --- a/riscv-slic/src/lib.rs +++ b/riscv-slic/src/lib.rs @@ -34,5 +34,5 @@ pub unsafe trait InterruptNumber: Copy { /// Tries to convert a number to a valid interrupt source. /// If the conversion fails, it returns an error with the number back. - fn try_from(value: u16) -> Result; + fn from_number(value: u16) -> Result; } diff --git a/riscv-slic/src/slic.rs b/riscv-slic/src/slic.rs index 6327f70..40bcd8d 100644 --- a/riscv-slic/src/slic.rs +++ b/riscv-slic/src/slic.rs @@ -1,4 +1,3 @@ -use crate::InterruptNumber; use heapless::binary_heap::{BinaryHeap, Max}; use portable_atomic::{AtomicBool, AtomicU8, Ordering}; @@ -36,8 +35,8 @@ impl SLIC { /// Returns the current priority of an interrupt source. #[inline] - pub fn get_priority(&self, interrupt: I) -> u8 { - self.priorities[interrupt.number() as usize] + pub fn get_priority(&self, interrupt: u16) -> u8 { + self.priorities[interrupt as usize] } /// Sets the priority of an interrupt source. @@ -54,8 +53,8 @@ impl SLIC { /// /// Changing the priority level of an interrupt may break priority-based critical sections. #[inline] - pub unsafe fn set_priority(&mut self, interrupt: I, priority: u8) { - self.priorities[interrupt.number() as usize] = priority; + pub unsafe fn set_priority(&mut self, interrupt: u16, priority: u8) { + self.priorities[interrupt as usize] = priority; } //// Returns current priority threshold. @@ -76,8 +75,8 @@ impl SLIC { /// Checks if a given interrupt is pending. #[inline] - pub fn is_pending(&mut self, interrupt: I) -> bool { - self.pending[interrupt.number() as usize].load(Ordering::Acquire) + pub fn is_pending(&mut self, interrupt: u16) -> bool { + self.pending[interrupt as usize].load(Ordering::Acquire) } /// Returns `true` if the next queued interrupt can be triggered. @@ -95,8 +94,7 @@ impl SLIC { /// /// If interrupt priority is 0 or already pending, this request is silently ignored. #[inline] - pub fn pend(&mut self, interrupt: I) { - let interrupt = interrupt.number(); + pub fn pend(&mut self, interrupt: u16) { let i = interrupt as usize; if self.priorities[i] == 0 { return;