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.

[参考译文] F28M35H52C:fprintf在CPU重置后停止工作。

Guru**** 2538930 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/659854/f28m35h52c-fprintf-stops-working-after-cpu-reset

部件号:F28M35H52C

我正在C28x中从RAM执行一个程序。 为了调试它,我使用了fprintf函数,该函数现在可以正常工作(在考虑了中所述的内容之后)  )。 当我启动时,将程序连接并加载到目标上,它会执行预期的操作。 应用CPU重置以重新运行程序时出现问题。 由于C28x必须从RAM引导,我在闪存中有一个程序用于M3引导,因此我必须连接并在那里应用CPU重置。 这很好,我已检查C28x是否正确转到主功能。 但是,当它进入fprintf函数时,这是我第一次启动目标以来的第二次,因为这是在重置之后,控制台中会出现以下消息:

[C28xx_0]写错误:CIO消息中的文件ID (3)无效!

我不理解为什么fprintf在重置后停止工作。 我曾经尝试过使用“假的想法”,因为我在任何时候都应用了复位,所以缓冲区可能有问题,但没有帮助。 我还指定了. cio部分必须在cmd文件中分配的位置,因为当我不这样做时,它被放置在为引导ROM堆栈保留的RAM M0中的一个空间中。 这也没有起到任何作用。

我知道这不是应用程序开发的真正问题,因为我可以终止调试器并重新启动它(第一次它将正常工作),但我想知道为什么这是偶然的。 这是否与我正在RAM内存中加载程序有关? 我不确定我是否理解在调试视图工具栏中单击CPU重置后发生的情况。

我正在使用Code Composer Studio v 7.4。

