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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
use core::fmt::*;
use kernel::hil::uart::{self, UART};
use kernel::process;
use sam4l;
pub struct Writer {
initialized: bool,
}
pub static mut WRITER: Writer = Writer { initialized: false };
impl Write for Writer {
fn write_str(&mut self, s: &str) -> ::core::fmt::Result {
let uart = unsafe { &mut sam4l::usart::USART0 };
if !self.initialized {
self.initialized = true;
uart.init(uart::UARTParams {
baud_rate: 115200,
stop_bits: uart::StopBits::One,
parity: uart::Parity::None,
hw_flow_control: false,
});
uart.enable_tx();
}
for c in s.bytes() {
uart.send_byte(c);
while !uart.tx_ready() {}
}
Ok(())
}
}
#[cfg(not(test))]
#[no_mangle]
#[lang = "panic_fmt"]
pub unsafe extern "C" fn panic_fmt(args: Arguments, file: &'static str, line: u32) -> ! {
asm!("nop");
asm!("nop");
for _ in 0..200000 {
asm!("nop");
}
asm!("nop");
asm!("nop");
let writer = &mut WRITER;
let _ = writer.write_fmt(format_args!(
"\r\n\nKernel panic at {}:{}:\r\n\t\"",
file, line
));
let _ = write(writer, args);
let _ = writer.write_str("\"\r\n");
let _ = writer.write_fmt(format_args!(
"\tKernel version {}\r\n",
env!("TOCK_KERNEL_VERSION")
));
let procs = &mut process::PROCS;
if procs.len() > 0 {
procs[0].as_mut().map(|process| {
process.fault_str(writer);
});
}
let _ = writer.write_fmt(format_args!("\r\n---| App Status |---\r\n"));
let procs = &mut process::PROCS;
for idx in 0..procs.len() {
procs[idx].as_mut().map(|process| {
process.statistics_str(writer);
});
}
let ledg = &sam4l::gpio::PA[14];
ledg.enable_output();
ledg.set();
let ledb = &sam4l::gpio::PA[15];
ledb.enable_output();
ledb.set();
let led = &sam4l::gpio::PA[13];
led.enable_output();
loop {
for _ in 0..1000000 {
led.clear();
}
for _ in 0..100000 {
led.set();
}
for _ in 0..1000000 {
led.clear();
}
for _ in 0..500000 {
led.set();
}
}
}
#[macro_export]
macro_rules! print {
($($arg:tt)*) => (
{
use core::fmt::write;
let writer = unsafe { &mut $crate::io::WRITER };
let _ = write(writer, format_args!($($arg)*));
}
);
}
#[macro_export]
macro_rules! println {
($fmt:expr) => (print!(concat!($fmt, "\n")));
($fmt:expr, $($arg:tt)*) => (print!(concat!($fmt, "\n"), $($arg)*));
}