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.

[参考译文] TDA4VH-Q1:在 MCU2_0 (J784S4、PSDK RTOS) 上的 OS_START () 之后指令提取中止

Guru**** 2529560 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1549018/tda4vh-q1-instruction-fetch-abort-after-os_start-on-mcu2_0-j784s4-psdk-rtos

器件型号:TDA4VH-Q1
Thread 中讨论的其他器件:TDA4VH

工具/软件:

说明:

我正在 尝试将动态网状网络 组件集成到基于 TDA4VH (J784S4) 的定制 ECU 上的现有系统中。 该系统以前使用了静态网状网络、新的动态实现已经过我们算法团队在非嵌入式环境中的功能验证。

在 MCU2_0 (R5F) 上集成期间、内核在调用 os_start () 后不久崩溃。 执行最终在低级预取中止处理程序中结束、特别是在无限循环中。

此问题仅在集成了新组件时发生。 如果没有它、系统将启动并正常运行。


异常上下文:

  • CPSR = 0x197
  • IFAR = 0x12411CE2
  • IFSR = 0xD
  • DFAR = 0x0
  • DFSR = 0x0

  • IFSR = 0xD 指示由于不可缓存区域上的外部中止而导致指令提取中止。
  • 指令地址 0x12411CE2 似乎无效或未映射。
  • 通过反汇编进行调试不稳定 — 检查崩溃地址会导致调试器中断或挂起。
  • 这强烈建议在调度程序启动后立即进行损坏或无效的函数指针调用。


到目前为止、我检查过的内容:

  • 没有堆栈溢出的迹象 (uxTaskGetStackHighWaterMark()) 或 CPU 过载 (LoadP_getCPULoad())。
  • 我想逐步浏览代码以跟踪导致故障的原因、但降低编译器优化级别(以提高调试可见性)会导致不同的运行时行为、因此我无法在这种情况下重现相同的问题。


工具链:

  • IDE:Code Composer Studio 12.4.0
  • 调试器:Blackhawk XDS560V2


问题:

