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.

[参考译文] CC3220SF:脱机存储(UART)日志以供后续调试

Guru**** 2587365 points
Other Parts Discussed in Thread: CC3220SF

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/858220/cc3220sf-store-uart-logs-offline-for-later-debugging

器件型号:CC3220SF

尊敬的 TI:

我有一个在 CC3220MODASF 器件上自定义 PCB 上运行的应用程序。 到目前为止、它主要用于易于访问器件的开发环境。 这些器件在大部分时间似乎工作正常、但在长时间运行时仍会出现一些不稳定情况(它们突然无响应、需要复位)。  在某些情况下(例如、没有互联网或服务器连接丢失)、我已经使用(软配置)看门狗计时器、该计时器将在一段时间后重置器件、但显然仍存在一些状态/情况、其中器件停止工作/崩溃。

主要问题是、我不知道它们没有响应的原因。 一个原因可能是内存泄漏导致器件内存耗尽、导致器件无响应。 这是我应该能够使用 CCS 上的"Runtime Object View"工具进行分析的结果、即使时间更短。 我计划执行此操作、但我还想分析器件的最后一次执行/(UART)打印语句、以检查它正在执行什么操作来查找崩溃的原因。 但是、只有在应用程序实际崩溃之前连接调试器件、才能完成此操作。 实际上、这是不可行的、因为"崩溃"太少了、所以我正在寻找其他方案。 我已经研究过通过 MQTT 进行日志记录、但问题是需要通过互联网连接才能进行日志记录。

我现在可以想到的最稳定的方法是将日志存储到设备本身的持久性文件中。 这样、我就可以从器件存储器中取出崩溃的器件并读出所有数据(但仍然需要弄清楚这是怎么可能的)。 定制 PCB 上的器件当前没有(额外)外部存储、因此在这种情况下、唯一的选择是通过 SFLASH 上的 NWP 进行记录。 但是、我担心(最重要的)最后几个日志在器件崩溃之前可能无法写入。 在这种情况下、使用这种方法根本没有好处。

我找不到能够解决此问题的文档/示例、也找不到存储(UART)日志打印语句以进行监控/分析的可能性、因此我在论坛上询问解决此问题的最佳建议解决方案是什么。

