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.

[参考译文] RTOS/66AK2G02:如何创建我自己的 UIA 消费者?

Guru**** 2589225 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/591486/rtos-66ak2g02-how-to-create-my-own-uia-consumer

器件型号:66AK2G02
主题中讨论的其他器件:DA8XX

工具/软件:TI-RTOS

我们编写了自己的代码来检索 log_printf()缓冲区,而不在我们当前的 L137/DA8xx 产品中使用 CCS。  我想在 K2G 上执行同样的操作。  

我看到 UIA 现在已得到更全面的部署,对 log_printf()的后继路由器也以一些好的方式进行了开发。  在我看来、UIA 支持消费者的概念、实现这一概念的正确方法是编写我自己的消费者。

我在 keystone-rtos-traceframework git 存储库中找到 traceframework .c/h 文件。  但我在处理器 SDK 或 UIA 中看不到这种情况。  您能建议我应该如何构建这样的项目吗?  这些函数是否在我缺少的发布包中分发?  或者、我应该从 git 存储库中跟踪它们吗?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    按使用者,您是要编写解释日志记录的主机代码吗? 基本上是 CCS 中的系统分析仪的替代产品?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的。 在我的现有 L137系统上、ARM 可以从 DSP 请求跟踪缓冲器并将其解释为显示。 它会查找输出文件中的字符串。 我们认为这是一个必要的功能。 在新系统中、我看到 UIA 具有此功能。 我希望从 DSP 中获取原始缓冲器、并将其与我自己的构造工具共享、该工具可以查找字符串并打印它们。 我还想将此功能扩展到任务开关跟踪。 为此、我最想使用合适的 UIA 接口。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您也可以使用 UIA 执行此操作。 您是否只是从目标中提取日志缓冲区? 如果是,则需要使用 LoggerStopmode。 您需要学习两个关键的数据结构。

    ti.uia.runtime.EventHdr:这说明了每个日志记录的内容。
    ti.uia.runtime.UIAPacket:这描述了缓冲器的前端。 注意:对于 UIA、也有从主机到目标的命令。 不过,这不适用于 LoggerStopmode,只是为了避免混淆而进行的准备工作。

    CDOC (或 XDC 文件)对缓冲区中的不同字段进行了说明
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    指向 UIA 软件包中 CDOC 目录的指针看起来非常有用。 谢谢。
    你没有说过我不应该尝试这样做。 但您尚未回答我关于消费类 API 的问题。
    我可以在 git repo 中看到 consumer.h、但在 UIA 封装中看不到。 您能帮助我了解断开连接吗? 有没有任何好的示例可以从开始?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我快速看了一下 Git repo。 这是由器件团队完成的(我在 TI-RTOS 团队中)。 我要将此主题移至器件论坛、因为他们可能具有我不知道的 UIA 内容(就像他们在日志中所做的那样)。

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

    当您寻找具有专业知识的人时、我会做更多的解释。

    假设 DSP 代码构建为具有一个用于 log_printf 的1k 入口循环缓冲区。  这是在.cfg 文件中配置的。  这意味着存储器中存在一个由1k 个条目组成的块。  我们在 L137/DA8xx 上完成了所有这些工作。  我们能够找到指向该数据块的指针。  我们知道它的结构。  我们可以在任何时候抓取内容并对其进行解码。  每个条目在控制字符串和参数的输出文件中都有一个偏移量。

    现在、我想在 K2G 上执行同样的操作。  Todd 推荐了 UIA CDOC 中的方法。  这些是通过.cfg 文件构建的宏在我的代码中调用的。  我看到"metaonly struct LoggerStopMode.RecordView"、它似乎描述了缓冲区中写入的内容。  我必须猜测哪个条目会转换为字符串的输出文件中的偏移量、但我可以这么做。  一般而言、我需要混响进行工程、因为我看不到用于提取缓冲区的 API。  但有一些指导。  

    相比之下、"keystone-rtos-traceframework "描述了这种生产者/使用者关系。  我想成为消费者。  但缓冲器结构仍由 UIA 定义。

    因此、我可以看到我的问题的三个可能答案。

    1. TI 不支持这一点、您可以自行解决。
    2. 按照所述使用 UIA API。  一个很好的例子是????
    3. 使用 KeyStone-RTOS-traceframework 中的生产者/使用者模型。  一个很好的例子是????

    如果这是我们能做的最好的事情、我对(1)感到满意。  我只是想确保我不会留下一个更好的选择"在桌面上"。

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

    第一。 您可以使用 CBOC for UIAPPacket 和 EventHdr 查看标题的布局、以帮助编写解码代码。 例如、每条记录都以此为起点

    缓冲区的起始位置是 UIAPPIT_HDR。  注意:这都是假设您在 UIA 中使用 LoggerStopMode。

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的解释是,我应该像过去那样做。 无需花哨的新 API。 逆向工程。 我使用 ARM 上的调试器进行了研究。 我可以将其中的一些内容映射到 UIAPPAPPAPCAPPEH 类型、如所述。 谢谢、我们可以关闭这个。

    对于其他人、这就是我使用此测试代码看到的内容:
    Log_info0 ("\n 程序启动。");
    log_info1 ("Log_info1 %d."、47);
    log_info2 ("Log_info2 %d %d."、100、102);
    log_info3 ("Log_info3 %d %d %d %d."、1、2、3);
    log_info4 ("Log_info4 %d %d %d %d %d %d %d %d %d %d."、4、3、2、1);
    log_info5 ("Log_info5 %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d "、10、9、8、7、 6);

    我可以看到日志缓冲区位于中
    TI_UIA_loggers_LoggerStopMode_Instance_State_1_packetArray_A

    缓冲区开始处有4个32位字。 然后、每个条目为8 (write4)或12 (write8) 12 32位字。
    字8数据包用于 Log_info0()和 Log_Info1()。 12字数据包用于更大的日志功能。

    系统每次写入9或13个字、然后备份并覆盖最后一个字。
    您可以在 ti_uIA_loggers_LoggerStopMode_write8__E ()中的注释中看到这一点:
    > /*
    > *存储一个包含刚刚写入的事件长度的空事件标头
    > *以允许主机读取
    > *部分写入的数据包中的安全事件
    > *

    字[0]是标头。
    空标头以0x4000xxxx 开头。
    无 args 的8字块以0x502000xx 开头。
    具有一个参数的8字块、以0x502004xx 开头。
    12个字块以0x503006xx 开头。
    标头的低字节明显递增。
    字[1]是时间戳? 它每次递增几百个十六进制。
    字[2]是时间戳的高字吗?
    字[3]在每种情况下都是相同的。 0x15d28009。
    字[4]是字符串表开头的地址。
    字[5]是一个计数器、每次递增1、但不从零开始、(0x91、92、93、94、 95)
    字[6]是存储器中字符串的地址。
    字[7]、[8]、[9]、[10]和[11]是参数(在12字数据包中最多5个)。