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.

[参考译文] CC1352R:如何将任务呼叫堆栈保存到调试监视器

Guru**** 2553450 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1092237/cc1352r-how-to-save-task-call-stacks-to-debug-watchdog

部件号:CC1352R

您好,

 运行TI RTOS的CC1352偶尔会被现场看门狗重置。 我们必须有一个错误,它会锁定负责清除看门狗的任务。

如果我们能够在实验室中重现此信息,我们可以通过JTAG连接并使用运行时对象查看器(ROV)来检查 调用栈中是否存在问题任务。
遗憾的是,我们很难重现此问题,因此我们希望在现场为我们的设备添加更多日志记录。

ROV使用什么数据来显示每个RTOS任务的调用栈? 从我们的应用程序访问此数据以便将其保存到外部闪存的最佳方式是什么?


我在TI代表提供以下建议的相关帖子中找到:

看门狗到期时,看门狗驱动程序不存储任何数据。 您可以使用本文中的指导在复位时将数据存储在应急缓冲区中:
e2e.ti.com/.../198.2253万

不幸的是,这种联系已经死了。 您能否提供任何有关将数据存储在"应急缓冲区"(如 所述的帖子)中的说明?

谢谢!

彼得

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

    我注意到,到旧E2E线程的某些链接无法正常工作。 地址中似乎添加了一个额外的号码。 您 正在寻找的是e2e.ti.com/.../cc2640-write-to-the-flash-from-hwi-thread这2640这一主题吗? 通常,由于闪存访问非常耗时,因此在您设法存储数据之前,您可能会面临执行监视程序重置的风险,因此存储数据可能会很困难。

    您能否描述您保持看门狗活动和(理想情况下)不超时的设置? 您在生产装置上还有哪些其他输出方法?您是否有LED,UART,SPI?

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

    是的,这看起来 是正确的线程! 谢谢你。
    根据Aslak N.在该对话中发表的帖子,每个的堆栈指针(SP)Task_Object存储在 context变量中。 程序计数器(PC)如何?  如何确定每项任务的PC值?

    我要保存每个任务的PC,SP和LR寄存器,以便可以按照 使用“寄存器”视图 在CCS中对异常转储进行解码所述将它们加载到CCS中:e2e.ti.com/.../faq-how-do-i-trace-backward-to-the-code-that-caused-an-exception-in-my-ti-rtos-app 

    我已经设置了代码,以便在监视程序触发时将日志消息写入外部闪存。 我只需要知道从哪里获取每个任务的PC,SP和LR注册信息,以便我了解程序在哪里挂起。

    谢谢!
    彼得

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

    我会让SW专家跟进这一问题。  

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

    您好,Peter,

    我认为没有为该任务存储SP的任何变量。  以下是Task.h中任务结构的TI-RTOS7定义:

    struct Task_Struct {
        Queue_Elem qElem;
        Queue_Elem objElem;
        char * name;
        volatile int priority;
        unsigned int mask;
        void * context;
        Task_Mode mode;
        Task_PendElem *pendElem;
        size_t stackSize;
        char *stack;
        IHeap_Handle stackHeap;
        Task_FuncPtr fxn;
        uintptr_t arg0;
        uintptr_t arg1;
        void * env;
        void * *hookEnv;
        bool vitalTaskFlag;
        Queue_Handle readyQ;
        uint32_t checkValue;
        void * tls;
    };

    谢谢,

    Marie H

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

    ROV如何显示每个任务的回溯? 它必须从RAM中读取每个任务的状态,对吗?

    无论ROV使用什么信息为每个任务生成这些程序计数器(PC)值,这都是我想要保存的内容。 请告诉我此信息的存储位置。

    谢谢!
    彼得

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

    您好,

    我将向ROV专家上报此事,以获得更多见解。 我将在收到任何更新时予以传递

    谢谢

    KI

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

    我仍在等待反馈。 感谢您的耐心等待。

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

    我从工程部获得了更多细节。

    ROV如何404.7235万如何显示每个任务的回溯? 它必须从RAM中读取每个任务的状态,正确吗?[/QUET]

    您的假设是正确的,因为数据是从RAM读取的。

    SP指针存储在Task_stat数据结构中。  

     在栈中行走以构建函数调用可能不是那么简单

    更多详细信息应记录在TI-RTOS用户指南中

    希望这有所帮助

    KI