freertos_rust/
hooks.rs

1use crate::base::*;
2use crate::utils::*;
3use crate::prelude::v1::String;
4
5type Callback = fn();
6
7pub struct FreeRtosHooks {
8    on_assert: Callback,
9}
10
11impl FreeRtosHooks {
12    pub fn set_on_assert(&mut self, c: Callback) {
13        self.on_assert = c;
14    }
15
16    fn do_on_assert(&self) {
17        (self.on_assert)();
18    }
19}
20
21// TODO: It's unsafe to use, we should build some safe wrapper around
22pub static mut FREERTOS_HOOKS: FreeRtosHooks = FreeRtosHooks {
23    on_assert: || {}
24};
25
26#[allow(unused_doc_comments)]
27#[no_mangle]
28pub extern "C" fn vAssertCalled(file_name_ptr: FreeRtosCharPtr, line: FreeRtosUBaseType) {
29    let file_name: String;
30    unsafe {
31        file_name = str_from_c_string(file_name_ptr).unwrap();
32    }
33
34    unsafe { FREERTOS_HOOKS.do_on_assert(); }
35
36    // we can't print without std yet.
37    // TODO: make the macro work for debug UART? Or use Panic here?
38    // println!("ASSERT: {} {}", line, file_name);
39    panic!("FreeRTOS ASSERT: {}:{}", file_name, line);
40    //loop {}
41}