【问题标题】:minimizing log strings in an embedded system最小化嵌入式系统中的日志字符串
【发布时间】:2016-02-04 15:22:24
【问题描述】:

我想减少从日志字符串在 UART 上发送的字节数。这个想法是用索引号替换所有日志的静态字符串,日志模块将只发送字符串索引号和参数。从那里,PC 上的应用程序(通过 UART 连接)使用包含所有 LOG 字符串及其索引的文件将创建正确的字符串并打印它。

我该怎么做?

【问题讨论】:

  • 您的嵌入式代码中肯定已经有消息引用,而不是针对每种情况的硬编码字符串文字?如果是这样,传递他们的参考文献不是比传递他们的描述文本更容易吗?但如果不是,是时候转换您的代码,以便您使用消息引用而不是实际消息。然后当代码空间紧张时,您可以将消息文本移动到 FLASH 或存储的 ROM 等。
  • 您刚刚描述了如何做到这一点 - 您对自己的解决方案有什么不了解?

标签: logging embedded printf uart


【解决方案1】:

您要做的是将日志字符串转换为令牌。您必须创建一个字典,将字符串/字符串部分转换为令牌,并且发送方和接收方必须拥有该字典。当你发送你的字符串时,定义一个后跟一个标记的转义字符,并确保这个转义码在你的正常日志字符串中没有其他地方。

在发件人中,您必须在发送字典中的字符串部分之前扫描您的字符串,然后只发送转义码和令牌。在您的字典中找不到的所有其他内容都会正常传输。

在接收方,您可以使用相同的字典简单地对其进行解码。

顺便说一句:这是(非常简单的)压缩器的工作方式。您还可以使用 LZW 压缩算法,它可能会获得更好的结果(但请确保不要在每次传输后清除翻译表!)。

【讨论】:

  • 我不相信 LZW 压缩会在资源有限的 MPU 上成功。
  • 这取决于 MPU 和算法的最大字长选择(当然,可用内存的数量对字典很重要)。很久很久很久以前,我在 C64 上实现了一个 LZW 算法,它成功了。
  • 是的,在 Commodore 64 上。但很久很久很久很久以前 ;-)
  • 如何以对程序员透明的自动方式创建这个字典?
  • 这在一定程度上取决于您使用的 MCU、可用内存以及您要发送的字符串类型。一般来说,有两种不同的方式:从源代码生成静态字典(在使用简单的解析器进行编译之前提取字符串并生成源代码文件本身),以及在发送时生成动态字典(在这种情况下,字典是构建的)在 RAM 中,并且您的日志协议必须包含一个定义新字典条目的命令,以便接收器可以构建相同的字典。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多