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.

[参考译文] TMS320F28377D:CPU2 在双核引导后进入 c2brom_handle_idle_lpm

Guru**** 2585275 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1567368/tms320f28377d-cpu2-enter-into-c2brom_handle_idle_lpm-after-dual-core-boot

器件型号:TMS320F28377D
主题:C2000WARE 中讨论的其他器件

工具/软件:

尊敬的专家:

我的客户遇到双核代码无法执行的问题。

我在 F28379D EVM 上测试双核代码、发现 CPU2 在加载双核代码并对 EVM 重新供电后在 Bootrom 中输入 c2brom_handle_idle_lpm 函数

我检查 RESC 寄存器、CPU1 和 CPU2 的值都是 0xC0000008(我测试我们的双核演示,CPU1 和 CPU2 的值均为 0xC0000000)。 但是、我检查了 NMISHDFLG、CPU1 和 CPU2 的值均为 0x0。

我在 cmd 文件中查看 CPU2

客户的 cmd 文件缺少一些对齐(左侧:客户;右侧:客户)

对此问题有何建议?

谢谢、

Leo

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

    Leo、

    专家将在本周剩余时间内离职、并在他们返回时尽快回复您。 谢谢你。

    此致、

    Aishwarya

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

    尊敬的  Aishwarya:

    明白。

    下面是可以在 28379D EVM 上重现问题的测试演示: tidrive.itg.ti.com/.../d28b6c9a-8a95-4baa-ab2a-5acdb61f4094

    CRH 中的工程是 CPU1 的代码、bootloader2 中的工程是 CPU2 的代码。 对于 CPU1 的代码、您需要将 BEGIN 区域更改为 0x80000(您可以参阅我在软件包中添加的 cmd 文件)。

    谢谢、

    Leo

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

    嗨、Leo、

    请留出 1-2 天时间来评估所提供的信息。 感谢您的耐心。

    此致、

    Allison

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

    嗨、Leo、

    您能否私下与我分享此问题的客户是谁?  

    此致、

    Allison

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

    嗨、Leo、

    感谢您的耐心。 我一直在尝试解决工程中的文件 include 和内存错误、但想问一下、您能否仔细检查加载到 TI 驱动器中的内容是否仍然会编译并为您生成.out? CRH1_ALGORITHOD 工程在尝试编译时遇到问题。 首先、由于缺少 MVB src 文件中的头文件、一旦我解析这些文件、就没有为工程分配足够的内存来进行构建。

    RESC 寄存器指示器件已通过 NMI 看门狗复位进行复位、这意味着发生了错误并且在 WD 复位时间之前尚未解决;但是、NMISHDAFLAG 寄存器显示未设置任何标志。  

    您能尝试在代码中实现正确的 NMI 处理程序吗? 您可以为看门狗启用 NMI 中断。 然后、在 NMI 处理程序中、确保为 NMI 看门狗计时器提供服务、检查闪存 ECC 寄存器是否存在潜在的错误、或实现其他错误处理。

    例如、发生 FLUNCERR 时、代码应进入 NMI 处理程序。 NMI 处理程序可以继续对 NMI 看门狗进行维护、以便不发生复位、并且它们可以通过调试器连接到器件并调查正在发生的情况。 或者、如果存在外部记录机制、NMI 处理程序可以使用该机制发送从系统寄存器读取的详细信息。  我们首先要看到的是哪个闪存地址触发了不可纠正的错误。

    此致、

    Allison

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

    尊敬的  Allison:

    您可以参阅我在软件包中添加的 cmd 文件来构建 CPU1 工程

    谢谢、

    Leo

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

    嗨、Leo、

    cmd 文件中是否有任何变化? 我没有看到任何更新、但如果错过、请告诉我。 此外、您是否能够实现 NMI 处理程序?

    此致、

    Allison

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

    尊敬的  Allison:

    我将尝试在自己这边添加 NMI 处理程序。

    您可以将工程“CRH1_ALGORITHORITH"加“加载到工作区中、并直接在我之前分享的 demo.7z 中编译它。

    软件版本如下:

    CCS 12.8.

    C2000ware v5.4

    唯一的问题是 CRH1_ALGORITHM_cmd 文件中的开始地址为 0x84000。 (由于 CRH1_ALGORITHOD 是应用代码、用户需要引导加载程序代码来执行 CRH1_ALGORITHOD 应用代码、您可以使用我在演示文件夹中添加的 cmd 文件将起始地址更改为 0x80000)

     

    谢谢、

    Leo

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

    嗨、Leo、

    抱歉、我需要另外一天的时间来查看此内容、因为当我尝试从开箱中构建时、您分享的初始项目显示错误。

    此致、

    Allison

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

    嗨、Leo、

    客户是否已尝试添加对齐?  我认为 CPU2 闪存链接器 CMD 中缺少的对齐指令导致了问题。 我在演示示例中仍然看到缺少它们。 例如、在 F2837xD/flash_lnk_CPU2.cmd 中:

    我认为第 66-75 行缺少对齐:

    .cinit   :> FLASHA PAGE = 0、ALIGN(8)  ✓正常
    .text   :>> FLASHA | FLASHB PAGE = 0  ✗缺少对齐
    codestart :> begin page = 0
    .stack   :> RAMM1 PAGE = 1        ✗缺少对齐
    ExitBoot  :> FLASHA PAGE = 0
    .switch  :> FLASHA page = 0        ✗缺少对齐

    这可能会导致 NMI 看门狗复位 (RESC = 0xC0000008)。 启动期间:

    1. 未对齐的.text 段→CPU2 bootROM 在 0x080000 处加载闪存代码
    2. 代码或数据未正确与 16 位(或 8 字)边界对齐
    3. 在 CPU2 初始化期间、处理器会遇到未对齐的获取/访问
    4. 这会触发 NMI 看门狗超时 (RESC 寄存器中的位 3)
    5. CPU2 复位、bootROM 检测看门狗复位条件
    6. BootROM 会进入 c2brom_handle_idle_lpm、而不是运行您的代码

    请确保 修改 demo\bootloader2\cmd\2837xD_flash_lnk_CPU2.cmd 以添加对齐。 例如、
    .cinit  :> FLASHA PAGE = 0、ALIGN(8)
    .text   :>> FLASHA | FLASHB PAGE = 0、ALIGN(8)
    codestart:> Begin page = 0, align(8)
    .Scheduler:> Scheduler_addr page = 0、align (8)
    .stack  :> RAMM1 PAGE = 1, align(8)
    ExitBoot :> FLASHA page = 0, align(8)
    .switch  :> FLASHA page = 0、align(8)

    我还在 Initialize.c 中看到、CPU1 代码中注释了“Start_CPU2 ()“、那么 CPU2 是否应该在上电时从闪存自主引导?

    您能否实现它并告诉我 RESC 寄存器值是否为  0xC0000000

    此致、

    Allison