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.

[参考译文] LAUNCHXL-F28379D:F28379D 双核独立启动放大器;IPC 同步问题(标志未清除/单次触发中断行为)

Guru**** 2874030 points

Other Parts Discussed in Thread: TMS320F28379D, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1631010/launchxl-f28379d-f28379d-dual-core-standalone-boot-ipc-sync-issues-flags-not-clearing-one-shot-interrupt-behavior

器件型号: LAUNCHXL-F28379D
Thread 中讨论的其他器件: TMS320F28379DSysConfig

我正在 TMS320F28379D (LAUNCHXL_F28379D) 上开发双核应用、因此我经常会遇到独立启动以及 CPU1 和 CPU2 之间的 IPC 通信问题。 请注意、以前连接了调试时、这一切都能正常工作。  (调试 CPU1、连接到 CPU2、将固件加载到 CPU2 等)

摘要:

IPC 中断仅有效一次

CPU2 发送 IPC 标志 (Flag1)。

CPU1 ISR 首次正确触发。

之后、CPU2 在以下位置永久阻止:

while (IPC_isFlagBusyLtoR(...))

这表示从未清除/释放该标志以供重复使用。

ipc_sync() 挂起

引入IPC_sync()(使用 FLAG31)时、两个内核会无限期挂起。

这表明一个内核未到达同步点、或者握手被中断。

调试和独立闪存的行为不同

之前、IPC + SYNC 在调试 (CCS) 中工作。

移动到独立闪存启动后、行为中断:

IPC 变成了一次性触发

同步挂起

CPU2 显示为部分活动(计时器/SCI 活动)、但同步失败。

观察结果:

SR 执行一次、但后续的 IPC 标志一直处于繁忙状态。

IPC_ackFlagRtoL()转到 ISR 的顶部不能解决问题。

删除所有 ISR 逻辑(仅 ACK ISR)仍会导致单次触发行为。

从 FLAG0→FLAG1 切换不会更改行为。

IPC_init()在两个内核上添加不会解析该问题。

使用IPC_sync()会导致两个内核挂起(可能一个内核从未达到同步)。

CPU2 SysConfig 包含:

SCIA 设置(带中断)

计时器中断

IPC 标志 (Flag1 + FLAG31)

CPU1 SysConfig 包括:

INT1 的 IPC 中断使能

用于 SYNC 的 FLAG31 处理程序

内核之间的 IPC SysConfig 配置不对称。

我已经尝试过的:

更改 IPC 标志 (FLAG0→FLAG1)

在 ISR 中移动 ack 顺序

将 ISR 最小化至仅 ACK

会同时添加多个模块 IPC_init()

重新排序初始化(启动之前/之后的 IPC,中断等)

介绍/删除 IPC_sync()

验证 CPU2 端的标志繁忙状态

确保共享邮箱为 volatile

比较调试和独立行为

目标:

CPU1→CPU2 引导、具有工作IPC_sync()握手机制。 然后可重复的 CPU2→CPU1 中断信令(非单次触发)。

如果您对此用例有任何参考示例或推荐的初始化序列、我非常感激。

感谢您的时间和支持。

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

    您好 Christopher、

    感谢您的提问。 对迟来的答复表示歉意。

    问题是 CPU2 未在独立模式下正确引导

    您描述的每一个症状(一次性 IPC,挂起,标记卡在忙)都IPC_sync()将追溯到一个根本原因: 在独立闪存引导中、CPU1 必须通过 IPC 命令显式引导 CPU2 到引导 ROM 。 调试器在 CCS 中以静默方式处理此问题、这就是之前一切都正常工作的原因。 没有它, CPU2 要么卡在其引导 ROM 的“等待引导“状态或部分初始化,这意味着它永远不会完全到达您的应用程序代码,无法参与可重复的 IPC 握手。

    1.添加 Device_bootCPU2()#ifdef _STANDALONE

    在独立模式下、CPU1 的引导 ROM 充当主器件、仅负责将 CPU2 释放出复位状态并指示其引导序列。 CPU1main() 必须包含:

    设备初始化 ();

    #ifdef _standalone
    DEVICE_BOOTCPU2 (C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
    #endif

    device_initGPIO();
    BOARD_INIT ();
    interrupt_initModule();
    Interrupt_initVectorTable();
    严重问题: Device_bootCPU2()必须被调用 之后立即更新 Device_init()解决方案 Interrupt_initVectorTable()。 将其放在稍后会使 FLAG31 处于高电平状态IPC_sync(). 、该状态还会永久阻止#ifdef _STANDALONE该调用、必须绕过该调用—在连接调试器Device_bootCPU2()的情况下调用该调用会导致无限挂起、因为 CCS 会绕过等待的引导 ROM 握手。

    2.定义_STANDALONE_FLASH作为预定义符号

    中的一个 CPU1 工程 Build settings (CCS→Project Properties→C2000 Compiler→Predefined Symbols)、添加:

    • _STANDALONE
    • _FLASH

    完成更正后的初始化序列

    CPU1 main()

    设备初始化 ();

    #ifdef _standalone
    DEVICE_BOOTCPU2 (C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
    #endif

    device_initGPIO();
    BOARD_INIT ();
    interrupt_initModule();
    Interrupt_initVectorTable();

    IPC_clearFlagLtoR (IPC_CPU1_L_CPU2_R、IPC_FLAG_ALL);//清除过时标志
    IPC_SYNC (IPC_CPU1_L_CPU2_R、IPC_FLAG31);//与 CPU2 同步

    EINT;
    ERTM;
    //应用程序循环

    CPU2 main()

    设备初始化 ();
    device_initGPIO();

    IPC_SYNC (IPC_CPU2_L_CPU1_R、IPC_FLAG31);//等待 CPU1 外设分配
    Board_init ();//同步后安全
    interrupt_initModule();
    Interrupt_initVectorTable();

    EINT;
    ERTM;
    //应用程序循环—CPU2 现在可以重复发送 IPC 标志
    您能像这样尝试一下吗、让我知道它是否适合您?

    谢谢、
    IRA