Other Parts Discussed in Thread: TMS320F28379D, SYSCONFIG
器件型号: LAUNCHXL-F28379D
Thread 中讨论的其他器件: TMS320F28379D、 SysConfig
我正在 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 中断信令(非单次触发)。
如果您对此用例有任何参考示例或推荐的初始化序列、我非常感激。
感谢您的时间和支持。