目前的位置: 首页 学术信息 正文

ZDS 2023技术报告分享第2篇:Zephyr日志子系统概述


前言:

2023年Zephyr开发者大会(ZDS)于6月27日至30日在捷克布拉格隆重举行。与以往两次不同,本次ZDS由Zephyr项目规划和管理,并作为首届嵌入式开源峰会(EOSS)的一部分进行。在这个令人期待已久的盛会中,全球Zephyr开发者们共同探讨了Zephyr实时操作系统(RTOS)的最新技术与发展趋势。作为一款开源、灵活和可扩展的嵌入式实时操作系统,Zephyr项目在2014年由英特尔发起,2016年作为Linux基金会项目正式面向公众启动,得到了全球范围内的广泛关注和采用。


ZDS 2023共70余个技术报告,涵盖了使用指导与展示、新功能与技术、架构修改与操作系统、多核异构与虚拟化、模拟器、测试、工业流程与代码管理、安全性、应用案例、工具与调试等丰富多样的内容。湖大嵌入式实验室的小伙伴们将对本次大会的所有技术报告进行逐一收集、整理与分享,尽最大努力为Zephyr开发者提供ZDS 2023技术报告的开发经验、实践成果以及解决方案的参考。


今天分享第2篇技术报告,题目为:

“Zephyr日志子系统概述”



Aastha Grover

英特尔公司 软件工程师

作者简介:

Aastha Grover是美国英特尔公司的软件开发人员,并于2019年加入Zephyr社区。Aastha毕业于波士顿东北大学计算机科学专业,主修信息系统。她为Test Runner Twister开发了TestSuite,并于近期成为日志子系统的活跃贡献者。她拥有在Zephyr上启用Elkhart Lake和ACRN hypervisor等平台的丰富经验。



文章简介:

日志子系统是操作系统中的一个重要组成部分,用于记录系统的各种运行信息及事件,以便于系统管理员或开发人员进行故障排查、性能优化等工作。本文以Aastha的演讲为依据,对日志子系统进行了简要的介绍,并展示了如何在Zephyr上开启/禁用日志功能,还讨论了不同的日志格式及它们的用法和它们之间的切换。



日志子系统:

zephyr日志子系统功能概述

  • 日志子系统输出的是人类可读的字符串,支持printf函数的所有字符串格式描述符。

  • 日志子系统的输出内容被称为日志信息,日志信息在内存中可以连续存储,包含时间戳、信息描述符(信息来源、域、日志等级)、格式化字符串和可选数据四个部分。

  • 可以在任何上下文中打印日志信息。

  • 具有转储数据的功能。

  • zephyr根据日志信息的重要程度,定义了四个日志等级,即Information, Debugging, Warning和Error,并为每个日志等级提供了一系列的API,如下表所示。

X = ERR, WRN, DBG, INFO

API

功能

LOG_X

标准打印

LOG_INST_X

与特定实例关联的标准打印

LOG_HEXDUMP_X

转储十六进制数据

LOG_INST_HEXDUMP_X

转储与特定实例关联的十六进制数据

LOG_PRINTK /LOG_RAW

无条件地打印原始日志消息

LOG_MODULE_REGISTER

向日志记录器注册模块

LOG_MODULE_DECLARE

取消注册日志模块


  • 支持多个输出通道,如串口、文件系统、远程终端等。



zephyr日志子系统架构

27E5

如图所示,Zephyr的日志子系统分为以下三个部分:

前端部分

  • 默认情况下,前端部分在调用Log API时工作。

  • 负责日志信息过滤(编译和运行时)、缓冲区分配、创建和提交日志信息。

信息过滤

  • 编译时过滤:根据日志等级过滤。

  • 运行时过滤:根据日志信息的来源过滤,并且独立于每个后端。

缓冲区分配

  • 日志信息会存储在一个环形缓冲区中,此环形缓冲区为多生产者单消费者缓冲区(MPSC_PBUF),采用FIFO的存取策略。

  • 当没有足够的空间满足请求时,Zephyr提供了两种分配策略,覆写(需要设置CONFIG_LOG_MODE_OVERFLOW)和不覆写。

创建和提交日志信息

  • 前端部分作为生产者,负责向缓冲区中提交日志信息。

  • 优化以更快地记录日志信息,如在中断上下文中进行Log,整个过程不能持续太久。

核心部分

  • 提供创建日志信息所需的宏和函数。

  • 启用/禁用日志信息的某种格式。

后端部分

  • 输出日志信息。

  • 日志信息通过缓冲区由前端传递到活动的后端进行处理,后端的处理是同步的,缓冲区中的日志信息必须按顺序释放。

  • 同一时刻,可以有多个活动的后端,Zephyr最多允许9个后端同时活动。



日志模式

下表列出了三种日志模式,并对它们进行了比较。

模式

延迟

即时

最小化

操作

日志信息被缓存,并将延迟处理

日志信息将在调用的上下文中进行处理,并立即输出

重定向到printk

性能 影响

耗时的处理被延迟到已知的上下文,对应用程序的影响最小

影响性能,在日志上下文中执行的耗时操作(例如,高优先级中断)

/

过滤

编译时,运行时过滤

运行时过滤

没有运行时过滤

格式 化

支持丰富的日志信息格式

支持格式化

无格式化、时间戳

侵入 式

接近非侵入性

侵入式

/

后端 支持

支持任何后端

支持的后端有限

/



在zephyr中如何Log

  • 在源码中包含Log头文件log.h

  • 在源码中使用LOG _ MODULE _ REGISTER (MODULE,Level)注册Log模块,其中MODULE参数为模块名称,必须唯一;Level参数为本模块的日志等级。

  • 在源码中使用相应日志等级的API输出Log信息。

  • 在Kconfig文件中将CONFIG_LOG选项设置为y。


以下例子中,注册了一个名为hello_world的information等级的Log模块,其在返回前打印“Hello please”。

255CA

其运行结果是:

25BD

可以看到日志信息中包含了时间戳,日志等级,模块名称以及自定义的信息。



Zephyr的日志格式  

zephyr提供了四种日志格式:


MIPI-SyS-T

  • 需要设置CONFIG_LOG_MIPI_SYST_ENABLE。

  • 用于在测试系统和设备之间共享软件调试和跟踪信息的通用数据格式,简化了嵌入式软件和调试硬件的集成。

  • 多用于开发测试产品。

Dictionary

  • 需要设置LOG_DICTIONARY_SUPPORT。

  • 二进制格式的输出。

Text

  • 输出为文本形式,默认格式。

Custom Format

  • 需要设置CONFIG_LOG_CUSTOM_FORMAT_SUPPORT。

  • 自定义格式。



Zephyr动态切换日志格式

  • 使用如log_format_set(const struct log_backend *backend, uint32_t log_type)或者log_format_set_all_active_backends(size_t log_type)这样的API。

  • 建议在即时模式下进行日志格式的动态切换,因为在延迟模式下,有可能因为日志信息的延迟处理导致无法及时观察到日志格式的切换。


下图是在运行时,从MIPI-SyS-T格式切换到Text格式,又切换回MIPI-SyS-T格式的过程记录。

5E9FA


上一条:ZDS 2023技术报告分享第3篇:从Arduino到Zephyr RTOS,开发嵌入式应用程序 下一条:ZDS 2023技术报告分享第1篇:嵌入式开源巨星Zephyr的九年征程

关闭

嵌入式与网络计算湖南省重点实验室
版权所有 © 2023 湖南大学