Crates.io | embedded-runtime-rp2040 |
lib.rs | embedded-runtime-rp2040 |
version | 0.4.0 |
source | src |
created_at | 2023-07-15 01:45:09.920991 |
updated_at | 2024-11-06 21:13:35.910223 |
description | A tiny async runtime for embedded devices, with predefined runtime hooks for the rp2040 |
homepage | |
repository | https://github.com/KizzyCode/embedded-runtime-rust |
max_upload_size | |
id | 916921 |
size | 6,280 |
embedded-runtime-rp2040
This crate provides a tiny async runtime, targeted at embedded devices. Therefore, it provides a single-threaded
executor as well as a stack-allocated box to box futures. This crate injects a hardware implementation for the rp2040
,
based upon wfe
/sev
.
# use core::{
# future::Future,
# pin::Pin,
# task::{Poll, Context}
# };
#
# /// Blocks until an event occurs (may wake spuriously)
# #[no_mangle]
# #[allow(non_snake_case)]
# pub fn _runtime_waitforevent_TBFzxdKN() {
# // No-op
# }
#
# /// Raises an event
# #[no_mangle]
# #[allow(non_snake_case)]
# pub fn _runtime_sendevent_3YSaPmB7() {
# // No-op
# }
use embedded_runtime::run;
/// A countdown future that resolves to pending until the poll-countdown becomes zero
struct CountdownFuture {
/// The current countdown value
countdown: usize
}
impl CountdownFuture {
/// Creates a new countdown future
pub const fn new(countdown: usize) -> Self {
Self { countdown }
}
}
impl Future for CountdownFuture {
type Output = ();
fn poll(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Self::Output> {
// Decrement the value if we are still pending
if self.countdown > 0 {
// Print the countdown
println!("{}!", self.countdown);
// Decrement the future, wake the executor and return pending
*self = Self::new(self.countdown - 1);
cx.waker().wake_by_ref();
return Poll::Pending;
}
// Return ready
println!("Liftoff 🚀");
Poll::Ready(())
}
}
// This creates a new runtime and executes the given futures in an async context
run!(async {
CountdownFuture::new(3).await;
CountdownFuture::new(7).await;
}).expect("failed to perform countdowns");