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.

[参考译文] TMS570LC4357:当在 Launchpad 上独立运行时、代码不执行

Guru**** 2472080 points
Other Parts Discussed in Thread: TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1022389/tms570lc4357-code-does-not-execute-when-run-standalone-on-the-launchpad

器件型号:TMS570LC4357

您好!

我在使用 TMS570LC4357的 Launchpad 时遇到一个奇怪的问题。  

当 JTAG 被连接时、代码运行正常。 我可以执行自由运行、暂停、重置、再次自由运行或单步执行/步入等操作 一旦我执行下电上电(断开 USB 并重新连接)、代码就会卡在数据中止中、并且不会进一步执行。 (我通过重新连接目标并仅加载符号找到了这一点)。

我的代码的主函数如下所示:

void main (void)

  /*初始化驱动程序*/
  initDrivers();

  /*初始化应用程序*/
  initApp();

  /*初始化调度程序*/
  initScheduler();

  while (1)
  {
  }

initDrives()函数如下所示:

空 initDrives()

  /*初始化离散 */
  initDiscertes();

  /*配置 CAN */
  initCan (ConfigAddr);

  /*配置 SPI */
  initSpi();

  /*启用看门狗计时器*/
  enableWatchdog();

当我通过加载符号重新连接 JTAG 而不再次对闪存进行编程时,我看到 initCan()函数的正式参数不是用"ConfigAddr"的地址作为实际参数进行初始化的。 我看到、即使在直接存储器窗口或使用表达式窗口中、特定的存储器位置和其他几个位置也不可写入。 一旦我对同一代码重新编程、它在连接 JTAG 的情况下就开始完美工作、并在下电上电时再次奇怪地运行。

但有一个转变:

如果我将语句"enableWatchdog()从 initDrives()函数移动到 main()函数,就在调用 initDrives()函数之后,如下所示:

void main (void)

  /*初始化驱动程序*/
  initDrivers();

  enableWatchdog();

  /*代码的其余部分*/

(本质上是相同的执行顺序、没有区别)、一切都无缝工作、具有我们想要的尽可能多的功率周期。

enableWatchdog()函数的内容为:

void enableWatchdog()

RTTI->RTIDWDCTRL = DWD_ENA_KEY;

我曾多次面对这问题,但似乎已消失,代码出现了一些不合逻辑的变化,如上所述。 我已经没有办法找到问题的根本原因。 请帮帮我。

