aboutsummaryrefslogtreecommitdiff
path: root/cortex-m-rt
diff options
context:
space:
mode:
authorGravatar Daniel Egger <daniel@eggers-club.de> 2018-09-07 00:58:29 +0200
committerGravatar Daniel Egger <daniel@eggers-club.de> 2018-09-08 01:46:51 +0200
commitca46815047dd5f23f9a46f6cda7cf6e1e638815e (patch)
tree97ce43183744bafb6207a5ab3becd34ab4ae789b /cortex-m-rt
parentf6902b4250203098a21d236a9935bcd4fa3e4c2b (diff)
downloadcortex-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>
Diffstat (limited to 'cortex-m-rt')
-rw-r--r--cortex-m-rt/macros/src/lib.rs24
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| {