此致、
mj

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

    您好!

    一般而言,您的问题没有合理的解决方案,尤其是在您没有连接其它可以存储此数据的硬件时。

    更改硬故障处理程序是保存硬故障等错误状态信息的常用方法。 在该处理程序内、您将此信息保存到 RAM 中、然后在该过程重新启动 MCU。 启动代码时、您将读取此 RAM、如果有一些有趣的信息、您将永久存储它们。 遗憾的是、由于 ROM 引导加载程序在引导时从安全原因清除了先前的 RAM 内容、因此 CC3220SF 无法使用此方法。

    另一个选项可以用作 XIP (片上)闪存的永久存储部分。 但这将适用于非常有限的数据量。 绝对不是任何类型的 UART 日志。

    使用 sFlash 存储任何类型的日志并不是一个好主意。 因为这种方法会在短时间内损坏您的 sFlash。 请不要忘记、sFlash 具有有限的写入周期数。

    1月

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

    如果您能够捕获异常(例如 Jan 提到的情况)、则可以将相关信息复制到本地闪存(或 SFLASH 上的闪存原始部分)。 由于您只需要最后几条消息、这应该是可以的。

    BR、

    Kobi  

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

    尊敬的 Jan 和 Kobi:

    感谢您的回复。

    明确一点: 如果器件始终自动重启、那么我对脱机日志记录不是很感兴趣、因此确保重启器件是这里更高(最终)的目标、因此也欢迎使用解决方案(而不是记录此数据的困难)。 我开始本主题是为了了解如何分析这个问题、因为我不知道如何开始调试。

    我在第一个帖子中介绍了解决此问题的第一个想法、因此请存储这些日志以了解崩溃的原因、然后修复该问题。 因此、我不想存储完整的 UART 日志、而只想存储最后几条消息。

    为了存储日志、我在多个可用的 API 中有些迷路、而关于如何捕获(硬件)故障的更多信息。 尤其是在我看来、抓起来有点棘手。 根据我的观察、器件似乎完全崩溃(当我连接它时没有 UART 输出、并且看门狗计时器似乎也不工作)。
    如果没有(更容易)方法来确保重新引导,那么我对日志记录有以下问题:

    1)(如何)我能够捕获硬故障处理程序并存储数据? 因为这是最相关的消息、而且可能是最后几条 UART 线。

    2) 2)与1相关:应使用哪个 API 进行存储? 您有 TI 驱动程序的非易失性存储(NVS)驱动程序和主机驱动程序的文件系统模块。 但是、我是否仍然可以使用来自硬故障处理程序的这些 API?

    3) 3)相关2:使用安全闪存访问:只有 NWP 可以向该存储器写入数据、对吧? 如果 NWP 导致问题、以至于我无法将其写入文件系统、该怎么办?

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

    您好!

    我可以为您提供一些提示和想法、但不能提供完整的解决方案。  实际实施将由您决定。

    • 说明如何在 此处的 TI-RTOS 中使用自己的硬故障(异常)处理程序
    • 存储 UART 日志中的数据需要付出一些努力。 我建议在 RAM 空间中为 循环缓冲器分配空间。 与写入 UART 一起、您将把数据存储到该缓冲区中。 该缓冲区将保存几 KB 的最后 UART printfs/logs。 如果发生硬故障(或可能是 NWP 错误事件)、您将把 RAM 中的值存储到 XIP 闪存(CC3220SF 的芯片闪存)中
    • XIP 是片上并行闪存。  它被分成两组。 如果您的代码不超过512KB、您可以使用第二组存储一些临时数据。  请注意、XIP 闪存与任何其他闪存一样具有有限的写入周期。 从 XIP 闪存读取数据可直接通过指针完成(XIP 闪存是 CC3220SF 地址空间的一部分)。 要进行写入、您需要使用 Driverlib API ( \source\ti\devices\ccc32xx\driverlib\flash.h)。 不能使用 VNS 驱动程序。 有关 XIP 闪存的说明、请参阅 TRM 第21章。
    • 是的。 通过 NWP 完成对 sFlash 的访问。 与 NWP 的通信通过 SimpleLink drvier 完成。  在硬故障处理程序中使用 SimpleLink 驱动程序是绝对不可能的。 这意味着您不能直接在硬故障处理程序将信息保存到 sFlash 中。 但您可以将信息保存到 XIP 闪存中、在全新启动后、您可以将此内容从 XIP 复制到 sFlash 中的真实文件中。

    1月

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

    尊敬的 Jan:

    感谢您的提示。 这绝对有帮助。 我还建议其他人进一步了解 TI-RTOS 系统模块、因为大量现有功能可以帮助您实现目标。 您可以在“文档”下找到 SDK 中包含的更多信息(例如: dev.ti.com/.../node )

    例如、我认为具有 LoggerStream2模块的 LoggingSetup 模块将有助于实现/使用 Jan 建议的循环缓冲器、因为它允许用户定义的处理程序。

    我现在暂不考虑跟踪 UART 日志、因为现在其他内容的优先级更高。
    但是、我确实遇到了 TI 的"Flight Recorder"教程、其中包含 LoggerStreamer 的早期版本: http://processors.wiki.ti.com/index.php/System_Analyzer_Tutorial_5A

    那么、现在我还有一个问题。 在 HWI 错误的情况下、我成功执行了 Hook 函数(使用 printf 语句对其进行了测试)、但是当我尝试使用以下代码从该函数重置我的器件时:

    void hwiExcelHookFunc(){
    PRCMMCUReset (真);
    // map_PRCMHibernateCycleTrigger();
    } 

    器件会断开 JTAG 连接、但不会重启两条线路。 为什么会这样、我如何解决?

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

    您好!

    我不确定为什么在您的情况下 driverlib API 不会重新启动 MCU。  所述的 API 会重启应用 MCU +外设、但不会重启整个 SoC。 如果您需要重新启动整个 MCU、则可以 使用这种方法 (在您的情况下可能没有 sl_Stop())。

    1月

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

    谢谢 Jan 这确实解决了我的问题。