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.

[参考译文] TMS320F28379D:如何自动启动 CPU2应用程序

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1399815/tms320f28379d-how-to-auto-start-cpu2-application

器件型号:TMS320F28379D

工具与软件:

在 TMS320F28379D 板上、我有一个自定义 CAN 引导加载程序、它位于闪存扇区 A 和 B 中、在 CPU1上运行。  引导加载程序的"开始"地址= 0x80000 (在其.cmd 文件中定义)、以便其自动启动。

当引导加载程序启动时、它会等待在 CAN 上接收消息、如果启动、它会使用这些传入的消息内容将我的主应用程序存储在闪存扇区 C-E 中  如果它没有接收到任何 CAN 消息、它会尝试通过调用 runMainApplication ()来自动启动已存储在扇区 C-E 中的主应用程序、其中引导加载程序的.cmd 文件包含:

_runMainApplication = 0x0BFFC0;

主应用程序的"开始"地址= 0xBFFC0 (在其.cmd 文件中定义)。

我想将某些功能从主应用程序(尤其是 ADC 及其 ISR)中分离出来、然后在 CPU2上运行。  但我不确定如何使 CPU2应用程序自动启动。

我猜 CPU2应用程序应该驻留在不同的闪存扇区中、例如 F-H  但是、它的"开始"地址应该是什么?  如果引导加载程序在 CPU1上运行、它将如何启动?  是否需要在 CPU2上运行第二个引导加载程序?

