1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//! The Fibers module.
//!
//! **NOTE** This module documentation should be viewed as a continuation of
//! [the `drone_core` documentation](drone_core::fib).
//!
//! # Stackful Fibers
//!
//! This module implements stackful fibers that are similar to native threads in
//! the Rust stdlib. They can run synchronous code inside and yield with a
//! blocking call. A stackful fiber can be created with
//! [`fib::new_proc`](crate::fib::new_proc),
//! [`fib::new_proc_unchecked`](crate::fib::new_proc_unchecked),
//! [`fib::new_proc_unprivileged`](crate::fib::new_proc_unprivileged),
//! [`fib::new_proc_unprivileged_unchecked`](crate::fib::new_proc_unprivileged_unchecked):
//!
//! ```
//! # #![feature(const_fn_fn_ptr_basics)]
//! # #![feature(naked_functions)]
//! use drone_cortexm::{fib, sv};
//!
//! use drone_cortexm::sv::{SwitchBackService, SwitchContextService};
//!
//! // Stackful fibers need a supervisor.
//! sv::pool! {
//! pool => SERVICES;
//! supervisor => pub Sv;
//! services => {
//! // These services are required for stackful fibers.
//! SwitchContextService;
//! SwitchBackService;
//! }
//! }
//!
//! # fn main() {
//! // This is `impl Fiber<Input = bool, Yield = i32, Return = usize>`
//! let a = fib::new_proc::<Sv, bool, i32, usize, _>(0x800, |input, yielder| {
//! // do some work and yield
//! yielder.proc_yield(1);
//! // do some work and yield
//! yielder.proc_yield(2);
//! // do some work and return
//! 3
//! });
//! # }
//! ```
//!
//! A stackful fiber can be attached to a thread with
//! [`token.add_proc(...)`](ThrFiberProc::add_proc),
//! [`token.add_proc_unchecked(...)`](ThrFiberProc::add_proc_unchecked),
//! [`token.add_proc_unprivileged(...)`](ThrFiberProc::add_proc_unprivileged),
//! [`token.add_proc_unprivileged_unchecked(...)`](ThrFiberProc::add_proc_unprivileged_unchecked).
//! Note that fibers that are directly attached to threads can't have input,
//! yield and return values other than `()`.
//!
//! ```
//! # #![feature(const_fn_fn_ptr_basics)]
//! # #![feature(generators)]
//! # #![feature(naked_functions)]
//! # use drone_core::token::Token;
//! # use drone_cortexm::{sv, sv::SwitchBackService, sv::SwitchContextService};
//! # drone_core::thr::pool! {
//! # thread => Thr {};
//! # local => ThrLocal {};
//! # index => Thrs;
//! # threads => { sys_tick };
//! # }
//! # sv::pool! {
//! # pool => SERVICES;
//! # supervisor => pub Sv;
//! # services => { SwitchContextService; SwitchBackService };
//! # }
//! # impl drone_cortexm::thr::ThrSv for SysTick {
//! # type Sv = Sv;
//! # }
//! # fn main() {
//! # let thr = unsafe { Thrs::take() };
//! use drone_cortexm::thr::prelude::*;
//!
//! // this is `impl Fiber<Input = (), Yield = (), Return = ()>`
//! thr.sys_tick.add_proc(0x800, |yielder| {
//! // do some work and yield
//! yielder.proc_yield(());
//! // do some work and yield
//! yielder.proc_yield(());
//! // do some work and return
//! });
//! # }
//! ```
pub use *;
pub use ;