aboutsummaryrefslogtreecommitdiff
path: root/src/examples/_5_late_resources.rs
blob: 8df6716cbac546cc8368012223b04b5ac70f9ea2 (plain) (blame)
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
//! Demonstrates initialization of resources in `init`.
//!
//! ```
//! 
//! #![deny(unsafe_code)]
//! #![feature(proc_macro)]
//! #![no_std]
//! 
//! extern crate cortex_m_rtfm as rtfm;
//! extern crate stm32f103xx;
//! 
//! use rtfm::{app, Threshold};
//! 
//! app! {
//!     device: stm32f103xx,
//! 
//!     resources: {
//!         // Usually, resources are initialized with a constant initializer:
//!         static ON: bool = false;
//! 
//!         // However, there are cases where this is not possible or not desired.
//!         // For example, there may not be a sensible value to use, or the type may
//!         // not be constructible in a constant (like `Vec`).
//!         //
//!         // While it is possible to use an `Option` in some cases, that requires
//!         // you to properly initialize it and `.unwrap()` it at every use. It
//!         // also consumes more memory.
//!         //
//!         // To solve this, it is possible to defer initialization of resources to
//!         // `init` by omitting the initializer. Doing that will require `init` to
//!         // return the values of all "late" resources.
//!         static IP_ADDRESS: u32;
//! 
//!         // PORT is used by 2 tasks, making it a shared resource. This just tests
//!         // another internal code path and is not important for the example.
//!         static PORT: u16;
//!     },
//! 
//!     idle: {
//!         // Test that late resources can be used in idle
//!         resources: [IP_ADDRESS],
//!     },
//! 
//!     tasks: {
//!         SYS_TICK: {
//!             priority: 1,
//!             path: sys_tick,
//!             resources: [IP_ADDRESS, PORT, ON],
//!         },
//! 
//!         EXTI0: {
//!             priority: 2,
//!             path: exti0,
//!             resources: [PORT],
//!         }
//!     }
//! }
//! 
//! // The signature of `init` is now required to have a specific return type.
//! fn init(_p: init::Peripherals, _r: init::Resources) -> init::LateResources {
//!     // `init::Resources` does not contain `IP_ADDRESS`, since it is not yet
//!     // initialized.
//!     //_r.IP_ADDRESS;     // doesn't compile
//! 
//!     // ...obtain value for IP_ADDRESS from EEPROM/DHCP...
//!     let ip_address = 0x7f000001;
//! 
//!     init::LateResources {
//!         // This struct will contain fields for all resources with omitted
//!         // initializers.
//!         IP_ADDRESS: ip_address,
//!         PORT: 0,
//!     }
//! }
//! 
//! fn sys_tick(_t: &mut Threshold, r: SYS_TICK::Resources) {
//!     // Other tasks can access late resources like any other, since they are
//!     // guaranteed to be initialized when tasks are run.
//! 
//!     r.IP_ADDRESS;
//! }
//! 
//! fn exti0(_t: &mut Threshold, _r: EXTI0::Resources) {}
//! 
//! fn idle(_t: &mut Threshold, _r: idle::Resources) -> ! {
//!     loop {
//!         rtfm::wfi();
//!     }
//! }
//! ```
// Auto-generated. Do not modify.