-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit b7460f3
Showing
4 changed files
with
137 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
Cargo.lock | ||
target/ | ||
core | ||
.gdb_history |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
[package] | ||
name = "riscv-rtfm" | ||
version = "0.1.0" | ||
authors = ["David Craven <[email protected]>"] | ||
|
||
[dependencies] | ||
rtfm-core = "0.2.0" | ||
static-ref = "0.2.1" | ||
|
||
[dependencies.riscv] | ||
path = "../riscv" | ||
|
||
[dependencies.riscv-rtfm-macros] | ||
path = "./macros" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
# `riscv-rtfm` | ||
|
||
> Adaption of japaric's cortex-m-rtfm crate for RISCV. | ||
# License | ||
Copyright 2017 David Craven | ||
|
||
Permission to use, copy, modify, and/or distribute this software for any purpose | ||
with or without fee is hereby granted, provided that the above copyright notice | ||
and this permission notice appear in all copies. | ||
|
||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND | ||
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS | ||
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER | ||
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF | ||
THIS SOFTWARE. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
//! Real Time For the Masses (RTFM) framework for RISCV microcontrollers | ||
//! | ||
//! This crate is based on [the RTFM framework] created by the Embedded Systems | ||
//! group at [Luleå University of Technology][ltu], led by Prof. Per Lindgren, | ||
//! and uses a simplified version of the Stack Resource Policy as scheduling | ||
//! policy (check the [references] for details). | ||
//! | ||
//! [the RTFM framework]: http://www.rtfm-lang.org/ | ||
//! [ltu]: https://www.ltu.se/?l=en | ||
//! [per]: https://www.ltu.se/staff/p/pln-1.11258?l=en | ||
//! [references]: ./index.html#references | ||
//! | ||
//! # Features | ||
//! | ||
//! - **Event triggered tasks** as the unit of concurrency. | ||
//! - Support for prioritization of tasks and, thus, **preemptive | ||
//! multitasking**. | ||
//! - **Efficient and data race free memory sharing** through fine grained *non | ||
//! global* critical sections. | ||
//! - **Deadlock free execution** guaranteed at compile time. | ||
//! - **Minimal scheduling overhead** as the scheduler has no "software | ||
//! component": the hardware does all the scheduling. | ||
//! - **Highly efficient memory usage**: All the tasks share a single call stack | ||
//! and there's no hard dependency on a dynamic memory allocator. | ||
//! - **All Cortex M devices are fully supported**. | ||
//! - This task model is amenable to known WCET (Worst Case Execution Time) | ||
//! analysis and scheduling analysis techniques. (Though we haven't yet | ||
//! developed Rust friendly tooling for that.) | ||
//! | ||
//! # Constraints | ||
//! | ||
//! - Tasks must run to completion. That's it, tasks can't contain endless | ||
//! loops. However, you can run an endless event loop in the `idle` *loop*. | ||
//! | ||
//! - Task priorities must remain constant at runtime. | ||
//! | ||
//! # Dependencies | ||
//! | ||
//! The application crate must depend on a device crate generated using | ||
//! [`svd2rust`] v0.11.x and the "rt" feature of that crate must be enabled. The | ||
//! SVD file used to generate the device crate *must* contain [`<cpu>`] | ||
//! information. | ||
//! | ||
//! [`svd2rust`]: https://docs.rs/svd2rust/0..0/svd2rust/ | ||
//! [`<cpu>`]: https://www.keil.com/pack/doc/CMSIS/SVD/html/elem_cpu.html | ||
//! | ||
//! # `app!` | ||
//! | ||
//! The `app!` macro is documented [here]. | ||
//! | ||
//! [here]: https://docs.rs/cortex-m-rtfm-macros/0.2.0/cortex_m_rtfm_macros/fn.app.html | ||
//! | ||
//! # Examples | ||
//! | ||
//! In increasing grade of complexity. See the [examples](./examples/index.html) | ||
//! module. | ||
//! | ||
//! # References | ||
//! | ||
//! - Baker, T. P. (1991). Stack-based scheduling of realtime processes. | ||
//! *Real-Time Systems*, 3(1), 67-99. | ||
//! | ||
//! > The original Stack Resource Policy paper. [PDF][srp]. | ||
//! | ||
//! [srp]: http://www.cs.fsu.edu/~baker/papers/mstacks3.pdf | ||
//! | ||
//! - Eriksson, J., Häggström, F., Aittamaa, S., Kruglyak, A., & Lindgren, P. | ||
//! (2013, June). Real-time for the masses, step 1: Programming API and static | ||
//! priority SRP kernel primitives. In Industrial Embedded Systems (SIES), | ||
//! 2013 8th IEEE International Symposium on (pp. 110-113). IEEE. | ||
//! | ||
//! > A description of the RTFM task and resource model. [PDF][rtfm] | ||
//! | ||
//! [rtfm]: http://www.diva-portal.org/smash/get/diva2:1005680/FULLTEXT01.pdf | ||
#![deny(missing_docs)] | ||
#![deny(warnings)] | ||
#![feature(proc_macro)] | ||
#![no_std] | ||
|
||
extern crate riscv; | ||
extern crate rtfm_core; | ||
extern crate static_ref; | ||
extern crate riscv_rtfm_macros; | ||
|
||
pub use rtfm_core::{Resource, Threshold}; | ||
pub use riscv::asm::wfi; | ||
pub use riscv_rtfm_macros::app; | ||
use riscv::interrupt; | ||
|
||
/// Executes the closure `f` in a preemption free context | ||
/// | ||
/// During the execution of the closure no task can preempt the current task. | ||
pub fn atomic<R, F>(_: &mut Threshold, f: F) -> R | ||
where | ||
F: FnOnce(&mut Threshold) -> R, | ||
{ | ||
unsafe { interrupt::disable() }; | ||
let r = f(&mut unsafe { Threshold::max() }); | ||
unsafe { interrupt::enable() }; | ||
r | ||
} |