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/TMS320C6727:从外部闪存加载程序时使用 CCS3.3和 printf。

Guru**** 2512575 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/755522/ccs-tms320c6727-ccs3-3-and-printf-when-loading-programs-from-external-flash

器件型号:TMS320C6727

工具/软件:Code Composer Studio

您好!

我正在从 C6727上的外部闪存引导。 在外部闪存中、我有一个基本的 DSP/BIOS 程序、该程序启动了一项任务、使我们的开发板上的 LED 闪烁。 这可以正常工作、但当通过 CCS3.3连接时、我似乎不会获得任何(可靠) STDOUT 输出。

我正在运行一个 C++程序、并且包含了 头文件。 我还使用了 stdout.h 头文件进行了尝试。 我还将程序的堆栈大小和堆大小增加了几个大小、以确保在 printf 可能无提示失败的情况下具有大量的内存。  

奇怪的是、当我在 printf 的调用中放置一个断点时、它们只是被跳过、处理器永远不会达到断点。 这是否表示缺少内容?  

我是否需要加载符号才能正确地将数据发送到 CCS3.3中打印的 STDOUT? 否则、调试器如何知道_CIOBUF_的位置?  

另外、还有一个额外的问题:我实际上在闪存中存储了两个程序。 当第一个程序中的一个变量被置位时、它将一个辅助程序载入内部 RAM (请注意、第一个程序被完全存储在我们的外部 SDRAM 中、而不是 EMIF 总线)。 即使在加载第二个程序的符号之后、我也无法从第二个程序中打印出来。 调试器是否可以找到新的_CIOBUF_并从第二个程序中正确获取打印内容? 如果是、我需要做一些提示还是需要更改 CCS 设置?

我知道这是很多信息、但我想知道在从外部闪存引导时、让 printf 可靠运行是否存在任何秘密。  

谢谢、

Vincent Galbo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Vincent、
    您是否看过以下文章? 它涵盖了许多常见问题:
    processors.wiki.ti.com/.../Tips_for_using_printf

    请注意有关 C I/O 缓冲区和断点的部分。

    谢谢
    Ki
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我实际上已经阅读过该文章。

    我能够解决这个问题、但我不确定为什么。 我将为您提供有关我的程序设置的见解、或许它会揭示一些内容。

    似乎我加载符号的速度太快、无法正确设置 CCS 或调试器。 下面是我的 GEL 代码、它将通知一个程序(ProjectTemplate)开始从闪存(GroundTest)加载第二个程序、并为该程序提供控制:

    Hotmenu GroundTestMode()

    GEL_Halt();
    GEL_SymbolLoad ("..\Debug\\ProjectTemplate.out");
    G_TESTMODE = 1;
    GEL_SymbolLoad ("..\Debug\\GroundTest.out");
    GEL_Run();


    在 ProjectTemplate 中设置 g_TESTMODE 变量后、它将开始从闪存加载 GroundTest 程序并传输控制。 但是、此代码不起作用。 我必须删除 GroundTest 符号的立即加载、并允许代码完全传输到新程序、然后加载符号以获取输出。 因此、对于我来说、这一系列新的 GEL 调用效果更好:

    Hotmenu GroundTestMode()

    GEL_Halt();
    GEL_SymbolLoad ("..\Debug\\ProjectTemplate.out");
    G_TESTMODE = 1;
    GEL_Run();


    Hotmenu LoadGroundTestSymbols()//必须在完全加载到 GroundTest 模式后调用此函数。

    GEL_SymbolLoad ("..\Debug\\GroundTest.out");


    我想知道是否有方法可以更可靠地自动加载 FoundTest 程序的符号、而无需用户执行两个 GEL 调用?

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

    Vincent Galbo 说:
    似乎我加载符号的速度太快、无法正确设置 CCS 或调试器。

    您正在运行 GEL 的已知限制-并非所有 GEL 调用都是同步的行为。 我可以确认 GEL_SymbolLoad 不是同步的。 因此、当您调用 GEL_SymbolLoad 时、加载符号的命令将发送到调试器、GEL 将移至 GEL 脚本中的下一行、然后加载完成。 这可能是您遇到的问题。  

    [引用 user="Vincent Galbo"]我想知道是否有方法可以更可靠地自动加载 FoundTest 程序的符号而无需用户执行两次 GEL 调用?

    有一个称为"OnFileLoaded"的 GEL 回调函数。 加载程序后将调用此函数。 我认为加载的符号也是如此(不确定是否为100%)。 您可以尝试实现该函数、以便它检查 g_TESTMODE 是否为1、如果为 TRUE、则加载 GroundTest、out 的符号

    谢谢

    Ki