Logging
It would be nice to be able to use the logging macros from the log crate. We can do this by implementing the Log trait.
use crate::pl011::Uart;use core::fmt::Write;use log::{LevelFilter, Log, Metadata, Record, SetLoggerError};use spin::mutex::SpinMutex;static LOGGER: Logger = Logger { uart: SpinMutex::new(None) };struct Logger {uart: SpinMutex<Option<Uart>>,}impl Log for Logger {fn enabled(&self, _metadata: &Metadata) -> bool {true}fn log(&self, record: &Record) {writeln!(self.uart.lock().as_mut().unwrap(),"[{}] {}",record.level(),record.args()).unwrap();}fn flush(&self) {}}/// Initialises UART logger.pub fn init(uart: Uart, max_level: LevelFilter) -> Result<(), SetLoggerError> {LOGGER.uart.lock().replace(uart);log::set_logger(&LOGGER)?;log::set_max_level(max_level);Ok(())}
- The unwrap in
logis safe because we initialiseLOGGERbefore callingset_logger.