本文说明如何使用Zephyr实例日志。
当一个模块会以多实例运行时,不同的实例显示出来的模块标签都是同一个,这将导致无法识别到底时那个实例的日志输出。为解决该问题Zephyr日志系统提供了多实例支持,可以在实例级别进行过滤。
使用方法
按照如下步骤使用实例日志:
在模块文件中使用
LOG_MODULE_REGISTER
进行注册使用
LOG_INSTANCE_PTR_DECLARE
在实例结构中指定日志的结构使用
LOG_INSTANCE_REGISTER
注册实例,并使用LOG_INSTANCE_PTR_INIT
进行日志实例初始化。使用
LOG_INST_*
或LOG_INST_HEXDUMP_*
进行日志记录。
示例代码sample_instance.h
如下
1 |
|
示例代码sample_instance.c
如下
1 |
|
当头文件中的函数需要加入到模块实例中时,需要在头文件的函数体内使用LOG_LEVEL_SET
指定日志等级,再调用LOG_INST_*
进行日志输出。示例代码添加再sample_instance.h
如下:
1 | static inline void sample_instance_header_do(struct sample_instance *inst) |
该示例演示了一个可多实例工作的sample_instance模块,通过sample_instance_open
开启一个新的实例,sample_instance_do
来执行指定实例时通过日志系统输出自己的内部计数,sample_instance_header_do
指定了一个INFO等级的实例日志输出。该模块在日志系统中的模块名为module_inst,为了区分不同的实例的打印使用了实例日志,测试代码如下:
1 | void instance_logging(void) |
其输出结果为:
[00:00:25.731,861]
module_inst.inst0: inst 0x3fc8c364 counter_value: 10
[00:00:25.731,901]module_inst.inst1: inst 0x3fc8c36c counter_value: 10
[00:00:25.731,904]module_inst.inst2: inst 0x3fc8c374 counter_value: 10
[00:00:25.731,922]module_inst.inst0: inst 0x3fc8c364 header do 11.
从结果能够看到在模块标签module_inst后又多了一个实例标签inst*,这样即使是同一份代码,也能够根据实例标签判断是哪个实例产生的日志。
注意:实例日志的注册宏LOG_INSTANCE_REGISTER
要求参数有实例名,该宏是在编译期间就展开了,因此实例名必须在编译期就确定,无法运行时生成。这就要求使用实例日志的多实例模块必须要预先知道最大实例数,并指定好日志系统的实例名,而无法在运行时根据实际的实例数量动态生成。
接口说明
实例日志的格式化输出接口和原始数据16进制输出接口如下
1 | LOG_INST_ERR(_log_inst, ...) |
只比模块日志多指定一个_log_inst
的实例参数,其它使用方法一样,可以参考Zephyr日志使用指南-模块日志一文。
参考
https://docs.zephyrproject.org/latest/services/logging/index.html