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
#![feature(asm, core_intrinsics, unique, nonzero)]
#![feature(const_fn, const_cell_new, const_unsafe_cell_new, lang_items)]
#![no_std]
#[macro_use]
pub mod common;
pub mod callback;
pub mod grant;
#[macro_use]
pub mod debug;
pub mod driver;
pub mod ipc;
pub mod mem;
pub mod memop;
pub mod returncode;
pub mod hil;
#[cfg_attr(rustfmt, rustfmt_skip)]
pub mod process;
pub mod support;
mod sched;
mod syscall;
mod platform;
pub use callback::{AppId, Callback};
pub use driver::Driver;
pub use grant::Grant;
pub use mem::{AppPtr, AppSlice, Private, Shared};
pub use platform::{mpu, systick, Chip, Platform};
pub use platform::systick::SysTick;
pub use process::{Process, State};
pub use returncode::ReturnCode;
pub fn main<P: Platform, C: Chip>(
platform: &P,
chip: &mut C,
processes: &'static mut [Option<process::Process<'static>>],
ipc: &ipc::IPC,
) {
let processes = unsafe {
process::PROCS = processes;
&mut process::PROCS
};
loop {
unsafe {
chip.service_pending_interrupts();
for (i, p) in processes.iter_mut().enumerate() {
p.as_mut().map(|process| {
sched::do_process(platform, chip, process, AppId::new(i), ipc);
});
if chip.has_pending_interrupts() {
break;
}
}
support::atomic(|| {
if !chip.has_pending_interrupts() && process::processes_blocked() {
chip.prepare_for_sleep();
support::wfi();
}
});
};
}
}