谢谢你。

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

    您好!

    数据故障状态寄存器(DFSR)的值是多少?  

    如果中止是同步数据中止、则可以使用 链接寄存 器(r14_abt)中的值来确定哪个指令生成了中止、并使用保存的程序状态寄存器(SPSR_abt)中的值来确定中止发生时处理器的状态。

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

    您好、QJ Wang、

    感谢您的回复。

    CP15_DATA_FAULT_STATUS 的值为0x00001008。 这意味着它是同步外部中止。

    R14_abt 寄存器的值为0x00000014、这指向 B reservedEntry 指令、但我认为它是断点到达地址0x00000010处的 BL DataAbort。

    导致中止的 C 指令为(我通过分步执行来检查它):

    switch (canConfig->canDev)

    这是因为 canConfig 是存储在堆栈 RAM 位置的实际参数、但当我循环通电并连接 reload 符号时、该存储器位置不可写(甚至在存储器或表达式窗口中也不可写)。 当我重新编程时、它开始工作正常、当我再次进行电源循环时、它停止工作。

    SPSR_abt 寄存器的值为:0x800003D3、

    模式:SVC、N=1、E=1、A=1、I=1、 f=1、将所有零都放置。

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

    您好!

    SPSR_abt = 0x3d3表示系统处于监控器模式。 器件是否复位? 或者您的代码将系统切换到 SVC 模式?

    您是否会检查导致反汇编窗口中的中止的指令?

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

    器件未复位。 一旦中止发生、系统就会进入 SVC 模式。  

    下面的屏幕截图显示了输入中止之前的状态:

    如果我执行汇编步入或步越:

    问题是、R12应该具有参数的地址、但该位置在下电上电后变为不可写、并保留垃圾数据。

    下面的屏幕截图显示了重新编程后它如何正常工作:

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

    您好、Gobind、

    您是否知道是什么导致 RAM 中的位置不可写?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="448206" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1022389/tms570lc4357-code-does-not-execute-when-run-standalone-on-the-launchpad/3782995 #3782995"]下面的屏幕截图显示了输入中止前的状态:

    根据屏幕截图、canConfig 是指向结构的指针、其中  canConfig 指针存储在 initCan 函数的栈上。

    出于某种原因、在故障情况 下、CANConfig 指针获得0x1A3FA11B 的无效值、这会导致尝试重新引用数据时发生中止;因为地址0x1A3FA11B 位于器件存储器映射中的保留空间中。

    根据所示的代码、不确定是否存在:

    a.无法正确初始化 CANConfig。

    b.栈上的 canConfig 被覆盖。

    您能否在 CCS Variables 视图中调试对 canConfig 的监控以查看何时获取无效值?

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

    您好 QJ、

    我不知道是什么使它不可写、而只是循环通电。 当我重启电源并重新连接(不重新编程)时、它将变得不可写。

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

    切斯特、您好!

    以下为真:

    a. canConfig 未正确初始化、它保留在加电时获得的垃圾值。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="448206" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1022389/tms570lc4357-code-does-not-execute-when-run-standalone-on-the-launchpad/3786690 #3786690"]a. CanConfig 未正确初始化、它保留了加电时获得的垃圾值。

    您能否显示有关如何初始化 canConfig 指针的代码?

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

    它是函数参数。 函数调用如下所示:

    initCan (canaConfig);

    CANAConfig 的地址为0x08007A00。

    下面是等效的汇编语言:

    在下面的屏幕截图中、R13包含本应存储 canaConfig 地址的堆栈位置、但该位置包含0x1A3FA11B、这是它在复位时获得的值。 在我开始初始化函数之前、有一个用于清除存储器的代码、但是这个存储器位置(以及少数其他位置)不会被清除。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="448206" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1022389/tms570lc4357-code-does-not-execute-when-run-standalone-on-the-launchpad/3786729 #3786729"]这是函数参数。

    源代码和生成的汇编器看起来正常。

    [引用 userid="448206" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1022389/tms570lc4357-code-does-not-execute-when-run-standalone-on-the-launchpad/3786729 #3786729"]在我开始初始化函数之前,有一个用于清除内存的代码,但此内存位置(以及少数其他位置)不会被清除。

    在将0xA 写入 SYSTEM_REG1->MINITGCR 之后、此问题会出现、该值是对片上 SRAM 模块的自动初始化启用的。

     system_REG1->MSINENA 的值是多少?要自动初始化哪些内存?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="91588" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1022389/tms570lc4357-code-does-not-execute-when-run-standalone-on-the-launchpad/3786865 #3786865"]在将0xA 写入 system_REG1->MINITGCR (启用片上 SRAM 模块的自动初始化)后,可能会出现此问题。[/quote

    我认为这条语句应该是可以的,因为当我将"enableWatchdog();"语句移动到 initDrives()函数之外的位置时,一切都正常。 (请参阅问题说明)。 但是、如果您建议、我可以做一些实验。  

    [引用 userid="91588" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1022389/tms570lc4357-code-does-not-execute-when-run-standalone-on-the-launchpad/3786865 #3786865"]  system_REG1->MSINENA 的值是什么,要自动初始化哪些内存?[/quot]

    我正在尝试使用这些语句初始化 CAN 消息 RAM。 这些初始化效果很好。

    另一个观察结果:最初我没有意识到我可以在寄存器窗口中读取 DFSR、因此我编写了一些汇编代码来读取它。 一旦我用新代码对 uController 进行编程、问题就消失了。  

    这个问题似乎随着一些不合逻辑的修改而消失,例如移动"enableWatchdog();"或添加一些代码。 我无法将修改与问题关联起来。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="448206" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1022389/tms570lc4357-code-does-not-execute-when-run-standalone-on-the-launchpad/3786922 #3786922)]更改某些不合逻辑的修改(如移动"enableWatchdog();"或添加一些代码)后,问题似乎消失了。 我无法将修改与问题关联起来。  [/报价]

    您是否能够以失败的状态附加完整项目?

    根据对程序进行其他更改后问题可能会一并出现的事实、不确定原因是什么。

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

    切斯特、您好!

    我可以尝试从工程中删除工程特定代码并附加它、但恐怕无法重新创建相同的问题。

    如果可能、我们可以通过电话来共享屏幕以显示问题。

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="448206" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1022389/tms570lc4357-code-does-not-execute-when-run-standalone-on-the-launchpad/3786956 #3786956"]我可以尝试从项目中删除项目特定代码并附加它

    我打算从 CCS 项目中删除我们公司特定的代码。