3个版本
0.1.2 | 2022年5月29日 |
---|---|
0.1.1 | 2022年5月28日 |
0.1.0 | 2022年5月28日 |
205 在 无标准库
每月21次下载
13KB
176 行
LOGZ
此仓库提供了一个Rust日志实现Crate,用于在Zephyr RTOS嵌入式设备上使用。使用bindgen
和cbindgen
将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
- M4(F):
- 工具和子命令
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