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.

[参考译文] CCS/IWR6843:SBL_imageLoader ()的直接使用:无法将应用程序元从闪存下载到相应的 RAM

Guru**** 2643035 points

Other Parts Discussed in Thread: UNIFLASH

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/888018/ccs-iwr6843-direct-usage-of-sbl_imageloader-fail-to-downloads-the-application-metaimage-from-flash-to-respective-rams

器件型号:IWR6843
主题中讨论的其他器件:UNIFLASH

工具/软件:Code Composer Studio

您好!

我有一个从外设(通过 CAN 总线)接收到的应用固件多核映像(bin 文件)、并通过 QSPI (singleWrite())存储到闪存中。

到目前为止,我们决定不使用 SBL_imageFlasher()。

由于我们开发了自己的 SBL 代码,我尝试直接使用 SBL_imageLoader()函数。

因此我没有使用提供的函数: SBL_initTask()和 SBL_init()。

问题:

按预期由 SBL_imageLoader()正确解析 Metaheader 及其值。

但是、在以下循环中、CCS 调试过程会中止:

/*将 Metaimage 下载到 RAM 中,每块2K */
           对于(loopCnt = 2U;(loopCnt <(numBlocks))&&
                       (g_sblMCB.bufferParserState!= SBL_buffer_parser_completed);loopCnt++)

很难找到中止齿的确切位置,因为我们为什么不使用 UART 来 printf()

我的测试 env 如下所示:

-用于调试的具有 Blackhawk 仿真器的 CCS。

- MMWAVE_SDK_03_02_00_04。

我有什么想法或解决方法?

我使用 SBL_imageLoader()的一般方法是否直接正确?

我非常感谢你的帮助。

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

    您好!

    您能否验证以下代码是否正在正确执行:

    SemaphoreP_POST (gSblMCB.threadCommSem1);
    QSPIFlash_sysDmaRead (qspiFlashHandle、dmaHandle、dmaChan、(rdPtr +索引)、(uint32_t) gSblMCB.currBuff、 SBL_ping_buffer_size / sizeof (uint64_t));
    SemaphoreP_pend (gSblMCB.threadCommSem2、SemaphoreP_WAIT_FOREVER);

    谢谢

    Yogesh

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

    您好!

    在首次执行这3行时不会进行调试中止。

    但是、在循环中多次迭代之后、会发生堕胎。

    很难确定准确的位置。

    使用 CCS 调试"单步执行"或只按"播放"时、会出现不同的行为。

    您对调试方法有什么好的建议吗?

    如何验证这些行是否正确执行?

    谢谢、

    Thorben

     

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

    Thorben、您好!

    您是否在"Debug"窗口中看到任何调用堆栈。  

    谢谢

    Yogesh

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

    您好 Yogesh、

    最后,SBL_imageLoader()正在工作。 返回值正确、因此应将映像下载到 RAM 区域。

    下一个问题是、我尝试保留自己编写的 SBL 代码并启动映像 FW (我希望测量一些硬编码的 CAN 消息以证明 FW 正在运行)。

    作为所提供 SBL.c 代码中的一个示例、它说:

    /*将 SFLASH 中存在的元模型下载到 RAM 中*/
       RetVal = SBL_imageLoader (qspiFlashHandle、(flashAddr +(uint32_t) SBL_METAMIMAGE_OFFSET));

    /*加载成功、清除并恢复中断矢量表*/
       如果(RetVal = 0)
     {
        QSPIFlash_Close (qspiFlashHandle);
       QSPI_Close (gSblMCB.qspiHandle);
       sbl_transportDeinit();
       /*复制 IVT 前禁用中断。 *
       hwip_disable();
       /*复制中断矢量表。 *
       memcpy ((void*)&_appVecs[0]、(void*)&gSblMCB.sblIntVecTable、SBL_vector_table_size);
     }
       /*重置 MSS 内核*/
       SoC_softReset (gSblMCB.socHandle、RetVal);
       BIOS_exit (0);

    在 SOC_softReset()中,通过以下代码发生错误:

     /*配置寄存器以发出 R4F 复位。 *
           ptrSOCDriverMCB->ptrRCMRegs->SOFTRST1 = CSL_FINSR (ptrSOCDriverMCB->ptrRCMRegs->SOFTRST1、7U、0U、0xADU);

    调试过程在该行的执行过程中丢失。

    感谢您的帮助、

    Thorben

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

    Thorben、您好!

     SOC_softReset()将重置器件并开始从 RAM 引导。 您需要加载更新映像的符号、以便能够在软复位后进行调试。

    另请参考 CAN SBL:http://dev.ti.com/tirex/explore/node?node=AIbEoly4B7.jPYk1aCiO-A__AocYeEd__LATEST

    谢谢

    Yogesh

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

    您好 Yogesh、

    感谢您的建议。 我是如何做到这一点的? SDK 中是否提供了任何用于在 SOC_softReset()之前加载"调试符号"的 C 函数?

    如果我正确的话-目标是保持在 CCS 调试 环境中、进入加载的映像?。

    如果我通过 uniflash 工具刷写"自己编写的"SBL 代码、会发生什么情况。 (当前我闪存了"xwr68xx_ccsdebug.bin"以进行 CCS 调试)。

    “自己编写的”SBL 代码是否会在“释放模式”下运行,执行 SOC_softReset()并运行加载的映像?

    感谢您的帮助、

    Thorben

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

    Thorben、您好!

    是的、一旦次级引导加载程序加载了新的元映像、CCS 将无法引用调试符号。

    您不希望加载更新的元映像、因为它已经被执行、因此您只需加载符号即可进行调试。

    这需要在 MSS 软复位后完成。 请参阅随附的图片以供参考:

    CCS 仅用于调试。 通过刷写 SBL 映像、您应该能够看到相同的行为。

    谢谢

    Yogesh