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 板上、我有一个自定义 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。
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 (当不从闪存引导时):
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)
谢谢!
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