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:内核之间共享 GS 内存的问题

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1034654/tms320f28379d-problem-with-shared-gs-memory-between-cores

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

您好!

我正在尝试在 core1上创建一个数组、为 core2使用 r/w 和 r/o。 另一个方向的数组。 它运行、我可以使用调试器修改存储器、但两个内核在运行时不会修改存储器。

在两个链接器脚本中、我都具有:

CPU1TOCPU2_GS:> RAMGS8,ALIG(4)
CPU2TOCPU1_GS:> RAMGS9,ALIG(4)

在内核1中、我具有:

uint32_t CPU1_TO_CPU2_Array[128]={0U};
#pragma DATA_SECTION (CPU1_TO_CPU2_Array、"CPU1TOCPU2_Gs");
uint32_t CPU2_TO_CPU1_Array[128]={0U};
#pragma DATA_SECTION (CPU2_TO_CPU1_Array、"CPU2TOCPU1_Gs");

然后在计时器中断中:

  CPU1_TO_CPU2_Array[0]++;

core2中的类似内容、用于使   CPU2_TO_CPU1_Array[0]递增

在内核1中、我还尝试初始化和配置存储器:

MemCfg_initSecions (MEMCFG_Sect_GS8 | MEMCFG_Sect_GS8);
while (MemCfg_getInitStatus (MEMCFG_sect_GS8)!= 1);

MemCfg_setGSRAMMasterSel (MEMCFG_Sect_GS9、MEMCFG_GSRAMMASTER_CPU2);

/*  也尝试了,
EALLOW;
MemCfgRegs.GSxMSEL.bit.MSEL_GS8 = 0;// CPU1可以读取/写入;CPU2只能读取
MemCfgRegs.GSxMSEL.bit.MSEL_GS9 = 1;// CPU2可以读取/写入;CPU1只能读取
EDIS;
while (!((MemCfgRegs.GSxMSEL.bit.MSEL_GS9 = 1 && MemCfgRegs.GSxMSEL.bit.MSEL_GS8 = 0));
*

许多排列都是相同的结果。 调试器工作正常、程序不会修改存储器。 有什么想法、我会错过什么?  

谢谢

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

    Ken、

    感谢您访问 C2000 E2E 论坛。  调试器可能正在使用不同的访问路径、该路径绕过所有权信标、因此这将解释您认为该路径有效的原因(我需要对此进行仔细检查)。

    就代码而言、这对我来说也是正确的、唯一需要修改的是 CPU1侧的 MSEL、正如您所做的那样。

    我还要确保在 CPU2中具有相同的"while"语句、以在使用 MSEL 位之前寻找要解析的 MSEL 位。

    我们在 driverlib 中的 C2000Ware 中提供了 RAM 控制示例、并在此处提供了示例:

    C:\ti\c2000Ware_3_04_00_00\driverlib\f2837xd\examples\dual\ram (driverlib)

    C:\ti\c2000Ware_3_04_00_00\device_support\f2837xd\examples\dual\RAM_management (位字段样式)

    我建议构建这些项目中的任何一个、并确保这些项目能够正确地满足您的目标。  我们可以回溯并查看这与您的代码之间是否存在任何其他不明显的差异(器件信息等)。

    最棒的

    Matthew

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

    我发现了两个问题、我的问题得到了解决。

    首先、我从双轴项目开始、该项目必须基于不同的 C2000。 对于 F28379D、链接器文件中的存储器映射有一些细微的差异。 我的程序对于通用 CMD 文件来说太大、但在修复存储器区域后、我可以绕过这些段并使其正常工作。 我发现有时我没有收到错误、但如果.data 和.sysmem 等段中没有足够的空间、它将无法运行。 这可能会使用一些改进或更好的方法来确保事情合适(请告诉我是否有这样的事情)

    第二个错误是针对 core2、我的程序对于 RAMLS 来说太大、因此我使用了 core1未使用的 RAMGS。 我没有意识到 core1还必须为 core2用于.text 段的任何 RAMGS 段设置 MemCfgRegs.GSxMSEL.bit.MSEL_GSx 位(即不仅仅是用于数据的内容、也是用于执行的内容)。 然后确保在 core2尝试运行之前设置此项。 一旦我从 JTAG 切换到闪存、我不确定这将如何工作。

    对于 core2、哪些段必须为非 GS RAM 才能运行到足以等待 MSEL 状态?

    谢谢

    Ken

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

    Ken、

    感谢更新;我知道.ebss 和.const 段链接器会抛出错误、但我需要查看.data/.sysmem 段是否也是如此。  从您的帖子中、它听起来像是在构建和加载、但由于内存不足、代码会进入到工作簿中。 这些段的大小是静态的、对吧?  我知道、我们使用栈等变量来运行、如果在返回之前有太多调用、这些变量可能会溢出。  我们在 CCS 中提供了一些内存分析工具来帮助 ID 堆栈的使用、但这将是编译后运行/。

    对于 CPU2、由于您将从闪存引导、因此您只需等待 MSEL 那些需要在运行前复制到 GS RAM 的段。  考虑到这一点、我们从闪存复制到 RAM 的唯一原因是利用 RAM 提供的闪存更快的访问时间/更少的 WS、因此我们可能只讨论应用代码与设置/初始化类型代码。  我要说的是、让闪存代码负责所有内务处理类型的函数(WD 禁用、设置 PLL 等)、然后在所有这些之后检查 MSEL、这样您就不会浪费时间。   

    请告诉我上述内容是否需要进一步澄清。

    最棒的

    Matthew