提前感谢。

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

    您好,用户:

    这看起来像是'y program is working when I load from debugger,but does 't work when I try to run it from reset'(当我从调试器加载时,我的程序正在工作,但当我尝试从reset运行它时,程序不工作 我们需要进行一些调试,以获得有关问题的帮助。

    您提到的关于使用引导ROM保留内存的.CIO部分的一件事,我相信您已解决了这个问题。 是的,应用程序的任何部分都不应假定在引导ROM保留内存中正确初始化任何内容。 应用程序可以重新利用RAM的这一部分,但在重置后,设备上的引导ROM将使用此RAM进行引导,因此没有可用的初始化常量。

    其次,当您第一次将连接和加载代码到C28x时,您的应用程序使用fprintf可以正常工作,在C28上执行调试器重置并重新启动后,是否可以正常工作,而不必重新加载项目?

    接下来,我想确保我们将问题与fprintf包含分离,您能否检查是否仅当您的应用程序使用fprintf时才会出现此问题,如果您不使用fprintf或尝试在C28上使用简单的盲/循环代码,则不会出现此问题?

    此致

    Santosh Athuru

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

    "您提到的关于使用引导ROM保留内存的.CIO部分的一件事,我相信您已经解决了这个问题。 是的,应用程序的任何部分都不应假定在引导ROM保留内存中正确初始化任何内容。 应用程序可以重新利用RAM的这一部分,但在重置后,设备上的引导ROM将使用此RAM进行引导,因此没有可用的初始化常量。"

    是的,我看到了.map文件,没有问题。

    "第二,当您第一次将连接和加载代码的目标连接到C28x时,使用fprintf的应用程序可以正常工作,在C28上执行调试器重置并重新启动后,是否可以正常工作,而不必重新加载项目?"

    这正是我所做的,但它不起作用(从调试器重置和重新启动后,当然,我第一次执行它时,它完全符合我的期望)。

    "接下来,我想确保我们将问题与fprintf包含分离,您能否检查是否仅当您的应用程序使用fprintf时才会出现此问题,如果您不使用fprintf或尝试在C28上使用简单的盲/循环代码,则不会出现此问题?"

    没错,如果我注释掉使用fprintf的函数,我就没有任何问题。

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

    您提到应用程序在重置->重新启动->运行后点击fprintf()时不工作。 我假设在重置和重新启动后,程序控件到达main(),您可以逐步执行代码,直到它到达fprintf(),这就是您看到错误的地方。

    有一件事我忘记询问或者没有看到,那就是失败发生在第一个fprintf()时还是失败发生在几个之后?

    如果您在按下RESET后重新加载程序会发生什么情况? 以下步骤:
    1>重置
    2>程序重新加载
    3>重置
    4>重新启动
    5>运行(它是否执行任何fprintf(),几次之后是否失败?)

    在您重置后的第二次,以下顺序会发生什么?
    1.>重置
    2.>程序重新加载
    3.>程序控制已在main()处
    4.>运行(它是否执行任何fprintf()并在几次之后失败?)

    我正在尝试建立:如果在目标连接和程序加载之后的第一次运行只是偶然的,因为连接目标时内存的初始化方式?
    我还想看看这是否是堆栈/堆问题? 与不使用C I/O例程的应用程序相比,使用C I/O调用需要更大的堆栈和堆大小。

    请浏览下面的维客,它也可能会帮助您进行调试。
    processors.wiki.ti.com/.../Tips_for_using_printf



    此致
    Santosh Athuru
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,感谢您再次回答我的问题。 我的答复如下:
    "您提到应用程序在重置->重新启动->运行后点击fprintf()时不工作。 我假设在重置和重新启动后,程序控件到达main(),您可以逐步执行代码,直到它到达fprintf(),这就是您看到错误的地方。"
    您对这一点是正确的。
    “有一件事我忘记询问或没有看到,那就是失败发生在第一个fprintf()时,还是失败发生在几个之后?”
    这有点棘手。 现在我在尝试它,它总是在第一次fprintf后失败,但我记得有时它在执行一些操作后失败(我不能复制它)。
    “如果您在点击RESET后重新加载程序,会发生什么情况? 以下步骤:
    1>重置
    2>程序重新加载
    3>重置
    4>重新启动
    5>运行(它是否执行任何fprintf(),几次后失败?)"
    我尝试了以下顺序:
    1>单击调试图标(启动并加载至我所需的位置)
    2>首次执行(一切正常)
    3>重置
    4>程序重新加载
    5>重置
    6>重新启动
    7>run (在第一次fprintf()调用时失败)
    然后我尝试了这个序列,它与后者相同,但没有在第二步中执行:
    1>单击调试图标(启动并加载至我所需的位置)
    2>重置
    3>程序重新加载
    4>重置
    5>重新启动
    6>运行(一切正常)。
    "重置后第二次,以下顺序会发生什么情况?
    1.>重置
    2.>程序重新加载
    3.>程序控制已在main()处
    4.>运行(它是否执行任何fprintf(),几次之后是否失败?)"
    我尝试了以下顺序:
    1>单击调试图标(启动并加载至我所需的位置)
    2>首次执行(一切正常)
    3>重置
    4>程序重新加载
    5.>程序控制已在main()处
    6>运行(在第一次fprintf()调用时失败)
    "我正在尝试建立:-如果在目标连接和程序加载之后的第一次运行只是偶然的,因为连接目标时内存的初始化方式?"
    它在第一次执行时从未失败,在第二次执行时始终失败(大多数情况下在第一次执行fprintf时,但我记得在错误发生前几次调用fprintf的一些情况)。
    "请浏览下面的维客"
    我已经看过了,但没有任何一项能帮助我解决这个问题。 我增加了堆和堆栈,但它们完全相同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您执行这些步骤,您是否能够在程序加载后,首次运行之前转储整个RAM内存内容,并在重置后转储RAM内容,然后在运行之前重新启动。

    您是否能够比较两个内存日志并确定差异? 您应该能够看到哪个内存区域具有不同的值,应用程序的哪个部分映射到该区域,然后回答为什么会有不同?

    此致
    Santosh Athuru
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是个好主意,我会看看我能找到什么。 如果我意识到某件事,我会给您回写。
    谢谢你。