3个版本

0.1.2 2022年5月29日
0.1.1 2022年5月28日
0.1.0 2022年5月28日

205无标准库

每月21次下载

MIT/Apache

13KB
176

LOGZ

此仓库提供了一个Rust日志实现Crate,用于在Zephyr RTOS嵌入式设备上使用。使用bindgencbindgen将Rust调用绑定到Zephyr RTOS的log2实现。由于此Crate针对NRF52和NRF53部署,它是no_std且不进行分配。

构建

将此Crate包含在需要日志实现的另一个Crate中,并使用常规的日志宏调用,如log::trace!("2.0 * 2.0 = {}", 2. * 2.);。具有高初始化优先级,全局日志器初始化为调用桥接C中的匹配LOG_DBG、LOG_INF、LOG_WRN或LOG_ERR宏。

构建工具

为了构建,需要安装以下工具

  • NRF Connect SDK
    • v1.9.1
  • Rustup和Cargo
    • 稳定版
    • v1.24.3和v1.61.0
  • 交叉编译目标
    • M4(F): thumbv7em-none-eabihf
    • M33(F): thumbv8m.main-none-eabihf
  • 工具和子命令
    • cargo安装cargo-make,cbindgen
    • brew安装llvm
      • llvm-config需要添加到您的PATH
      • echo'export PATH="/opt/homebrew/opt/llvm/bin:$PATH"' >> ~/.zshrc
      • sudoxcode-select --install

如果一切就绪,则cargo make test应该可以工作。

示例

在示例中,我们有一个针对 NRF52 或 NRF53 编译的 blinky 应用程序。示例项目的 CMakeLists.txt 添加了需要日志记录器的库,但作为静态库构建了 Zephyr RTOS 的 main.c。示例项目包含 logz 作为 crate 依赖项,并添加了 lib/logz 子模块。子模块包含示例 CMakeLists.txt 中需要包含的 C 头文件和源文件。

完整的示例在此:https://github.com/trueb2/logz-example-rs

示例 CMakeLists.txt 中使用静态库和 logz 的 bridge.c 构建项目

cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(blinky)

### EXAMPLE STATIC LIBRARY :: BEGIN ###

# Allow app to include headers from the library including normal or bindgen headers
set(LOGZ_EXAMPLE_LIB_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/logz-example-rs)
set(LOGZ_LIB_SRC_DIR ${LOGZ_EXAMPLE_LIB_SRC_DIR}/lib/logz)
# Cortex-M4F (NRF52)
# set(LOGZ_EXAMPLE_LIB_DIR ${LOGZ_EXAMPLE_LIB_SRC_DIR}/target/thumbv7em-none-eabihf/release)
# Cortex-M33F (NRF53)
set(LOGZ_EXAMPLE_LIB_DIR ${LOGZ_EXAMPLE_LIB_SRC_DIR}/target/thumbv8m.main-none-eabihf/release)
include_directories(AFTER ${LOGZ_EXAMPLE_LIB_SRC_DIR}/include ${LOGZ_EXAMPLE_LIB_SRC_DIR}/include/generated ${LOGZ_LIB_SRC_DIR}/include/generated)
add_library(liblogz_example_rs STATIC IMPORTED GLOBAL)
set_target_properties(liblogz_example_rs PROPERTIES IMPORTED_LOCATION ${LOGZ_EXAMPLE_LIB_DIR}/liblogz_example_rs.a)
# Always let cargo decide if the library should be rebuilt
add_custom_target(
  liblogz_example_rs_target
  ALL
  BYPRODUCTS ${LOGZ_EXAMPLE_LIB_DIR}/liblogz_example_rs.a
  WORKING_DIRECTORY ${LOGZ_EXAMPLE_LIB_SRC_DIR}
  COMMAND cargo make build
  )
add_dependencies(app liblogz_example_rs_target)
# A couple Cortex M math functions get multiple definitions
target_link_libraries(app PRIVATE ${LOGZ_EXAMPLE_LIB_DIR}/liblogz_example_rs.a -Wl,--allow-multiple-definition)

### EXAMPLE STATIC LIBRARY :: END ###


### The logger bindings still need to be compiled for zephyr, which is why we still have to build the static lib and bridge
target_sources(app PRIVATE src/main.c ${LOGZ_LIB_SRC_DIR}/src/bridge.c)

这确保了日志宏调用将被管道传输到一个初始化的 Logger 实例,该实例将日志以 Rust 格式作为字符串写入 Zephyr LOG2 实现

在 Zephyr 中,我们调用 Rust 库函数 example_foo()

void flip_timer(struct k_timer* timer) {
	LOG_INF("LED: %d", (int) on);
	gpio_pin_set(led_dev, PIN, (int)on);
	on = !on;
	example_foo();
}

在 Rust 中,我们格式化日志并调用 LOG2 宏

#[no_mangle]
pub extern "C" fn example_foo() {
    log::trace!("Foo");
    log::debug!("Bar");
    log::info!("Fizz");
    log::warn!("Buzz");
    log::error!("Fizzle");
}
void log_inf(const char *restrict msg)
{
    LOG_INF("%s", msg);
}

在 UART、RTT 或你在 Kconfig 中配置的任何地方,我们获得正常日志。

[00:04:32.166,320] <inf> rs: logz_example_rs: Fizz
[00:04:32.166,351] <wrn> rs: logz_example_rs: Buzz
[00:04:32.166,381] <err> rs: logz_example_rs: Fizzle
[00:04:32.416,198] <inf> blinky: LED: 0
[00:04:32.416,259] <inf> rs: logz_example_rs: Foo
[00:04:32.416,290] <inf> rs: logz_example_rs: Bar
[00:04:32.416,320] <inf> rs: logz_example_rs: Fizz
[00:04:32.416,351] <wrn> rs: logz_example_rs: Buzz
[00:04:32.416,412] <err> rs: logz_example_rs: Fizzle
[00:04:32.666,198] <inf> blinky: LED: 1
[00:04:32.666,259] <inf> rs: logz_example_rs: Foo
[00:04:32.666,290] <inf> rs: logz_example_rs: Bar
[00:04:32.666,351] <inf> rs: logz_example_rs: Fizz
[00:04:32.666,381] <wrn> rs: logz_example_rs: Buzz
[00:04:32.666,412] <err> rs: logz_example_rs: Fizzle
[00:04:32.916,229] <inf> blinky: LED: 0
[00:04:32.916,290] <inf> rs: logz_example_rs: Foo
[00:04:32.916,320] <inf> rs: logz_example_rs: Bar
[00:04:32.916,351] <inf> rs: logz_example_rs: Fizz
[00:04:32.916,381] <wrn> rs: logz_example_rs: Buzz
[00:04:32.916,442] <err> rs: logz_example_rs: Fizzle

依赖项

~0.6–2.5MB
~48K SLoC