mirror of
https://github.com/rtic-rs/rtic.git
synced 2024-11-24 04:32:52 +01:00
rtfm! macro
This commit is contained in:
parent
2bf5401439
commit
032bb0f0e2
3 changed files with 575 additions and 1038 deletions
23
Cargo.toml
23
Cargo.toml
|
@ -10,24 +10,11 @@ keywords = ["arm", "cortex-m"]
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
name = "cortex-m-rtfm"
|
name = "cortex-m-rtfm"
|
||||||
repository = "https://github.com/japaric/cortex-m-rtfm"
|
repository = "https://github.com/japaric/cortex-m-rtfm"
|
||||||
version = "0.1.1"
|
version = "0.2.0"
|
||||||
|
|
||||||
[build-dependencies]
|
|
||||||
quote = "0.3.15"
|
|
||||||
syn = "0.11.10"
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cortex-m = "0.2.6"
|
static-ref = "0.2.0"
|
||||||
static-ref = "0.1.0"
|
|
||||||
typenum = "1.7.0"
|
|
||||||
|
|
||||||
[dev-dependencies]
|
[dependencies.cortex-m]
|
||||||
compiletest_rs = "0.2.5"
|
branch = "rfc"
|
||||||
|
git = "https://github.com/japaric/cortex-m"
|
||||||
[features]
|
|
||||||
# Number of priority bits
|
|
||||||
P2 = []
|
|
||||||
P3 = []
|
|
||||||
P4 = []
|
|
||||||
P5 = []
|
|
||||||
default = ["P4"]
|
|
126
build.rs
126
build.rs
|
@ -1,13 +1,4 @@
|
||||||
#[macro_use]
|
|
||||||
extern crate quote;
|
|
||||||
extern crate syn;
|
|
||||||
|
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::fs::File;
|
|
||||||
use std::io::Write;
|
|
||||||
use std::path::PathBuf;
|
|
||||||
|
|
||||||
use syn::{Ident, IntTy, Lit};
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let target = env::var("TARGET").unwrap();
|
let target = env::var("TARGET").unwrap();
|
||||||
|
@ -16,122 +7,5 @@ fn main() {
|
||||||
println!("cargo:rustc-cfg=thumbv6m");
|
println!("cargo:rustc-cfg=thumbv6m");
|
||||||
}
|
}
|
||||||
|
|
||||||
let bits = if env::var_os("CARGO_FEATURE_P2").is_some() {
|
|
||||||
2
|
|
||||||
} else if env::var_os("CARGO_FEATURE_P3").is_some() {
|
|
||||||
3
|
|
||||||
} else if env::var_os("CARGO_FEATURE_P4").is_some() {
|
|
||||||
4
|
|
||||||
} else if env::var_os("CARGO_FEATURE_P5").is_some() {
|
|
||||||
5
|
|
||||||
} else {
|
|
||||||
panic!(
|
|
||||||
"Specify the number of priority bits through one of these Cargo \
|
|
||||||
features: P2, P3, P4 or P5"
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
let n = Lit::Int(bits, IntTy::Unsuffixed);
|
|
||||||
let mut tokens = vec![];
|
|
||||||
tokens.push(
|
|
||||||
quote! {
|
|
||||||
const PRIORITY_BITS: u8 = #n;
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
// Ceilings and thresholds
|
|
||||||
for i in 0..(1 << bits) + 1 {
|
|
||||||
let c = Ident::new(format!("C{}", i));
|
|
||||||
let t = Ident::new(format!("T{}", i));
|
|
||||||
let u = Ident::new(format!("U{}", i));
|
|
||||||
|
|
||||||
let doc = format!("A ceiling of {}", i);
|
|
||||||
tokens.push(
|
|
||||||
quote! {
|
|
||||||
#[doc = #doc]
|
|
||||||
pub type #c = ::typenum::#u;
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
let doc = format!("A preemption threshold of {}", i);
|
|
||||||
tokens.push(
|
|
||||||
quote! {
|
|
||||||
#[doc = #doc]
|
|
||||||
pub type #t = Threshold<::typenum::#u>;
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Priorities
|
|
||||||
for i in 0..(1 << bits) + 1 {
|
|
||||||
let p = Ident::new(format!("P{}", i));
|
|
||||||
let u = Ident::new(format!("U{}", i));
|
|
||||||
|
|
||||||
let doc = format!(
|
|
||||||
"A priority of {}{}",
|
|
||||||
i,
|
|
||||||
if i == 0 {
|
|
||||||
", the lowest priority"
|
|
||||||
} else if i == (1 << bits) {
|
|
||||||
", the highest priority"
|
|
||||||
} else {
|
|
||||||
""
|
|
||||||
}
|
|
||||||
);
|
|
||||||
tokens.push(
|
|
||||||
quote! {
|
|
||||||
#[doc = #doc]
|
|
||||||
pub type #p = Priority<::typenum::#u>;
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// GreaterThanOrEqual & LessThanOrEqual
|
|
||||||
for i in 0..(1 << bits) + 1 {
|
|
||||||
for j in 0..(i + 1) {
|
|
||||||
let i = Ident::new(format!("U{}", i));
|
|
||||||
let j = Ident::new(format!("U{}", j));
|
|
||||||
|
|
||||||
tokens.push(
|
|
||||||
quote! {
|
|
||||||
unsafe impl GreaterThanOrEqual<::typenum::#j> for
|
|
||||||
::typenum::#i {}
|
|
||||||
|
|
||||||
unsafe impl LessThanOrEqual<::typenum::#i> for
|
|
||||||
::typenum::#j {}
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let u = Ident::new(format!("U{}", (1 << bits)));
|
|
||||||
let c = Ident::new(format!("C{}", (1 << bits)));
|
|
||||||
let p = Ident::new(format!("P{}", (1 << bits)));
|
|
||||||
let t = Ident::new(format!("T{}", (1 << bits)));
|
|
||||||
tokens.push(
|
|
||||||
quote! {
|
|
||||||
/// Maximum ceiling
|
|
||||||
pub type CMax = #c;
|
|
||||||
|
|
||||||
/// Maximum priority
|
|
||||||
pub type PMax = #p;
|
|
||||||
|
|
||||||
/// Maximum preemption threshold
|
|
||||||
pub type TMax = #t;
|
|
||||||
|
|
||||||
/// Maximum priority level
|
|
||||||
pub type UMax = ::typenum::#u;
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
let tokens = quote! {
|
|
||||||
#(#tokens)*
|
|
||||||
};
|
|
||||||
|
|
||||||
let out_dir = env::var("OUT_DIR").unwrap();
|
|
||||||
let mut out = File::create(PathBuf::from(out_dir).join("prio.rs")).unwrap();
|
|
||||||
|
|
||||||
out.write_all(tokens.as_str().as_bytes()).unwrap();
|
|
||||||
|
|
||||||
println!("cargo:rerun-if-changed=build.rs");
|
println!("cargo:rerun-if-changed=build.rs");
|
||||||
}
|
}
|
||||||
|
|
1460
src/lib.rs
1460
src/lib.rs
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue