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.
您好,
抱歉,我不知道这是设备问题还是CCS问题。 我正在使用F2837xD的controlCARD。
问题是我无法从CPU2可靠地将GSRAM中的变量非零初始化。
我已经:
单击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
我就此进行了一些额外的讨论,并将努力加以澄清。
在独立/生产方案中,这是设备从重置中释放后将发生的流程:
我认为这可能是在调试环境中引起的混淆,因为您连接到单个内核以加载代码,在 将代码加载到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,
谢谢,如果不起作用,我会尝试一下,然后再回来。