谢谢你

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

    看完"led_ex1_blinky_cpu1"和"led_ext2_blinky_cpu2"示例后、我想我已经回答了自己的问题。

    我想可以在 CPU1上运行一个引导加载程序、从而将 CPU1和 CPU2应用程序加载到不同的闪存扇区中。

    引导加载程序对电路板进行初始化、但未检测到传入的 CAN 消息后、可以通过以下方式启动 CPU2:

    IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);

    它仍然可以通过引用 CPU1"开始"地址的"runMainApplication ()"启动 CPU1应用程序。

    它看起来引导加载程序和 CPU2应用程序的"开始"地址都必须= 0x80000。

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

    这不奏效。  当我尝试从闪存引导时、我的主 CPU1应用程序和 CPU2应用程序都无法自动启动。

    我想在 CPU1上运行的引导加载程序不能具有与 CPU2应用程序相同的"开始"地址?

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

    Diane、

    分配给 CPU1和 CPU2的闪存组在物理上是独立的;虽然 CPU 的本地地址可能相同、但它们并不指相同的物理存储器。  例如、CPU1中的地址0x80000 不一定包含与 CPU2中的0x80000相同的数据。  只需确认 CPU1和 CPU2的闪存引导入口点为0x80000、但每个内核可能有不同的内容。

    现在、正如您提到的、CPU1负责在其启动过程中将 CPU2从复位状态释放、您在 led_blinky_cpu 中看到的 IPC 命令正在执行该操作。  但是、该命令中传递的变量不控制引导模式、而是由 CPU2 OTP 中的 BMODE 值进行处理。  我认为、当 OTP 处于原生/擦除状态时、应该将其引导至闪存、因此您无需执行任何操作、但我想加以区分。  传递的值用于为 CPU2设置 GPIO、以防其引导到自己的串行加载程序等

    您是否能够共享来自 CPU1和 CPU2工程的.map 文件?  我可以查看、以便更好地了解分配任务的位置、从而了解我是否可以发现任何问题。

    此致!

    Matthew

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

    Matthew

    很抱歉、我无法共享.map 文件。

    但是、您说到闪存组在物理上是独立的、这让我认为我不能在 CPU1上运行单个引导加载程序、从而将 CPU1应用程序加载到闪存扇区 C-E、并将 CPU2应用程序加载到闪存扇区 F-H

    我是否需要2个引导加载程序?  我想知道如何使2个引导加载程序(在 CPU1和 CPU2上)都使用相同的 CANA 和 CANB 接口。

    谢谢!

    Diane

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

    现在、当从闪存引导时、此程序可以正常工作。

    我在 CPU1上运行了一个引导加载程序、用于检查传入的 CAN 消息。  当接收到这些帧时、它会将 CPU1应用程序加载到扇区 D-J 中、或将 CPU2应用程序加载到扇区 K-N 中

    我的引导加载程序和 CPU2应用程序的"BEGIN"= 0x80000。  我将 CPU1应用的"BEGIN"移动到0xB7FF0 (位于扇区 J 内)。

    如果我的引导加载程序未检测到任何传入的 CAN 消息、它会首先通过以下方式自动启动 CPU2应用程序:

    IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);

    然后它会通过以下方式自动启动 CPU1应用程序(这不会返回到引导加载程序):

    runMainApplication();

    其中、.cmd 文件将 runMainApplication 定义为 CPU1应用的"BEGIN":

    _runMainApplication = 0x0B7FF0;

    不过、我不确定如何在 Code Composer 中调试 CPU2 (当不从闪存引导时):

    1. 我为 这两个 CPU 创建了调试配置:
    2. 并使其加载两个 CPU1应用程序:
    3. 和 CPU2应用程序:
    4. 而不擦除 CPU1或 CPU2上的任何闪存扇区(因为我的引导加载程序已经加载了两个应用):
    5. 当我开始调试时、CPU1和 CPU2的第一行都暂停、我继续 CPU2
    6. 对于 CPU1、我在脚本控制台中加载一个 JS 文件以跳转到我的引导加载程序的开始(0x80000)、以便允许引导加载程序执行电路板初始化:
    7. script = ScriptingEnvironment.instance()
      debug_server = script.getServer("DebugServer.1")
      debug_server.setConfig("D:/code/EPPS_controller_c2000/CCode/EPPSTargetConfiguration.ccxml")
      debug_session = debug_server.openSession("Texas Instruments XDS100v2 USB Debug Probe_0/C28xx_CPU1")
      debug_session.target.connect()
      debug_session.memory.writeRegister("PC", 0x80000)
    8. 从此处继续调试会话时、CPU1的符号可见、但 CPU2的符号不可见:
    9. 我猜这是因为我的引导加载程序使用 IPCBootCPU2 ()调用重置 CPU2。  是否可以通过某种方法将调试会话连接到已在运行的 CPU2应用程序?

    谢谢!

    Diane

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

    Diane、

    我的鸡巴在她火热的屁眼里滑了下来,我还真是太享受了。

    是否可以用某种方法将调试会话连接到已运行的 CPU2应用程序?

    是的、如果你右键单击 CPU2即可选择弹出的"connect device"选项。  连接后、可以转到"Run-Load Symbols"并再次挑选.out 文件。  您现在应该能够进行调试。

    我不知道为什么设置不起作用、CPU1可能会将 CPU2保持在复位状态。

    针对您之前使用 CPU1加载 CPU2闪存的情况、我们无法直接执行此操作、即 CPU1无法对 CPU2闪存地址进行编程。  不过、我们可以使用共享 RAM (两个 CPU 均可访问)来提供此数据、因此您无需使用独立的 CAN 引导加载程序;即、CPU 1可以接收所有数据、进行引导、然后其部分流程是获取此数据并使用共享 RAM 或 IPC 命令将其推送到 CPU2等

    此致!
    Matthew

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

    Matthew

    感谢您的建议。  我想我将为 CPU2创建第二个引导加载程序。  但是、由于 CPU1引导加载程序和 CPU2引导加载程序无法共享 CAN (我知道我可以切换 CAN 的所有权、但这可能很麻烦)、我认为我将使用共享 RAM 在两个引导加载程序之间进行通信。  该共享 RAM 可用作引导加载程序1的"虚拟"CAN、以将正确的传入 CAN 消息通过管道传递到引导加载程序2。  然后、引导加载程序2可以将传入的.out 加载到 CPU2闪存扇区中。

    Diane