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/LAUNCHXL-F28379D:无法打印浮点数????

Guru**** 2524460 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/820053/ccs-launchxl-f28379d-unable-to-printf-floating-point-numbers

器件型号:LAUNCHXL-F28379D

工具/软件:Code Composer Studio

我正在尝试通过终端上的 SCI 打印浮点数。

由于用于 CCS 的 printf 不适用于浮点数、接下来要做的是什么?

我使用带隐含小数的整数数学、其中值10000被视为100.00。

我将 printf 与 Int16一起使用、我只想在打印到终端时使用固定的小数点。

我感到惊讶的是、CCS 中使用的 printf 实现不遵循此函数的基本 C 标准

我想听听其他人为解决这一限制所做的工作。

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

    [引用 user="David Petryk"]因为 CCS 的 printf 不适用于浮点数

    这不准确。  有关此主题的背景信息、请参阅文章 使用 printf 的提示

    如果这不起作用、请考虑这种方法。  使用 sprintf 将浮点数转换为字符串。  那么,输出一系列字符是重要的...

    [引用 user="David Petryk"]通过终端上的 SCI。

    不幸的是,我对这方面的细节缺乏专门知识。

    谢谢、此致、

    乔治

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

    您好、George、

    我在 CCS 中遇到了很多 stdio 问题。 我希望这是我正在做的事情,因为我希望它能按应有的方式工作。

    请参阅上一个帖子。   

    我被告知 STDIN 不受支持。  

    无论如何、我无法对任何浮点数使用 printf。 调试代码时、代码会挂起。 我试了一会儿、再次尝试了、结果相同。

    我不想在 CCS 控制台上打印、但我想将其定向到 SCIB。 STDOUT 的直接重定向正在正确地重定向、因此 printf 应该可以正常工作。

    它适用于整数而不是浮点值。

    您说它确实适用于浮点值。 您能否使用 printf 和 float 向我发送一行代码? 我无法使其正常工作。

    以下是典型的代码行- printf (" FP N =%3.2f  ",HMI_RPM_f);

    执行时、目标挂起并进入杂草中。

    我在编译器标志部分中确实有"printf_support=full"标志。 这需要改为还是也需要在链接器标志中?

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

    [引用用户="David Petryk"]

    以下是典型的代码行- printf (" FP N =%3.2f  ",HMI_RPM_f);

    执行时、目标挂起并进入杂草中。

    [/报价]

    请将 printf 调用 sprintf 更改为您知道足够大的字符数组以包含结果。  这奏效了吗?

    谢谢、此致、

    乔治

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

    您是否正在尝试打印*浮点*或*定点*?

    除非将其另存为浮点或双精度型、否则您必须编写自己的例程才能打印它。 printf()应该如何知道将十进制放在哪里?

    您可以共享一些代码吗?

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

    是的。 我可以共享代码。 如果您愿意、我可以发送整个项目、但同时我将提供一些屏幕抓图。

    这是测试代码。

    当注释行未注释时、输出看起来正常、并按预期打印"这是一条消息"。

    然后、我按照所示注释行、让浮点行执行 MCU、看起来它正在执行看门狗超时"printf support = full

    或某种程度上非常快速的自复位。 我尝试了"sprintf"和"snprintf" i.正如 您所建议的。 SN 处理了文本消息

    并与浮点损毁。 SN 未使用浮点生成输出。  

    我想验证是否已正确设置"printf_support=full"标志。 也许我已经对这一点进行了 goof馈、但我真的没有得到充分的支持。  它是编译器和/或链接器标志吗? 如果未正确设置该标志、您会期望系统崩溃。 我不会。 如果我没有 FP 支持,就应该不产生任何输出,继续运行 IMO。

    这是我的编译器标志的一个截图。

    仅供参考、这里是使用 TeraTerm 时看到的 HMI 屏幕截图。

    我有很多地方需要浮点输出格式。 我希望我们能够使这项工作发挥作用。

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

    HMI_RPM_f 的类型是什么?

    您对定点和浮点的讨论使我感到困惑。

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

    更多信息;

    只要对浮点 printf 进行编译、就会导致系统崩溃。

    这种行为在我第一次尝试打印浮点数时始终保持一致。 现在

    我认为这与旗帜有关。

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

    [引用 user="David Petryk"]我想验证是否已正确设置"printf_support=full"标志。

    您可以。

    [引用 user="David Petryk"]它是编译器还是链接器标志?

    编译器

    您是否检查了堆栈是否溢出?

    谢谢、此致、

    乔治

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

    我的堆栈按照建议设置为400。 我不知道如何检查它们是否溢出。 您能告诉我如何检查吗?

    它很有趣、因为当编译有问题的代码行时、错误会出现。 我在有问题的代码行设置了断点、但它永远不会出现。 因此、ARror 似乎根本不是由调用的 printf 函数生成的。

    更类似于执行 main 之前执行的代码初始化部分中的内容。

    是否有任何关于如何隔离问题发生位置的想法?

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

    下面是一些看起来像是溢出的屏幕截图、但我不确定数字是告诉我什么。

    我尝试将堆栈和堆大小翻倍至0x800、但后来我遇到一个错误、即没有足够的空间。

    我从未了解过如何分配存储器部分。 我假设堆栈和堆分配给特定扇区。 我可以将它们更改为更大的扇区吗?

    我是否可以在代码中执行一些操作来减少堆栈使用?

    我在一个没有海图的水域,不知道如何去安全的港口。

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

    好的、George、

    我为您提供了更多信息。 我看了"堆栈空间的大量用户、并一起展示了代码和使用栏。 您可以看到、主要违规者似乎是与光标相关的函数、只需将半打字符打印到串行端口即可移动光标。 其中一些函数从未调用过、但使用量很高。 我不明白这些是否是问题的原因。

    如果我使用这些函数、宏(嵌入字符串)代替被调用函数会减少对堆栈空间的需求吗? 函数被调用的次数是否等于其所需的堆栈空间量?

    其中一个"黄色条"与从未调用的函数相关联。 我写了它、但最终没有使用它。 为什么堆栈使用率如此高? 这意味着从未使用过的程序中的函数仍包含在最终输出代码中。 我开发过的所有其他编译器都不会在源文件中包含从未调用过但存在的代码。 CCS 就是这种情况、还是它始终包含所有内容?

    在这些屏幕快照中查看函数和堆栈使用情况。 请告诉我您的想法。

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

    哎呀-事实证明我撒谎了。

    执行一些错误搜索、结果是在首次执行任何包含浮点格式的"printf"时、目标硬件会遇到问题。

    它似乎位于指定了浮点格式的任何 printf、sprinf 或 snprintf 函数调用中。

    当然、我无法跟踪该代码以查看是否可以发现任何内容。

    我正在等待乔治就如何从这里继续进行的指示。

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

    Keith 回答您关于"什么是 HMI_RPM_f 的类型?"的问题

    它是 float 类型。

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

    我添加了3个附加的"reply"、但它们没有显示。

    我必须打破某人的规则。

    这是非常令人沮丧的。

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

    我将重点介绍一些我认为最相关的事情。   

    它看起来您确实溢出了堆栈。  如果链接器选项--stack_size 设置为0x400字、则您肯定会将其溢出。  堆栈使用情况视图显示您需要大约1200个字、这多于0x400 (1024)个字。  堆栈使用情况视图来自代码的静态分析。  有趣的列是最后一列、名为 Inclusive Size。  这显示了该函数所需的堆栈数量以及它调用的所有函数。  启动函数_c_int00所需的量是有趣的。

    我不确定。  但您希望运行的程序可能不适合您的系统。

    您应该注意链接器有关创建不带 SECTIONS 规范的输出段的警告。  这意味着这些输出段根据默认算法分配给存储器、这种算法很少正确。  通常、工程随附的链接器命令文件会处理所有这些详细信息。  因此、您可能会使用错误的链接器命令文件。  为了实现这一可能性、我建议您在 C2000器件论坛中开始新的主题。 或者、如果您愿意、我可以将此主题移至该论坛。   

    如果您决定更好地更改启动时使用的链接器命令文件、请参阅文章 TI 链接器命令文件入门

    谢谢、此致、

    乔治

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

    乔治,我超级困惑。

    下面是一个示例。 我有一个简单的函数、它从串行端口"EL"发送几个字符。 它在我的程序中只调用一次、不在任何类型的循环中。 堆栈使用情况报告它溢出。 这是怎么可能的? 查看屏幕抓图、您将只看到一个对 EL 的调用实例、该调用在程序启动时执行、并且不会再次执行。 此外、它还在图表中显示了堆栈使用情况、以及该函数的源代码。 代码不能简单得多。 我不明白为什么这个函数需要这么多的堆栈。

    今天早些时候、当我使用编译器版本8.1.1时、我有一个从未调用过的函数、它还表明存在栈溢出。 这是不可能的。 从那时起、我升级到了8.12.0、这个问题得以神奇地消失。 我很难相信编译器堆栈使用页面告诉我的内容。

    同时、我有许多函数、它们的数量每秒被称为数万次、并且都不到10次。 我不明白。 是任何给定函数的堆栈要求、取决于调用频率或调用深度。 能不能解释一下我有多大的不同。 所有数字都是"低"或"高"、两者之间没有任何区别。

    是否有一些文档对此进行了详细解释?

    就分区警告而言,我同意你的意见,不应忽略这些警告。 我还没有解决这个问题。 硬件执行正常、这些警告是在我的项目中安装 DCL 函数的结果、我仅使用其中一个函数。

    我还了解内存、部分和扇区以及所有需要管理的东西。 我还没有深入研究这一点。 这是我使用 TI 处理器的第一个项目、我不得不说、学习曲线非常陡峭。

    我还发现了引发我刚才提到的一切的根本问题、当然、浮点崩溃的"printf"。

    我已经跟踪了 printf 函数本身的问题。 在这里、它从不会从对函数"_TI_printfi"的调用返回、我单步执行该函数一个位、我知道它会失败。

    这是事物似乎向南的地方。

    总之、我想知道你们是否可以复制我的6行程序并查看它是否起作用? 我使用的是 Launchpad XL f28379d 板。 我不能让它适用于浮子。 它适用于整数、因此 printf 函数是半有效的。 也许我是全球唯一一个尝试在我的特定硬件集打印浮点数的人?

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

    [引用 user="David Petryk">我有一个简单的函数、可从串行端口"EL"发送几个字符。 它在我的程序中只调用一次、不在任何类型的循环中。 堆栈使用情况报告它溢出。 这是怎么可能的?

    如果我解释"专有大小"列和"全包大小"列之间的区别、可能会有所帮助。  专用大小是该函数所需的堆栈数量、忽略它可能调用的任何函数。  inclusive size 是该函数所需的栈数量、加上该函数所调用的所有函数所需的栈数量。  请注意、这是递归应用的。  因此、如果 f1调用 f2、而 f3调用 f4等、则会在中添加每个函数所需的堆栈数量。  函数 EL 调用 printf。  虽然 El 需要非常少的堆栈、printf 和 printf 调用的所有内容、但需要大量的堆栈。

    为简单字符串使用 printf 不会激活 printf 调用的辅助函数、而 printf 需要如此多的栈。  将 printf 用于 float 确实会激活这些辅助函数、这就是堆栈在运行时实际溢出的情况。   

    在找到至少将1200个字分配到栈的方法之前、您无法打印浮点值。

    我建议您尝试使这个简短的程序正常工作...

    #include 
    
    int main()
    {printf("float
    test:%f\n",3.14);
    return 0;
    } 

    谢谢、此致、

    乔治

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

    [引用 user="George mock"]我建议您尝试使该简短的程序正常工作...

    您是否尝试过?  如果是、发生了什么情况?

    谢谢、此致、

    乔治

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

    因为已经有一段时间了,我想你已经解决了你的问题。  非常感谢您的解决。

    谢谢、此致、

    乔治

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

    你(们)好。

    很抱歉耽误你的时间。 我现在不得不与硬件和 PCB 设计团队合作一段时间。
    当我们制造一些电路板时、这种情况会逐渐减少、因此我将能够在这方面花费更多的时间。
    我无法解决该问题、因为我被转用了。 我同意您的观点、即堆栈大小问题、但我认为
    还没有足够的知识来增加堆栈大小。 我尝试通过重新分配堆栈来增加堆栈
    更大的扇区、但电路板甚至不会启动。 那时我就把一切都接了下来,恢复了。 我需要学习  
    我需要在链接器文件中更改什么才能完成此操作。  
    是否有一些有关链接器文件结构和所有这些机密文件的文档?
    如果您能帮我解决这个问题、那将会非常有帮助。  
    感谢你的帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David Petryk 说:
    是否有一些有关链接器文件结构和所有这些机密资料的文档?

    开始的最佳位置是文章 链接器命令文件入门。   

    谢谢、此致、

    乔治

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

    由于最近没有任何活动、我现在将此主题标记为已关闭。  如果您在30天内发布到该主题帖、它将自动重新打开。  在30天内、线程将自动关闭以供将来发布。  如果发生这种情况、则可以通过启动新线程来更新内容。

    谢谢、此致、

    乔治

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

    谢谢 George、

    我被埋在硬件中、将这些东西投入生产。 我将挑选固件

    完成后进行开发-大约一个月左右。 如果我需要您的帮助、我会

    然后与您联系。 同时感谢您的所有帮助。