如何跟踪在 OS_START () 之后触发这种无效执行的原因?
在这样的早期阶段、是否有 TI 推荐的工具或调试策略来识别指令提取中止、尤其是考虑到调试器在故障地址处变得不稳定?

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

    您好、

    此问题仅在集成了新组件时发生。 如果没有它、系统将启动并正常运行。

    此新组件是否会创建任何新任务或线程?

    如何跟踪在 os_start () 之后触发此无效执行的原因?

    我建议在 OS_START () 之后使用 CCS 并在任务中的各个点设置断点,以缓慢缩小发生异常的位置。 如果您到达断点之前的处理程序、则您知道异常发生在断点之前。

    指令地址 0x12411CE2 似乎无效或未映射。

    能否提供程序或二进制文件的映射文件?

    谢谢、

    Neehar

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

    嗨、Neehar、

    非常感谢您的快速答复!

    此新组件是否会创建任何新任务或线程?

    它不会创建任何新任务、而是重复使用以前的任务。

    您能否提供程序或二进制文件的映射文件?

    出于保密原因、我无法在此处上传地图文件、但如果有方法、我只能将其发送给您、这是可能的。

    此外、我将通过在任务中设置断点并在找到更多详细信息后更新此 TT、尝试找到更准确的异常发生位置。

    谢谢您、
    Mo

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

    您好、Mo:

    我已向您发送了一封包含我的信息的电子邮件、您可以将地图文件作为附件提供。

    此外、我将通过在任务中设置断点来尝试找到更准确的异常发生位置、并在找到更多详细信息后更新此 TT。

    我将等待 您的测试结果以及关于例外情况的更多详细信息。

    谢谢、

    Neehar

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

    你好 Neehar、

    首先、对延迟的回复深表歉意。

    我建议使用 CCS 并在 os_start () 之后的任务中的各个点放置断点、以缓慢缩小发生异常的位置。 如果您到达断点之前的处理程序、则表明异常发生在断点之前。

    我通过在所有任务的入口点(包括已创建的和计划创建的任务)设置断点来执行额外的测试。 但是,在 OS_Start() 之后,这些断点都不会被命中。

    我能够更精确地确定崩溃位置: OS_Start () 调用 vTaskStartScheduler (),这将初始化空闲任务和计时器任务。

    然后、在 port_r5f.c(来自 pdk_j784s4_10_01_00_25)中、执行到达 xPortStartScheduler ()、其中 InitTickTimer ()、StartTickTimer () 和 RestoreTaskContext () 按顺序调用。 最后一个调用(供参考,下面代码窗口中的第 22 行)不会返回。 相反、该函数会触发前面提到的预取中止处理程序。

    BaseType_t xPortStartScheduler(void)
    {
        /* Interrupts are turned off in the CPU itself to ensure tick does
         * not execute	while the scheduler is being started.  Interrupts are
         * automatically turned back on in the CPU when the first task starts
         * executing.
         */
        portDISABLE_INTERRUPTS();
    
        #if (configCOPY_RESET_VECTORS==1)
        /* Relocate FreeRTOS Reset Vectors to ATCM*/
        void _freertosresetvectors (void);  
        memcpy((void *)configMCU_ATCM_BASE, (void *)_freertosresetvectors, 0x40);
        #endif
    
        /* Start the ISR handling of the timer that generates the tick ISR. */
        ulPortSchedularRunning = pdTRUE;
    
        prvPortInitTickTimer();
        prvPortStartTickTimer();
        /* Start the first task executing. */
        vPortRestoreTaskContext();
    
        /* Will only get here if vTaskStartScheduler() was called with the CPU in
         * a non-privileged mode or the binary point register was not set to its lowest
         * possible value.  prvTaskExitError() is referenced to prevent a compiler
         * warning about it being defined but not referenced in the case that the user
         * defines their own exit address. */
        ( void ) prvTaskExitError;
    
        return pdTRUE;
    }

    在集成动态网格组件之前不会出现此问题。 您能否提供建议、说明如何进一步缩小根本原因、以便我可以继续进行更有针对性的分析?

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

    您好、Mo:

    感谢您的进一步详细信息、我将更深入地进行研究、并检查接下来最好的调试步骤。

    谢谢、

    Neehar

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

    您好、Mo:

    您能提供有关引导模式的更多信息吗? 此外、您使用的是正确的 FreeRTOS?

    似乎问题出在切换到系统模式时、您能否将这两个应用程序中的 CPSR、SP 和 LR 寄存器与进行比较 没有动态网格零部件?

    谢谢、

    Neehar

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

    你好 Neehar、

    您能否提供有关引导模式的更多信息?

    由于我正在通过 CCS 加载二进制文件、因此正在运行 NOBOOT 模式。 我也可以尝试通过 UART 模式刷写二进制文件、然后在 XSPI 模式下运行 ECU、但在这种情况下、我们的调试能力有限。

    此外、您使用的是正确的 FreeRTOS?

    是的。

    您能否将这两个应用程序中的 CPSR、SP 和 LR 寄存器与进行比较 没有动态网格组件?

    在下表中、您可以找到 这些寄存器值。 我注意到“动态网格-> vPortRestoreTaskContext“ cpsr 值与我创建 TT 时看到的值不同、但结果相同(卡在同一个例外中)。 此外、 在调用 vPortRestoreTaskContext 后、我无法观察到的值、因为该函数不返回。 因此、我不能使用调试器单步切换。 因此、以下“after"值“值是在暂停内核(恢复任务上下文后)后发生的值。 因此我不知道它有多准确或有用。 如果有更好的方法来观察“之后“值、请告诉我。

    静态网格 动态网格

    解决方案

    vPortRestoreTaskContext();

    之后

    vPortRestoreTaskContext();

    解决方案

    vPortRestoreTaskContext();

    之后

    vPortRestoreTaskContext();

    CPSR 0x080001BF 0xA800003F 0x080001BF 0x800001B7
    Sp 0x9FFFFF90 0x9DC8FFA8 0x9FFFFF90 0x9FFFBFD0
    Lr 0x9DE05F47 0x9DDE501D 0x9DE8A3BD 0x9DE9F773

    谢谢您、

    Mo

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

    您好、Mo:

    负责的工程师目前不在办公室。 请预计  响应将延迟 5 个工作日。

    此致、

    Takuma

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

    尊敬的 Takuma:

    感谢您的通知!



    嗨、Neehar、

    我可以询问您是需要更多信息、还是对进一步调试此问题有其他想法?


    谢谢你。



    此致
    Mo

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

    您好、Mo:

    很抱歉耽误您的时间、让我进一步查看您提供的寄存器值。

    谢谢、

    Neehar