【前言】
nrf 的zephyr的一个非常优秀的日志记录模块【logger module】
在他的学习手册中有如下记录:
默认情况下启用时间戳功能(LOG_BACKEND_FORMAT_TIMESTAMP)以及错误和警告日志着色功能(LOG_BACKEND_SHOW_COLOR)。同样,记录器通过内部调用内核函数k_cycle_get_32()来获取时间戳。此例程返回自启动以来的当前时间(正常运行时间),由系统的硬件时钟测量。如果系统上存在外部实时时钟,您可以将其更改为返回实际时间和日期。
这次一次将在前面一篇【nRF7002DK】按键中断点灯 的基础上添加日志记录。
1、首先我在prj.conf中添加一行
CONFIG_LOG=y
添加CONFIG_LOG=y将在构建中包含记录器模块源代码。
2、在main.c包含logger的模块的头文件:
#include <zephyr/logging/log.h>
3、首先要向系统注册logger,通过使用宏LOG_MODULE_REGISTER()来完成的,它有两个参数:
1、强制模块名称。模块名称将包含在每个日志条目中,这有助于区分不同模块和/或过滤生成的消息。模块名称必须Not作为字符串传递。换句话说,不要使用引号“”
2、模块的可选最大日志级别。最大日志级别将决定哪些消息将被发送到控制台。例如,如果您将模块X的日志级别设置为LOG_LEVEL_DBG,则意味着所有生成的消息(Debug、Info、Warning和Error)将被发送到控制台。另一方面,如果您将模块Y的最大日志级别设置为LOG_LEVEL_WRN,则意味着只有具有严重级别警告和错误的消息将被发送到控制台。如果未提供最低日志级别,则文件中使用默认全局日志级别(CONFIG_LOG_DEFAULT_LEVEL)。默认全局日志级别设置为LOG_LEVEL_INF。
在main.c中的头部我添加如下一行代码:
LOG_MODULE_REGISTER(main, LOG_LEVEL_DBG);
4、打印日志信息,添加如下代码进行打印:
int exercise_num = 2; uint8_t data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 'H', 'e', 'l', 'l', 'o', '!'}; LOG_INF("nRF Connect SDK Fundamentals"); LOG_INF("Exercise %d\n", exercise_num); LOG_DBG("A Log message in debug level"); LOG_WRN("A Log message in warning level"); LOG_ERR("A Log message in error level");
5、同时将按键回调函数修改如下:
void button_pressed(const struct device *dev, struct gpio_callback *cb, uint32_t pins) { // gpio_pin_toggle_dt(&led); int i; long int factorial = 1; LOG_INF("Calculating factorial of numbers from 1 to %d", MAX_NUMBER_FACT); for(i=1;i<=MAX_NUMBER_FACT;i++){ factorial = factorial * i; LOG_INF("%d! = %ld", i, factorial); } }
【实现效果】
重新编译后,在串口打印出如下日志信息:
【总结】
在zephyr中提供了日志记录模块,使得日志打印非常容易,并且有色彩提示。