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.

[参考译文] CPU2非零初始化GSRAM

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1088585/non-zero-initialization-of-gsram-by-cpu2

主题中讨论的其他部件:C2000WARE

您好,

抱歉,我不知道这是设备问题还是CCS问题。 我正在使用F2837xD的controlCARD。

问题是我无法从CPU2可靠地将GSRAM中的变量非零初始化。

 

我已经:

  • 在COFF项目的CPU2中声明非零初始化变量。 我别无选择,只能使用COFF,因为在CCP中使用矢量Canape。 这是一个很长的故事。
  • 已将其链接至GSRAM2。

 

单击Restart (重新启动)(由于某种原因需要几次),然后到达main()后,该变量通常不会在CPU2中初始化。 就好像Pinit不起作用。 偶尔我看到它起作用。

 

 如果有人有任何想法,我会非常感谢。

一些具体问题:

 

问题1)

理论上是否可能在GSRAM中的CPU2项目中具有非零初始化变量?

 

问题2)

如果不是,这一切都是合理的。 如果是这样,Pinit在CPU2中的main()之前运行,那么CPU2如何能够对GSRAM具有写入访问权限,以便此时进行初始化?

谢谢你。

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

    e2e.ti.com/.../Non_2D00_Zero_2D00_Init.zip

    PFA我的演示项目出现问题。 变量'counter_GSRAM_CPU2'无法正确初始化。

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

    设置数据写入'counter_GSRAM_CPU2'的监视点后,我可以看到CPU2中的初始化例程没有GSRAM2的所有权,这可能解释了初始化失败的原因。

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

    Kier

    正确,CPU2必须拥有GSxRAM的所有权才能写入/初始化它。  我从TRM获得了以下C/P, 它提供了CPU1需要设置的信号/寄存器的详细信息,以便为CPU2提供此访问权限。

    RAM初始化由相同的信号控制,但您可以在将所有权转移之前使用CPU1进行初始化。

    最佳,
    Matthew

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

    谢谢你。 用户代码当然是这样,但我更广泛的观点是,引导代码在CPU2中不能在GSRAM中进行RAM初始化。 换言之,我认为这是一个错误,至少在COFF形式。 如果这不是一个错误,我认为CPU2无法在TI提供的启动代码中正确初始化自己的全局变量是个问题。

    我想从启动代码的作者那里得到一份声明,这是一个公认的限制,一种疏忽或一种协议,即它是一个错误,请您在何时修复它。

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

    Kier

    让我循环使用启动代码作者进行评论。

    最佳,

    Matthew

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

    非常感谢Matthew。

    顺便说一句,我不认为这个问题仅限于COFF。 我使用EABI输出进行了测试,但问题仍然存在。

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

    我查看了引导流,我没有发现GS RAM的引导初始化有任何问题。  

    初始化由CPU1引导代码处理,然后CPU2从重置中释放。

    因此,如果您将GS RAM分配给CPU2 ,它应该按预期工作。 目前我没有足够的背景来评论Pinit。

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

    让我们简化问题。

    CPU2是否可以非零初始化GSRAM中的变量?

    听起来您是在说这不可能。 我是否正确理解了您?

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

    Kier

    我就此进行了一些额外的讨论,并将努力加以澄清。

    在独立/生产方案中,这是设备从重置中释放后将发生的流程:

    • CPU1启动 (CPU2处于重置状态)
    • CPU1初始化设备,包括内存分配,针脚分配等(在您的案例中,CPU2现在被授予相关GSRAM的所有权)
    • CPU1从复位中释放CPU2
      • 注:在调试期间,您可以创建一个只执行此操作而不执行任何其他操作的项目,以使CPU2继续运行
      • CPU1,在系统中,很可能在此处等待CPU2说“我已引导”
    • CPU2引导,初始化其内存
    • 在系统中,CPU2可能会做一些事情来告诉CPU1它已启动并正在运行–中断或设置标记,IPC消息或类似内容

    我认为这可能是在调试环境中引起的混淆,因为您连接到单个内核以加载代码,在 将代码加载到CPU2之前,您仍需要在CPU1上连接/执行一些代码(如上所述)。

    您应该可以在C2000软件的双代码示例中看到上述演示,例如:C:\ti\c2000\C2000Ware_4_01_00\device_support\f2837xd\examples\dual\dma_transfer_shared_peripheral或2000或其它2837其它。

    要直接回答您的最后一个问题,CPU2无法初始化GSRAM,直到CPU1分配所有权。  在独立系统中,这不是问题,因为CPU2处于重置状态,直到CPU1释放(并已为其分配内存/外围设备)。  在调试环境中,必须在将代码加载到CPU2之前通过在CPU1上执行某些代码来手动完成此操作。

    请告诉我,这是否会使事情更清楚。

    最佳,

    Matthew

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

    Matthew,

    感谢您的解释。 我认为这肯定会使问题的原因更加清晰。 很好地知道在独立模式下可能会正常。 但是,我认为我在调试用例中没有更接近解决问题。 如果我无法可靠地创建与独立用例相同的初始条件,那么这不是一个很好的调试环境。

    所附项目也是取自C2000Ware示例的双LED闪烁项目。 除了示例之外,我还做了以下工作:

    -在CPU2中声明并初始化非零变量,并将其定位在GSRAM2中。

    -给定CPU2在CPU1中的Device_Init()后和CPU2引导之前(独立模式)对GSRAM2的写入访问权限。

    -每隔0.5秒递增counter_GSRAM_CPU2。

    我尝试执行CPU1/CPU2重置/重新启动等操作,但未成功。按照您所述的顺序执行此操作,以便从CPU2初始化GSRAM2。

    如果您能下载该项目并告诉我按按钮的正确顺序,我将不胜感激。

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

    我认为我在研究了上述顺序后设法解决了这个问题:

    步骤1)在CPU2调试器配置中禁用Auto Run*。

    *默认情况下,此选项处于启用状态,并运行到main(),而无需等待CPU1传输内存所有权。 这是此问题的根本原因。

    步骤2)将内存所有权转移到CPU2后,在CPU1中添加一个空函数。

    步骤3)在CPU1中选择空函数作为自动运行符号:

    现在,在重置/重新启动时,CPU2尚未运行引导代码(包括cinit),但CPU1运行到已授予CPU2的GSRAM2写入权限的程度:

    步骤4)单击'Resume'(恢复)现在在CPU1中运行用户代码,并在CPU2中开始引导,其中确保引导代码能够写入GSRAM2。

    如果有一种更简单的方法,我会乐于接受想法,但至少现在使用调试器时,我会获得可靠的初始条件。

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

    Kier

    很高兴您能够在这方面取得进展。  这是CCS中默认启用的自动运行功能的一个很好的方面,它将导致此方案出现问题。  我经常自己忘记那些隐藏的选项。  让我看看其他人是否也有其他建议。

    最佳,

    Matthew

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

    您好 ,Kier:

    感谢403.5316万感谢您403.5316万您的解释。 我认为这肯定会使问题的原因更加清晰。 很好地知道在独立模式下可能会正常。 但是,我认为我在调试用例中没有更接近解决问题。 如果我无法可靠地创建与独立用例相同的初始条件,那么这不是一个很好的调试环境。[/QUOT]

    您应该能够在连接调试器的情况下创建独立条件。 您需要执行的操作是在CPU1上发出重置后,单击"运行"(或"恢复")而不是重新启动。 另外,在单击RUN (运行)之前,请在CPU1上正确设置EMAULTION引导模式(详情请参阅TRM),使其跳转至FLASH。  

    通常,由于您面临的问题,应避免在CPU2上为堆栈共享RAM。 用户可以使用M0/M1或LSX RAM进行此操作。 如果用户必须使用IT,则需要在CPU1和CPU2之间进行IPC握手,以确保CPU2代码在CPU1分配给CPU2之前不会访问资源。 很遗憾,在这种情况下,必须将其写入 F2837xD_CodeStartBranch.asm文件中,并且需要写入汇编中,因为这些文件是在该.asm文件中调用的init函数中访问的。  

    希望这对我们有帮助

    此致,

    Vivek Singh   

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

    您好,Vivek,

    谢谢,如果不起作用,我会尝试一下,然后再回来。