use crate::uart::Uart; use crate::mutex::Mutex; const UART_RATE: u32 = 115_200; static mut UART: Option = None; static mut UART_MUTEX: Mutex = Mutex::new_unlocked(); #[doc(hidden)] fn get_uart() -> &'static mut Uart { unsafe { match &mut UART { None => { let uart = Uart::serial(UART_RATE); UART = Some(uart); UART.as_mut().unwrap() } Some(uart) => uart, } } } // call f(UART) with UART locked via UART_MUTEX pub fn with_uart(f: F) where F: Fn(&mut Uart) -> () { unsafe { UART_MUTEX.acquire(); } f(get_uart()); unsafe { UART_MUTEX.release(); } } #[macro_export] macro_rules! print { ($($arg:tt)*) => ({ crate::stdio::with_uart(|uart| { use core::fmt::Write; let _ = write!(uart, $($arg)*); }); }) } #[macro_export] macro_rules! println { ($($arg:tt)*) => ({ crate::stdio::with_uart(|uart| { use core::fmt::Write; let _ = write!(uart, $($arg)*); let _ = write!(uart, "\r\n"); while !uart.tx_fifo_empty() {} }); }) }