前言
2023年Zephyr开发者大会(ZDS)于6月27日至30日在捷克布拉格隆重举行。与以往两次不同,本次ZDS由Zephyr项目规划和管理,并作为首届嵌入式开源峰会(EOSS)的一部分进行。在这个令人期待已久的盛会中,全球Zephyr开发者们共同探讨了Zephyr实时操作系统(RTOS)的最新技术与发展趋势。作为一款开源、灵活和可扩展的嵌入式实时操作系统,Zephyr项目在2014年由英特尔发起,2016年作为Linux基金会项目正式面向公众启动,得到了全球范围内的广泛关注和采用。
ZDS 2023共70余个技术报告,涵盖了使用指导与展示、新功能与技术、架构修改与操作系统、多核异构与虚拟化、模拟器、测试、工业流程与代码管理、安全性、应用案例、工具与调试等丰富多样的内容。湖大嵌入式实验室的小伙伴们将对本次大会的所有技术报告进行逐一收集、整理与分享,尽最大努力为Zephyr开发者提供ZDS 2023技术报告的开发经验、实践成果以及解决方案的参考。
今天分享第20篇技术报告,由梅傲凌整理,题目为:
“Pigeweed Tokenizer”
作者简介

Al Semjonovs是一名谷歌软件工程师,致力于在嵌入式软件开发领域寻求一个具有挑战性的工程职位,希望能够在团队环境中为实现公司目标贡献一份力量。Al Semjonovs是强大的C/C++编码者,能够开发根据需求扩展的敏捷/可维护框架,能够实现技术、人际关系和沟通技能的巧妙融合,能够很好地与他人合作完成工作。
Pigeweed Tokenizer 是什么?
它与字符串解析无关,通过使用32位散列标记来替换整个字符串文字,这样做可以通过从二进制文件中删除字符串文字来减小二进制文件的大小,减少I/O流量、RAM和闪存使用量,还能通过用简单的标记化代码替换snprintf调用来减少CPU使用量。
Pigweed Tokenizer与Zephyr字典日志记录的比较

Token数据库
它从ELF文件生成,用来存储哈希标记到它们所代表的字符串的映射。
它的数据库格式类型包括:CSV,二进制,基于目录的格式。
它能够通过捕获未使用标记的删除日期来更新现有数据库。
它与CMake和GN构建集成。
Detokenizing(去标记化)的过程
该过程的语言支持包括Python,C/C++以及TypeScript
①通过Web控制台
Pigweed包括一个网络控制台,用于演示基于React的网络应用程序中pigweed的使用情况。Web控制台包括一个日志查看器和一个支持自动完成的REPL。以下是如何在本地运行web控制台:
$ cd pw_web/webconsole
$ npm install
$ npm run dev
②通过系统控制台
输入以下命令:
pigweed$ python3 -m pw_system.console --device /dev/ttyUSB0 --token -databases database.csv
Tokenized日志记录示例
使用前:纯文本日志记录如下图所示

使用后:Tokenized日志如下图所示

标记化对我们有什么帮助?
在数据库管理方面
使用token数据库时可以采用1:1或者1对多的方式,单个的数据库支持多EC板组合和多个固件版本,比如Chromebook支持周期为8年。
数据库大小:
单个EC板:40KB
多EC板组合支持:66KB
每多一块板子大约增长1KB
与Bazel/GN/CMake项目集成
集成pw_tokenizer除了构建代码外,还需要几个步骤。本节描述了一种方法pw_tokenizer来与项目进行集成,这些步骤可以根据需要进行调整。
①在您进行构建时添加pw_tokenizer,这里提供了GN、CMake和Bazel的构建文件。对于Make或其他构建系统,添加build.gn的pw_tokenizer中指定的文件到构建文件。
②在代码中使用标记化宏。详见Tokenization 。
③添加pw_tokenizer_linker_sections.ld的内容到项目的链接器脚本。在GN和CMake中,此步骤自动完成。
④编译您的代码以生成ELF文件。
⑤在ELF文件上运行database.py create生成CSV标记数据库。详见Managing token databases 。
⑥将标记数据库提交到存储库。详见Database management 。
⑦集成adatabase.py add命令来自动更新提交的标记数据库。在GN中,使用pw_tokenizer_database模板执行此操作。详见Update a database 。
⑧整合detokenize.py或使用您的工具来解码标记化日志的C反标记库。请参见去标记化 。
如何将Pigweed标记化集成到您的Zephyr项目中
当在Zephyr中使用pw_tokenizer时,这里有3个Kconfig目前可以使用:
CONFIG_PIGWEED_TOKENIZER将自动链接pw_标记器以及任何依赖项
CONFIG_PIGWEED_TOKENIZER_BASE64将自动链接pw_tokenizer.base64以及任何依赖项
CONFIG_PIGWEED_DETOKENIZER将自动链接pw_tokenizer.解码器以及任何依赖项
启用后,标记器headers可以像任何Zephyr headers一样包含在内:
#include<pw_tokenizer/tokenize.h>
第一步:引入
pigweed/Kconfig.zephyr
第二步:启用
CONFIG_STD_CPP20=y
CONFIG_ZEPHYR_PIGWEED_MODULE=y
CONFIG_PIGWEED_LOG_TOKENIZE=y
第三步:更新CMake
第四步:添加数据库创建依赖项
在EC中标记化计划的未来改进
标记化的字符串作为%s参数,包括状态名称和枚举
标记化的RPC日志记录