diff options
author | 2018-09-07 00:58:29 +0200 | |
---|---|---|
committer | 2018-09-08 01:46:51 +0200 | |
commit | ca46815047dd5f23f9a46f6cda7cf6e1e638815e (patch) | |
tree | 97ce43183744bafb6207a5ab3becd34ab4ae789b | |
parent | f6902b4250203098a21d236a9935bcd4fa3e4c2b (diff) | |
download | cortex-m-ca46815047dd5f23f9a46f6cda7cf6e1e638815e.tar.gz cortex-m-ca46815047dd5f23f9a46f6cda7cf6e1e638815e.tar.zst cortex-m-ca46815047dd5f23f9a46f6cda7cf6e1e638815e.zip |
Use SmallRng instead of thread_rng which is not available on no_std
The RNG is seeded from the current time and an counter increasing with
each call to yield different random values on each invocation.
Signed-off-by: Daniel Egger <daniel@eggers-club.de>
-rw-r--r-- | cortex-m-rt/macros/src/lib.rs | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/cortex-m-rt/macros/src/lib.rs b/cortex-m-rt/macros/src/lib.rs index 3435756..579e566 100644 --- a/cortex-m-rt/macros/src/lib.rs +++ b/cortex-m-rt/macros/src/lib.rs @@ -4,13 +4,19 @@ extern crate proc_macro; extern crate rand; #[macro_use] extern crate quote; +extern crate core; extern crate proc_macro2; extern crate syn; use proc_macro2::Span; use rand::Rng; +use rand::SeedableRng; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::time::{SystemTime, UNIX_EPOCH}; use syn::{FnArg, Ident, Item, ItemFn, ItemStatic, ReturnType, Stmt, Type, Visibility}; +static CALL_COUNT: AtomicUsize = AtomicUsize::new(0); + use proc_macro::TokenStream; /// Attribute to declare the entry point of the program @@ -492,7 +498,23 @@ pub fn pre_init(args: TokenStream, input: TokenStream) -> TokenStream { // Creates a random identifier fn random_ident() -> Ident { - let mut rng = rand::thread_rng(); + let secs = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs(); + + let count: u64 = CALL_COUNT.fetch_add(1, Ordering::SeqCst) as u64; + let mut seed: [u8; 16] = [0; 16]; + + for (i, v) in seed.iter_mut().take(8).enumerate() { + *v = ((secs >> (i * 8)) & 0xFF) as u8 + } + + for (i, v) in seed.iter_mut().skip(8).enumerate() { + *v = ((count >> (i * 8)) & 0xFF) as u8 + } + + let mut rng = rand::rngs::SmallRng::from_seed(seed); Ident::new( &(0..16) .map(|i| { |