Skip to content

Commit bc97213

Browse files
committed
Cleanup panic's putchar()
1 parent e1d879a commit bc97213

File tree

1 file changed

+14
-19
lines changed

1 file changed

+14
-19
lines changed

src/panic_abort.rs

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -95,38 +95,33 @@ fn serial3_panicinfo_dump(_cs: &CriticalSection, info: &PanicInfo) {
9595
let brr = pclk1.0 / baud_rate.0;
9696
usart.brr.write(|w| unsafe { w.bits(brr) });
9797

98-
// enable USART, tx, rx
98+
// enable USART, tx
9999
usart.cr1.write(|w| w.ue().set_bit().te().set_bit());
100100

101101
serial_println!("\n!!! WARNING !!!\n{}", info);
102102
}
103103

104-
fn putchar(byte: u8) -> Result<(), ()> {
105-
let isr = unsafe { (*stm32f7x7::USART3::ptr()).isr.read() };
104+
/// Blocking putchar function to be used by the panic handler only
105+
fn putchar(byte: u8) {
106+
let mut isr = unsafe { (*stm32f7x7::USART3::ptr()).isr.read() };
106107

107-
if isr.txe().bit_is_set() && isr.tc().bit_is_set() {
108-
unsafe { ptr::write_volatile(&(*stm32f7x7::USART3::ptr()).tdr as *const _ as *mut _, byte) }
109-
Ok(())
110-
} else {
111-
Err(())
112-
}
113-
}
114-
115-
fn flush() -> Result<(), ()> {
116-
let isr = unsafe { (*stm32f7x7::USART3::ptr()).isr.read() };
108+
if isr.txe().bit_is_set() {
109+
unsafe {
110+
ptr::write_volatile(&(*stm32f7x7::USART3::ptr()).tdr as *const _ as *mut _, byte);
111+
}
117112

118-
if isr.tc().bit_is_set() {
119-
Ok(())
120-
} else {
121-
Err(())
113+
// wait for completion
114+
while {
115+
isr = unsafe { (*stm32f7x7::USART3::ptr()).isr.read() };
116+
isr.tc().bit_is_clear()
117+
} {}
122118
}
123119
}
124120

125121
impl ::core::fmt::Write for SerialOutputHandle {
126122
fn write_str(&mut self, s: &str) -> ::core::fmt::Result {
127123
for &b in s.as_bytes() {
128-
while putchar(b).is_err() {}
129-
while flush().is_err() {}
124+
putchar(b);
130125
}
131126
Ok(())
132127
}

0 commit comments

Comments
 (0)