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.

[参考译文] TMDSCNCD28379D:使用带有浮点数的 printf

Guru**** 2500235 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1552654/tmdscncd28379d-using-printf-with-float-numbers

器件型号:TMDSCNCD28379D
主题:SysConfig 中讨论的其他器件

工具/软件:

您好、

尝试向 UART 终端发送 ADC 读数。 将值作为整数(寄存器值)发送也可以、但当我尝试发送转换后的值(即浮点值)时、我遇到一个异常:

工作中:

sprintf (msg、“\r\n%s =%d [V]“、“Voltage =“、ADC_readResult (Vbat_base、ADC_SOC_NUMBER0));

不工作:

浮动    VBAT;

Vbat =(ADC_readResult (Vbat_base、ADC_SOC_NUMBER0))*(0.1871F);

sprintf (msg、“\r\n%s =%g [V]“、“电压=“、vbat);

以下是发生异常的屏幕截图:

此处显示了这是使用%g 将 VBAT 转换为字符串的步骤

下面是一个例外的屏幕截图,我不明白:

非常感谢任何帮助。

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

    有什么想法吗? 有人吗?

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

    尊敬的 Ehsan:

    这是栈 或堆内存不足导致的。 您可以使用%g 或%f 重新运行相同的 sprintf 调用、并为正确的内存区域分配足够的堆栈。 增加堆栈大小后、更新链接器命令文件以分配足够的存储器。

    有关更多信息、请参阅以下主题:

    (+) TMS320F28379D:sprintf 不允许错误#1558-D 64 位浮点 — C2000 微控制器论坛 — C2000Tm︎ 微控制器 — TI E2E 支持论坛

    (+) TMS320F280025C:无法使用 sprintf 处理错误“不允许 64 位浮点运算“- C2000 微控制器论坛 — C2000Tm︎ 微控制器 — TI E2E 支持论坛

    此致、

    Masoud

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

    尊敬的 Masoud:

    感谢您的建议。 您链接的两个线程处理编译器错误。 我正在处理运行时错误/崩溃。

    我不得不将自己的浮点数写入字符串转换函数、这暂时似乎不会导致崩溃。

    我怀疑 snprintf 库中的%g 和%f 格式不能安全地中断。 因为我注意到在转换(为中断提供服务)期间、我得到了另一个中断。

    这个问题肯定值得您的团队研究,因为编写这个基本功能, 即使功能有限,而不是测试所有的边缘案例,对于像我这样的用户来说是非常耗时的。

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

    您好:

    TI 的 C/C++编译器提供了一个--printf_support 标志、用于控制是否在 printf/sprintf 中启用浮点格式:

    - Full–支持所有格式说明符(包括浮点值)-这是默认行为。

    - nofloat–不包括对%f、%g、%e 及其大写版本的支持。

    -最小–仅支持%d、%s、%c、%x、%%—无浮点数或精度标志。

    如果您的项目是用 nofloat 或 minimal 生成的,则使用%g 或类似的说明符会导致未定义的行为,通常会导致崩溃或异常。

    您应  在 CCS 中检查--printf_support、并确保其设置为 Full、并确保--float_support=fpu32 和 相应的运行时库(例如 rts2800_fpu32.lib)可用。 此外、浮点 printf 会显著消耗更多的栈和堆、因此您必须分配足够的存储器以避免崩溃。 如果编译配置正确、则不应再发生崩溃。

    此致、

    Masoud

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

    您好、

    printf 支持设置为 full。 还提供了 rts2800_fpu32.lib 并用于构建中。 我将增加栈大小、看看它是否有所帮助。 如何更改堆的大小?

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

    堆只是链接器分配的 RAM 块。 您可以在此处进行更改:

    右键点击您的工程  >>选择“Properties">> Go“ Go to Build  >> C2000 Linker >> Basic Options  

    在右侧、可以找到 堆大小(–heap_size)和栈大小(–stack_size)。

    有时、项目会覆盖其链接器文件(.cmd 文件)中的堆/栈  、例如:--stack_size=0x200、您可以手动将它们向上移动。

    另外、最好监视“CCS Memory Allocation“视图、以确保不会使可用的 RAM 溢出。

    此致、

    Masoud

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

    谢谢 Masoud。 我错过了堆大小分配、因为它留空了。 我通过 SysConfig 将两个 RAM 块组合在一起、总长度为 0x6d5(根据生成的.map 文件)、其中 0x200 分配给堆栈。 这是否意味着我可以将未使用的部分 (0x2d5) 分配给堆内存? 我看不到.map 或.cmnd 文件中任何位置指定的堆位置

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

    BTW、您知道 printf 库是否使用动态内存分配?

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

    C 运行时堆位于.esysmem 段中。 其大小由链接器选项--heap_size 控制。 用户可以在 CCS 中进行设置:

    右键点击您的工程  >>选择“Properties">> Go“ Go to Build  >> C2000 Linker >> Basic Options  

    如果项目生成链接器命令文件、请确保将.esysmem 实际放置到具有足够可用空间的 RAM 区域中。 片段如下所示:

     

    SECTIONS
    
    {
    
       .stack   : > RAMLS5
    
       .esysmem : > RAMLS5   /* heap */
    
    }

    此致、

    Masoud

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

    printf 系列通常不会为 sprintf 分配动态存储器。 它们会写入您提供的缓冲区。 堆主要用于 malloc/new 等 API。

    此致、

    Masoud

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

    只是一个更新。 增加堆栈大小未解决问题。 “Memory Allocation“(内存分配)窗口还会显示为它们分配足够的内存。 我正在 CPU2 上成功使用%g、这可以排除所有构建问题 IMO。 printf 似乎不是线程安全的、因为 CPU1 和 CPU2 之间的唯一区别是 CPU1 正在处理 PWM 生成的中断。  

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

    很高兴在这里解决了这个问题! 我将该评论标记为已解决以供将来参考。

    此致、

    Masoud