前言:
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上开启/禁用日志功能,还讨论了不同的日志格式及它们的用法和它们之间的切换。
日志子系统输出的是人类可读的字符串,支持printf函数的所有字符串格式描述符。
日志子系统的输出内容被称为日志信息,日志信息在内存中可以连续存储,包含时间戳、信息描述符(信息来源、域、日志等级)、格式化字符串和可选数据四个部分。
可以在任何上下文中打印日志信息。
具有转储数据的功能。
zephyr根据日志信息的重要程度,定义了四个日志等级,即Information, Debugging, Warning和Error,并为每个日志等级提供了一系列的API,如下表所示。

如图所示,Zephyr的日志子系统分为以下三个部分:
提供创建日志信息所需的宏和函数。
启用/禁用日志信息的某种格式。
|
|
|
|
|
|
|
|
|
耗时的处理被延迟到已知的上下文,对应用程序的影响最小
|
影响性能,在日志上下文中执行的耗时操作(例如,高优先级中断)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在源码中包含Log头文件log.h
在源码中使用LOG _ MODULE _ REGISTER (MODULE,Level)注册Log模块,其中MODULE参数为模块名称,必须唯一;Level参数为本模块的日志等级。
在源码中使用相应日志等级的API输出Log信息。
在Kconfig文件中将CONFIG_LOG选项设置为y。
以下例子中,注册了一个名为hello_world的information等级的Log模块,其在返回前打印“Hello please”。

其运行结果是:

可以看到日志信息中包含了时间戳,日志等级,模块名称以及自定义的信息。
使用如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格式的过程记录。
