Module cortex_m_log::log [] [src]

Integration with log

As embedded development implies #[no_st] we cannot box our logger so instead simplest approach would be to declare our logger static

extern crate cortex_m_log;
extern crate log;

use cortex_m_log::log::{Logger, init};
use cortex_m_log::printer::Dummy;

static LOGGER: Logger<Dummy> = Logger {
    inner: Dummy,
    level: log::LevelFilter::Off
};

fn main() {
    init(&LOGGER).expect("To set logger");
}

Of course since there is no const-fn and some printers require Initialization function we need some better way.

One way to do it would be to trick compiler by changing lifetime of stack allocated logger to static, obviously unsafe.

extern crate cortex_m_log;
extern crate log;
extern crate cortex_m_semihosting;

use std::mem;

use cortex_m_log::log::{Logger, trick_init};
use cortex_m_log::printer::semihosting;
use cortex_m_log::modes::InterruptOk;

fn main() {
    let logger = Logger {
        inner: semihosting::InterruptOk::<_>::stdout().expect("Get Semihosting stdout"),
        level: log::LevelFilter::Info
    };
    //Haha trust me, it is safe ;)
    //As long as logger is not dropped....
    unsafe {
        let _ = trick_init(&logger);
    }
}

Obviously it is UB to drop logger after that and use any of log's macros

Structs

Logger

Simple Logger implementation

Functions

init

Initialize logging facilities.

trick_init

Performs init by tricking compiler into beliving that &mut is static.