This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC1312R:[CC1312]TI Logger Python 分析:格式说明符支持查询

Guru**** 2337880 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1524911/cc1312r-cc1312-ti-logger-python-parsing-format-specifier-support-inquiry

器件型号:CC1312R

工具/软件:

您好 TI 支持团队:

我遇到了未解决的问题  TI Logger  最新版  SimpleLink SDK implelink_cc13xx_cc26xx_sdk_8_30_01_01  通过 Python 分析日志时:

  1. %d 将值打印为无符号整数(类似于) %u

  2. %s 无法完全显示字符串值。

尽管 C 代码中的格式指定符正确、但这会发生、这表明中可能存在不匹配情况  Python 解析实现  记录器中的记录。

关键问题:

  • TI Logger 的 Python 模块中是否存在关于标准格式说明符 (,,)%d %u %s 的已知限制?

  • 是否计划更新 TI Logger 的 Python 解析器、以便在未来的 SDK 版本中符合标准 printf 行为?

  • 如果需要修改、应参考 SDK 中的哪些 Python 模块/文件(例如,) ti_logger_parser.py log_format.py

附加上下文:

  • 根据请求提供示例日志输出和 Python 解析代码。

请提供有关变通办法或修补程序的建议。

此致、
YJ Kim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kim:

    您能否分享有关该主题的更多详细信息:

    -您正在使用哪个日志接收器?
    -项目和解析代码的一个最小的例子?

    您是否已经查看了解释实施的配套资料:
    - SimpleLink Academy: https://dev.ti.com/tirex/explore/node?node=A__AUtBCHw9KYI99xItuPjn4w__com.ti.SIMPLELINK_ACADEMY_CC13XX_CC26XX_SDK__AfkT0vQ__LATEST
    - README:sdk-directory\tools\log\tiutils\README.md

    此致、
    Theo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Theo:

    感谢您的快速答复。

    关于您的问题:

    • 我已经对两者进行了测试 ITM UART 日志接收器、两者的问题仍然存在、得到的结果相同。
    • 问题的最小示例如下:我有一个int8_t表示 RSSI 值的变量。 当我使用Log_printf%d格式说明符打印此变量时、需要负值、如所示 –101. 、则输出 I receive 为 4294967195. 。 预期的正确输出为–101。

    此行为似乎直接源于中所述的参数处理log.h。 根据头文件中的注释、参数被转换为uintptr_t无符号整数类型。 这本身就限制了有符号值在传输之前在目标端的解释方式。

    请参阅以下摘录 log.h

    * The arguments are type-cast to a uintptr_t, which is an unsigned integer
     * type. This limits the supported format specifiers to the following:
     * - Unsigned decimal integer: %u
     * - Unsigned hexadecimal integer: %x
     * - Unsigned hexadecimal integer (capital letters): %X
     * - Character: %c
     * - Signed decimal integer for positive values: %i, %d
     * - Signed octal for positive values: %o
     *
     * @note All arguments are treated as 32-bit wide and are promoted or
     * truncated accordingly.

    如本文档所示、%i%d当转换为时、和仅限于“正值“uintptr_t。 这解释了为什么负int8_t值(例如–101、0xFFFFFF9B当提升为 32 位有符号整数时)unsigned4294967195在原始日志输出中显示为其 32 位等效值 () 的原因。 tilogger然后 PC 端解析工具 () 解释这个原始unsigned值。

    我已经查看了提供的 SimpleLink Academy 和自述文件配套资料、但它们似乎无法解决主机端这个特定的有符号整数解释问题。

    此致、Kim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kim:

    感谢您提供详细信息。

    我检查了实现,你是对的。
    遗憾的是、 %d/%i 的格式限制为正值。

    此致、
    Theo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Theo:

    感谢您确认%d/%i格式限制。 了解我对实施细节的理解是否正确很有帮助。

    如您所知、这种限制意味着、Log_printf由于uintptr_t在上进行转换、通过发送的负有符号整数将有效地作为大无符号数发送 固件端

    我现在的关键问题是关于 在主机端处理该问题的预期策略、尤其是使用该tilogger工具。

    • 鉴于此固件限制、是否tilogger应该执行必要的转换(例如,当格式说明符为或时,将接收到的值重新解释为有符号整数)uintptr_t%d%i
    • 或者是否有不同的推荐方法、或许有一种具体的方法在将负值传递到固件端之前在固件端准备负值Log_printf(类似于我之前提到的 RSSI 权变措施)?

    理解这一点有助于我们确定在日志中显示准确的有符号整数值的正确路径。

    我还有关于tilogger此日志记录框架中的功能的几个相关问题:

    1. 字符串格式说明符 ()%s是否tilogger计划支持%s格式说明符? 我从文档中的理解是、Log_printf会向目标上的字符串地址发送一个指针。 如果是、tilogger可能需要一种机制来取消对此指针的引用(例如,通过调试器连接读取目标存储器)以显示字符串内容。
    2. ELF文件使用情况: tilogger需要.out文件进行日志解码。 对于旨在限制敏感信息暴露的发行版、我们计划使用objcopy创建一个.out仅包含.log_data.log_ptr部分的精简文件。 将tilogger能够使用这样的最小化.out文件正确解析日志、还是需要完整的调试.out文件?

    希望就这些问题提供任何指导。

    此致、Kim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kim:

    解析由 Python 工具完成。 它使用从目标 MCU 发送的值填充调试语句、而在这个解析步骤中是一个限制。
    您可以在 SDK-dir\tools\log\tiutils\core\tilogger\中遵循 logger.py


    相反,您需要为元组中的变量指定不同的类型,以不同的方式对它们进行解析。

    最简单的方法可能是将 RSSI 值转换为正标度。

    此致、
    Theo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Theo:

    再次感谢您澄清%d/的解析限制%i位于 Pythontilogger 工具中,这logger.py是需要研究的相关文件。 这真的很有帮助。

    按照您的指导、我一直在尝试进行修改logger.pyuintptr_t%d、以便在%i使用或格式说明符时正确地将值解释为有符号整数。

    我已将当前logger.py文件与我尝试的修改附加在一起。  

    我的目标是将接收到的无符号 32 位值转换回有符号 32 位整数,例如,转换42949671950xFFFFFF9B成无符号 32 位整数-101。 我的通用 Python 方法用于这种用途struct.unpack('<l', struct.pack('<L', received_unsigned_value))[0],它是孤立的。

    然而,我发现很难将这个强大的整合到logger.py的现有解析逻辑%d,以正确地处理基于格式字符串 (,%i) 的所有情况。 具体来说、我遇到了 简要描述您遇到的问题、例如“确定解析循环中应用转换的位置“、“确保从.out文件的元数据应用正确的变量类型“或“处理应为负数的非常大的无符号数的边缘情况“。 ]。

    您能否提供更具体的指导、或者举例说明应如何在logger.py的上下文中应用此转换以确保正确的有符号整数解释?


    关于tilogger能力的其他问题

    我还有关于tilogger此日志记录框架中更广泛的功能的几个相关问题:

    • 字符串格式说明符 ()%s是否tilogger计划支持%s格式说明符? 我的理解是,Log_printf向目标上的字符串地址发送一个指针,因此tilogger可能需要一个机制来取消引用。
    • 最小化的ELF文件使用情况: tilogger需要.out文件进行日志解码。 对于旨在限制敏感信息暴露的发行版、我们计划使用objcopy创建一个.out仅包含.log_data.log_ptr部分的精简文件。 将tilogger能够使用这样的最小化.out文件正确解析日志、还是需要完整的调试.out文件?

    请你继续就这些问题提供指导。

    此致、Kime2e.ti.com/.../tiutils_5F00_fail.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kim:

    是的、您可以按照自述文件(以下相关部分)从.out 文件中删除敏感信息

    ELF 文件规范

    可能会从 elf.out 文件中删除未记录的相关段
    包含敏感信息。 为此、请使用中的实用程序
    用于运行以下相应命令的工具链:

    * GCC
      ```arm-none-eabi-objcopy --only-section=.log_data --only-section=.log_ptr input.out```μ s
    * TICLANG 和 IAR 项目
      ```tiarmobjcopy --only-section=.log_data --only-section=.log_ptr input.out```

    您可以全局提供包含日志字符串信息的 ELF 文件(发送至
    您添加的所有传输)(如果您只有一个设备或设备运行)
    相同的固件、您可以为每次传输提供 ELF 文件。

    不幸的是,我不能为你提供一个解析的例子,但我想你有一个很好的起点。
    %s 格式说明符不受支持、因为日志消息包含在.out 文件中 、且仅发出变量状态。
    一个好的做法是定义在嵌入式端发送不同调试消息的条件。

    此致、
    Theo