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.

[参考译文] TMS320F2.8377万S:器件无法从闪存启动

Guru**** 2482225 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1086059/tms320f28377s-device-does-not-boot-up-from-flash

部件号:TMS320F2.8377万S
主题中讨论的其他部件:controlSUITEC2000WARE

您好,

我有一个软件已经运行了一段时间。 它有一个基于TI示例代码建模的电机控制ISR。 最近,我在主例程中添加了一些子例程。 我使用调试器来确保代码正确。 电机控制ISR不受这些例行程序的影响。 现在,当我尝试运行主板而不使用调试器启动代码时,它永远不会启动。  

我删除了对新子例程的调用(并仍保留代码中的例程),程序仍不能作为独立程序运行。 然后我优化了代码的大小。 只有这样,该程序才作为独立程序工作(同时调用新的子例程)。 芯片中有足够的闪存和RAM。 我根本不明白原因。 如果程序可以在使用调试器启动时启动,为什么没有调试器它不能运行?

谢谢!

Dhammika

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

    您是否能够在独立重置后连接到设备并查看设备所处于的状态? 此视频中有一些说明 ,介绍如何在从闪存启动后连接,而不让设备重置。

    您使用的是哪个版本的SDK? 您将哪个示例用作起点?

    Whitney

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

    您好,Whitney,

    很抱歉耽误你的时间。 我尝试连接到设备,但无法连接。 我试过几次,下面是显示的错误信息。

    连接到目标时出错:
    (错误-1133 @ 0x0)
    设备阻止调试访问,因为它当前正在执行不可调试的代码。 您可以在设备有时间输入可调试代码后重试,也可以取消,禁用实时模式,然后尝试连接。
    (仿真软件包9.3 .0.0.0042万)

    该代码基于 controlSUITE\DEPEND_KIT\HVMotorCtrl+PfcKit_v 2.1 HVPM_Sensorless _2833x。 但是,大量的代码已被更改。 在我添加一些小的子程序之前,一切都很完美。 该代码使用Kalman过滤器来预测转子角度。 我有另一个使用编码器的代码。 该代码的大小略小。 我还在上面添加了这些子例程,它还没有启动问题(请注意,两个程序都是在同一主板上尝试的)。 我附上了一个文件,其中显示了两个程序中的内存分配。 有足够的空间容纳更多的代码。  

    谢谢!

    Dhammikae2e.ti.com/.../Memory-allocation-of-programs.pdf

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

    当您尝试连接时,禁用"启用实时模式"选项是否会消除该错误?

    从查看您的内存分配来看,我没有任何问题。 您能否告诉应用程序在启动过程中的进展情况? 例如,您能否在main()的开头切换GPIO并查看它是否符合要求?

    Whitney

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

    您好,Whitney,

    很抱歉花了这么多时间给您发送回复。 我对这个问题做了很多调查。 我比较了旧版本,再次测试了它们,以此类推。 这就是我发现的。

    1. 我的开机自检(POST)中有问题代码。 在这里,我使用TI提供的STL库例程测试SCI端口。 测试例程与STL库附带的示例相同。 测试通过。 但是,除非使用调试器跳转到main,否则代码不会启动。
    2. 如果代码优化到级别0 (即寄存器优化)或更高,启动问题就会消失。
    3. 使用感应算法的程序不存在启动问题。 由于该问题发生在主程序的开头,我很困惑其余的代码如何影响启动。 这两个程序与开机自检调用和随后的几个调用(例如重新初始化系统以进行正常操作)完全相同。 执行POST是在主页中完成的第一件事。 请注意,链接程序命令文件也是相同的。 甚至.cproject中的行都是相同的。

    谢谢!

    Dhammika

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

    你好,Dhammika,  

    惠特尼在31日之前不在办公室。  请在该日期之后收到回复。  

    谢谢!

    克利须那  

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

    因此,如果您删除SCI测试,它是否起作用? 您是否能够更具体地了解SCI测试是如何调用故障的? 您是被SCI测试代码本身卡住,还是SCI测试损坏了某些东西,还是问题更多地由SCI代码引起?

    您是否启用了安全功能? 或者配置了任何MemCfg设置以阻止对某些RAM的访问? 我只是想知道,更改优化级别和添加/删除SCI测试是否会将内存分配移动到不会发现问题的程度。

    Whitney

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

    您好,Whitney,

    我刚刚对SCI测试的调用进行了评论。 如果我使用调试器跳到main并执行这些帖子,那么测试显然会通过。 由于在没有调试器连接时出现此问题,因此很难找到SCI测试失败的位置。  

    我没有启用任何安全功能。 某些MemCfg函数是在RAM测试期间调用的。  

    任何优化级别 都起作用。 优化级别关闭时会出现该问题。  

    谢谢!

    Dhammika

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

    您是否成功通过了"设备阻止调试访问"错误,并在独立启动后连接到设备? 尝试不同的"启用实时模式"设置是否有帮助? 如果无法引导时知道它在何处卡住,将会很有帮助。

    Whitney

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

    您好,Whitney,  

    我附上了一个文件,显示程序可能被卡住的位置。 我认为这是不真实的。 我认为程序在启动代码内循环。  

    谢谢!

    Dhammikae2e.ti.com/.../Where-the-program-gets-stuck.pdf

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

    该地址是引导ROM的起点。 它卡在那里真的没有意义,因此我怀疑当您连接到设备时,设备正在重置。 您是否遵循我之前分享的视频中有关如何禁用"连接时重置"设置的说明?

    或者,您可以创建一个与常规文件相同的新CCXML文件,但删除gel文件:

    只需清除"初始化脚本"字段并保存即可。 只要CCS未指向有效的gel文件,就可以重新填充该字段。 在不使用凝胶文件的情况下进行连接应确保在连接时保留设备的状态。 然后,您可以停止,加载符号(仅限符号,而不是程序),并查看其卡住的位置。

    Whitney

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

    您好,Whitney,

    我尝试了你建议的方法。 我的调试器设置如下。

    然后,我收到消息,指出目标阻止了连接,因为它在不可调试的代码中运行。 如果我按如下所示设置调试器,它会在连接到目标之前重置目标。 有时它会说,

    C28xx_CPU1:停止目标CPU时出现故障:(错误-1156 @ 0x0)设备可能在低功耗模式下运行。 是否要使其退出此模式? 选择'是'强制设备唤醒,然后重试此操作。 选择'No'(否)在不唤醒设备的情况下重试此操作。 (仿真软件包9.3 .0.0.0042万)

    如果我连接到目标,则只能在目标重置后连接。 我尝试了所有类型的"发布选项",但如果不改变目标的持续行为,我永远无法连接到目标。 附加的文件包含调试器在重置目标后停止的位置。 我感觉此问题与闪存ECC有关。  

    谢谢!

    Dhammika

    e2e.ti.com/.../Break-at-address.pdf

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

    您在代码中的何处调用sysctl_delay? 它是否卡在那里,或者如果在sysctl_delay的末尾在LRETR指令上放置一个断点,您是否能够从它中单步退出? 应用程序在重置后是否正常运行,或者在设备初始化/开机自检测试之后是否仍然无法运行?

    您在pdf中共享的最后一个屏幕截图是您在memcpy将其移至此处之前跳转到ramfuns函数时的样子。 你说这只发生过一次,所以我不确定它有多重要。 我确实觉得这可能是某种RAM初始化问题,尽管...

    Whitney

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

    您好,Whitney,

    sysctl_delay被称为TI提供的自我测试诊断功能。  

    如果不通过调试器重置目标,我永远无法连接。 在我上面附加的代码中,虽然目标已经在那里停止,但如果我让它运行,它就会到达main()并正常运行。 我尝试使用独立的目标配置连接到目标。 即使这样,也无法进行实时连接。 如果禁用了实时,我可以连接多次。 很明显,调试器指示的目标已重置并挂起(或具有该效果的内容)。 然后它在0x08d0ed停止。 根据映射文件,该文件位于boot28.asm中。 它是boot28.asm中的以下代码。  

    如果我在此之后按Run,代码将无法到达main()。 这也可能是骗局。  

    谢谢!

    Dhammika

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

    当你说它无法到达main()时,当你停止它时,它在哪里? 仍然卡在boot28.asm中?

    您使用的是标准C2000Ware CodeStartBranch.asm还是自定义? 如果您在跳转到c_int00之前有代码开始代码禁用看门狗,这是否有区别?

    Whitney

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

    您好,Whitney,  

    我使用C2000Ware  CodeStartBranch.asm。 如您建议的那样,当禁用了其中的监视程序时,代码将启动而不会出现问题。 我在主程序中重新启用看门狗。 因此,这应该不是一个问题。 您知道为什么仅针对此代码会发生这种情况吗? 是否因为RAM初始化时间过长?

    谢谢!

    Dhammika  

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

    没错--c_int00运行的时间足够长,看门狗超时。 在没有此问题的应用程序版本中,RAM中需要初始化的变量可能较少,因此它可以在WD超时之前完成并进入main()。

    Whitney

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

    您好,Whitney,

    非常感谢您对此进行故障排除。

    Dhammika