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.

[参考译文] TMS320F2800137:如何在具有受限栈的 F2800137中使用 sprint?

Guru**** 2463330 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1495994/tms320f2800137-how-to-use-sprintf-in-f2800137-with-limited-stack

器件型号:TMS320F2800137

工具/软件:

尊敬的专家:

我正在使用 sprintf 函数进行 UART 调试。 我发现当它运行很长时间、可能是1小时、系统会异常。

堆栈大小为 0x380。   UART 通信频率为5Hz、在一次性通信中总共使用17个冲刺函数。

我发现一份文档说、sprintf 需要大型 C2000堆栈。 正确吗? 我们如何使用具有有限堆栈的 sprintf? 或者、您是否有其他建议将浮点数据转换为字符以将我们的 UART GUI 发送出去?

谢谢!

此致、

Jim

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

    您好:

    您能否先参阅此页面、看看它是否有助于您的查询? 谢谢!  https://software-dl.ti.com/ccs/esd/documents/sdto_cgt_tips_for_using_printf.html 

    此致、

    Allison

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

    尊敬的 Allison:

    感谢您的答复!

    我看到了这个文档、上面写着"在编译器的版本上指定、调用其中一个*printf 函数需要超过400字节的栈。 确保堆栈位于有效的读取/写入数据存储器中。'。  

    这是否意味着,如果我需要调用17个 sprintf 函数,我需要为它准备超过6.6kB 的堆栈? 它太大、而且没有足够的堆栈。

    或者、C2000库是否有一些函数可以 将浮点数据转换为字符?

    此致、

    Jim

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

    您好、Jim、

    感谢您的回复! 请允许我在另一天与另一位团队成员核实此处的建议。

    此致、

    Allison

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

    最新版本的 C2000编译器支持此选项 -- printf_support 。  请在 C28x 编译器手册中搜索 该选项。  如果您可以使用该设置 -- printf_support=minimal 、则需要的堆栈更少。

    请告知我此建议是否能解决问题。

    谢谢。此致、

    -乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我需要调用17个 sprintf 函数、我需要为它准备超过6.6kB 的栈吗?

    编号  当这17个调用之一时、所需的栈数量为400 +栈上已有的字节数  冲刺 f 呼叫开始。  如果可以使用编译器选项  -- printf_support=minimal 、将400更改为更低的数字。

    谢谢。此致、

    -乔治

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

    您好、George、

    感谢您的回复!

    我将 printf_support 更改为最小值、并按如下方式报告错误:

    您能帮助解决这个问题吗? 谢谢!

    此致、

    Jim

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

    因为使用了格式说明符 %f 、您不能使用 -- printf_support=minimal 。  必须使用默认值 -- printf_support=full

    谢谢。此致、

    -乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当这17个调用之一时、所需的栈数量为400 +栈上已有的字节数  冲刺 f 呼叫开始。

    您好、George、

    您的意思是、我只需要为17个 sprint 调用增加400个堆栈空间吗?

    将堆栈大小从0x180更改为0x310。

    此致、

    Jim

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

    很遗憾、在线文章错误。  一个呼叫 冲刺 f 需要大约1200 (0x480)字节的栈。  这是对 栈上当前字节数的补充 冲刺 f 初始化过程。   

    就像一个实验,让这个简单的程序工作...

    #include <stdio.h>
    
    int main()
    {
        char buf[32];
        sprintf(buf, "%f", 1.0);
    }

    在中查看结果 buf 工程。  无论您从使其正常工作中了解到什么、都可以将其应用到您的大型项目中。

    谢谢。此致、

    -乔治