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.

[参考译文] TMS320F28379D:sprintf 不允许使用错误#1558-D 64位浮点

Guru**** 2536880 points
Other Parts Discussed in Thread: SFRA, C2000WARE, TMS320F28379D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1299579/tms320f28379d-error-1558-d-64-bit-floating-point-not-allowed-for-sprintf

器件型号:TMS320F28379D
主题中讨论的其他器件:SFRAC2000WARE

我需要使用 sprintf 将浮点变量放入字符串中。 具体的类型是 float32_t。 我将收到编译器错误1558-D、并显示  

"不允许64位浮点运算"

我查看了帮助页面,发现了对一个标志变量的引用,该变量可以设置为"--printf_support=full"。 帮助页面上显示 full 是默认值、但万一我将其添加到我的项目属性中、则可以在 C2000编译器页面上执行此操作。 它没有帮助。

您能告诉我在 sprintf 呼叫中使用%f 的技巧吗?

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

    您好、Fred、

    您能否在参考中显示控制台输出和代码行? 是否会显示任何其他错误或警告? 您能否验证当前项目和其中包含的任何库是为 FPU32模式构建的? 您的代码中是否在其他位置有任何64位浮点值?

    此外、请查看该主题以查看其中的任何信息是否有帮助: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/905572/ccs-tms320f28388d-sprintf-floating-point-fails-on-cm-core

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

    早上好。 作为回应:

    1) 1)控制台输出:

    "C:\\ti\\ccs1220\\ccs\\utils\\bin\\gmake"-k -j 4 all -O

    生成文件:"../Vienna_main.c"
    调用:C2000编译器
    "c:sdk"/ti/ccs1220/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS/bin/cl2000 -v28 -ml -mt -- cla_support=cla1 - float_support=fpu32 --tmu_support=tmu0 -- vcu_support=vcu2 -O1 /Users/fred.schreiber/workspace_v12/pfc3phvienna_F2837x/device -- opt_for_speed=5 /ti/C2000--- fp_mode=relaxed Ware_Digital -/Users/fred.schreiber/workspace_v12/pfc3phvienna_F2837x /Users/fred.schreiber/workspace_v12/pfc3phvienna_F2837x/libraries/CLAmath /Users/fred.schreiber/workspace_v12/pfc3phvienna_F2837x/libraries/power_measurement /Users/fred.schreiber/workspace_v12/pfc3phvienna_F2837x/libraries/sfra /ti/ccs1220/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS/include /Users/fred.schreiber/workspace_v12/pfc3phvienna_F2837x/libraries/utilities /Users/fred.schreiber/workspace_v12/pfc3phvienna_F2837x/libraries/DCL /ti/C2000Ware_Digital

    >>编译失败
    subdir_rules.mk:26:目标"vien_main.obj"的配方失败
    "../Vienna_main.c"、第624行(第25行):错误#1558-D:不允许使用64位浮点运算
    "../Vienna_main.c"、第624行(第25行):错误#1558-D:不允许使用64位浮点运算
    "../Vienna_main.c"、第624行(第25行):错误#1558-D:不允许使用64位浮点运算
    "../Vienna_main.c"、第624行(第25行):错误#1558-D:不允许使用64位浮点运算
    "../Vienna_main.c"、第624行(第25行):错误#1558-D:不允许使用64位浮点运算
    "../Vienna_main.c"、第624行(第25行):错误#1558-D:不允许使用64位浮点运算
    6在编译"../Vienna_main.c"时检测到错误。
    gmake:***[VIENNA_MAIN.obj]错误1
    gmake:由于错误、未重制目标"all"。

    ****构建完成****

    无其他错误或警告

    源代码行:

    sprintf ((char*) xmit_buf、"X、%8.3f、%8.3f、%8.3f、%8.3f、%8.3f、%8.3f、%8.3f、**"、
           VIENNA_guiV1_Volts、VIENNA_guiV2_Volts、VIENNA_guiV3_Volts
           VIENNA_guiIL1_Amps、VIENNA_guiIL2_Amps、VIENNA_guiIL3_Amps);

    这些 Vienna 变量全部为 float32_t

    2)(FPU32) fpu32显示在"Properties"、"compiler"-> processor options"下。 此外、主编译器窗口有"标志摘要"、其中包括--float_operations_allowed=32。

    我只能假设使用的库是为32位浮点构建的。 这是一个执行大量浮点数学运算的旧 TI 示例项目。

    香港特别行政区政府

    3) 64位。 我在项目中搜索了 double 和 float64_t。 它们不会出现在任何源代码中。 这加上属性调用32位类型这一事实表明没有64位浮点数。

    4)我看着那个链接。 这表示可能需要增加堆栈以支持 sprintf 的浮点。 这看起来有点奇怪(堆栈只是刚刚还勉强够大吗?)、而且也没有显示堆栈错误。 但以防万一、您能快速说明如何增加堆栈大小吗? 仅供参考在 properties->C2000链接器下,标志包括--stack=0x380。 我是否只是增加这个数字? 或者,如果我这样做,所有的地狱会松散吗?

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

    我需要我可以在我身边复制的内容、您可以创建一个像我下面的片段那样简单的示例吗? 我能够构建它而不会出现任何错误。

    #include <stdio.h>
    #include <stdlib.h>
    
    void main(void)
    {
        float32_t temp = 8.0;
        char *transmit_buff;
        sprintf ((char*)transmit_buff, "X, %8.3f", temp);
        while(1);
    }

    [报价 userid="559688" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1299579/tms320f28379d-error-1558-d-64-bit-floating-point-not-allowed-for-sprintf/4934335 #4934335"]但是为了以防万一,您能给我一个关于如何增加堆栈大小的快速指示吗? 仅供参考在 properties->C2000链接器下,标志包括--stack=0x380。 我是否只是增加这个数字? 或者,如果我这样做,所有的地狱会松散吗?[/报价]

    如果右键点击工程并选择 Project Properties、则可以导航到以下窗口并增加大小:

    如果您将数量增加得过大、则会收到错误消息、说明如下(编译器和链接器在分配存储器位置时会检查此类问题):

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

    再次大家好、Omer、

    我尝试重复您的小项目。 它编译时没有编译器错误。 它确实给出了一个警告:

    警告#10210-D:创建默认大小为0x400的".esysmem"段;使用-heap 选项更改默认大小

    我认为这意味着我可能会考虑增加堆大小、但主要的一点是它确实允许 sprintf 调用。 这里是我的源文件、让您可以看到我所做的一切:


    /**
    * main.c
    */
    #包含
    #包含
    #包含

    int main (空)
    {
    浮点温度= 8.0;
    char *xmit_buf;

    xmit_buf =(char*) malloc (80);
    sprintf (xmit_buf、"X =%8.3f\n"、temp);

    while (1);

    我添加了 malloc 调用、以便在初始化 xmit_buf 之前越过有关使用它的警告。 我还使用了普通的"float"类型、因为 float32_t 需要更多的#include。

    因此、我的主项目中似乎有些东西与 sprintf 混乱。 我不记得我是否提到过这一点、但该项目取自一个名为 pfc3phvienna_F2837x 的 TI 示例。

    我将添加 sprintf、以便我可以构建一条 ASCII 消息、将一些重要数据发送到操作员界面。

    我发现"基本"属性页并增加了堆栈大小。 原来的为0x380。 我尝试了0x400、然后是0x800。 在这两种情况下、我仍然会  看到相同的"Floating Point Not Allowed"消息。 因此、我认为堆栈大小不是问题所在。

    如果我向您发送所有编译器和链接器标志、会有所帮助吗? 还有其他想法吗???

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

    您好、Fred、

    我不熟悉该示例工程、但如果它编译良好的 C 代码、那么它应该不会有任何不同。  最后一个调试步骤是在您的项目中逐个交换不同的配置、以便缩减版本。 我知道这可能 需要一段时间、但这将是确定编译器以不同方式工作的最彻底的方法。 为了简化此过程、您可以查看"Project Properties"中的 C2000 Compiler 和 C2000 Linker 设置、找到差异并逐个更改它们、直到您重现相同的错误。

    如果这样不起作用、下一步是验证所使用的头文件和文件/库路径(也在"工程属性"中)、以确保正确包含所有内容。

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

    你好,再次 Omer

    我仔细研究了两个项目的属性、从崩溃项目逐渐向工作项目添加编译器标志。 我确实找到了原因。 它是"ABI"标志。 新项目使用--abi=eabi。 测试项目使用--abi=coffabi。 coffabi 是默认分配的。 我没有明确地予以补充。

    当我将 coffabi 更改为 eabi 时、测试项目出现"floating point not allowed"编译器错误。 为了好玩,我尝试了 coffabi 在我的真实项目,但构建中止了一个新的错误:"目标文件有不兼容的格式"。  

    很遗憾、我不能理解这一点。 ABI 表示应用程序二进制接口。 我发现的描述表明项目中的所有对象必须兼容、我认为这就是为什么我的项目不能使用 coffabi 构建的原因。 毫无疑问、基线 TI 样片的组件是使用较新的 eabi 构建的。

    我不明白的是、为什么在 sprintf 中使用 eabi 不允许浮点 op 如果 stdlo 库是使用 coffabi 构建的、我希望看到不兼容的格式错误。 大家能告诉我为什么 eabi 导致了此错误吗? 是否有权变措施?

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

    下面是一个用于演示问题的简化示例。

    /* file.c */
    #include <stdio.h>
    
    void test_float(float arg)
    {
        printf("%f\n", arg);
    }

    构建它...

    $ cl2000 --abi=eabi --float_operations_allowed=32 file.c
    "file.c", line 6 (col. 11): error: 64-bit floating point operations are not allowed
    1 error detected in the compilation of "file.c".
    
    >> Compilation failure

    当对 浮点 变量作为参数传递到 printf 或接受可变数量参数的任何函数,它将自动提升为 双精度 。  在 COFF ABI 下、 浮点 双精度 都是32位、这意味着不会发生任何情况。  在 EABI 下、 浮点 是32位和 双精度 是64位、因此会发生自动升级。  但是、设置 -- float_operations_allowed=32 导致发出错误诊断。

    是否有变通办法?

    隔离调用 Code Composer Studio 冲刺 一个文件中、然后无需构建 -- float_operations_allowed

    谢谢。此致、

    -乔治

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

    George、您好!

    感谢您的建议。 有道理。 但我还是不熟悉 CCS。 float_operations_allowed=32是整个项目属性的一部分。 如何为一个文件自定义编译器属性、但将其保留在项目的其余部分?

    -FS

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

    文件特定的选项功能访问 CCS。

    谢谢。此致、

    -乔治

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

    器件型号:TMS320F28379D

    这是关于编译器错误1558的早期线程的后续步骤、sprintf 不支持浮点。

    我能够将 sprintf 调用放入单独的文件中、并使用特定于文件的选项来删除标志"float_operations_allowed=32"。

    这解决了编译器错误、但程序仍然没有运行。 我发现另一个 E2E 线程建议增加堆栈大小、以便将 sprintf 用于浮点数据。

    我通过将链接器.cmd 文件从更改为来增加堆栈:

    RAMM1       : origin = 0x000400, length = 0x000400

    至:

    RAMM1       : origin = 0x000400, length = 0x001000

    (在 cmd 文件的后面、堆栈会分配给 RAMM1 (.stack  : > RAMM1  page=1)

    这些更改不会阻止程序运行。 但是、当我实际将项目属性中的堆栈大小从0x380更改为0x400时、程序在启动后会立即中止。

    我在调试器中运行了两次、最多有两个不同的位置、然后中止此错误:

    断点管理器:启用此函数时出错:无法使用现有的 AET 资源完成此任务。

    在这一点上,我不知道要探索的兔子洞。 我应该读取"AET 资源"、还是应该在链接器 cmd 文件的 DOS 和 Don ts 上读取。

    我将拖动 cmd 文件、以及两个构建的.map 文件(stack=0x380和 stack=0x400)。

    大家能为我指出正确的方向吗?

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

    关于:

    断点管理器:启用此函数时出错:无法使用现有的 AET 资源完成此任务。

    在这一点上,我不知道要探索的兔子洞。 是否应该阅读"AET 资源"

    [/报价]

    请参阅:

    https://dev.ti.com/tirex/explore/node?node=A__AFxRAHEqhlcitK5yopkNoA__ccs_devtools__FUz-xrs__LATEST

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

    Ki 您好、

    我并不认为这是调试器的问题、尤其是因为我尚未设置任何观察点、事件计数器或分析时钟。 实际上、您发送的链接表明软件断点不使用任何资源。

    由于此问题仅在我将链接器属性中的堆栈大小从0x380更改为0x400后发生、因此我必须确信我更改堆栈大小的方式有一些错误、 或者、稍大的堆栈与我的存储器映射方式之间会发生某种冲突。 映射文件中是否有任何内容表明存在问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于此问题只在我在链接器属性中将堆栈大小从0x380更改为0x400后发生,因此我必须相信我更改堆栈大小的方式有问题, 或者、稍大的堆栈与我的存储器映射方式之间会发生某种冲突。 映射文件中是否有任何内容表明存在问题?

    我不能对此作出评论。 我只想说明 AET 误差的含义。

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

    谢谢 Ki。 感谢您这么快的回复。 是否有其他人可以确定我在确定堆栈大小方面的问题?

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

    通过将链接器.cmd 文件从更改为来增加堆栈:

    RAMM1       : origin = 0x000400, length = 0x000400

    至:

    RAMM1       : origin = 0x000400, length = 0x001000

    (在 cmd 文件的后面、堆栈会分配给 RAMM1 (.stack  : > RAMM1  page=1)

    [/报价]

    请注意、这里不会增加堆栈大小。 您所做的就是修改指定的 RAMM1存储器范围(我认为不推荐这样做)。

    https://dev.ti.com/tirex/explore/node?node=A__APJQ1q8Ox6tOF4TmB4THeg__ccs_devtools__FUz-xrs__LATEST

    但当我实际将项目属性中的堆栈大小从0x380更改为0x400

    这是增加堆栈大小的正确方法。

    RAMM1是片上 RAM 块 M1。 我不知道这个实际大小有多大、但它最初设置为长度0x400。 也许您需要将.stack 段分配到具有更多空间的存储器区域。

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

    当您进行此更改时...

    将链接器.cmd 文件从

    RAMM1       : origin = 0x000400, length = 0x000400

    至:

    RAMM1       : origin = 0x000400, length = 0x001000

    [/报价]

    ... 您必须确保实际系统中存在存储器。  链接器和相关工具盲目地相信此规范是正确的。  如果不是这样、事情就不会工作、也无法预测这些事情是什么。

    考虑到这一点、请使堆栈尽可能大。  看看是不是有问题。

    请在下一篇文章中附加链接器映射文件。  以便论坛接受该文件、添加文件扩展名 .txt 反馈回路。

    谢谢。此致、

    -乔治

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

    感谢 Ki 和 George、

    我没有意识到 RAMM1条目(很可能)与芯片上该块的大小耦合。 我将其恢复到原始大小。

    为了解决这个问题、我将堆栈移动到 RAM 中一个否则未使用的部分(在.cmd 文件中)、然后在链接器属性中增加它。 这(以及将 sprintf 放入单独的文件中、然后在不需要的情况下构建它、  -- float_operations_allowed=32 )似乎解决了问题。  

    现在、项目构建并运行正常、sprintf 使用%f 处理浮点数据。

    我将选中已解析的复选框、但我想知道可以在何处看到片上存储器布局的说明。 我有技术参考手册 pdf 文件、但没有 RAM 细分。 如果你们能告诉我在哪里可以找到它、我会很感激。

    愉快的假期!!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    但我想知道在哪里可以看到片上内存布局的说明。 我有技术参考手册 pdf 文件、但没有 RAM 细分。 如果你们能告诉我在哪里找到它,我会很感激。

    见第179页、共: https://www.ti.com/lit/ds/symlink/tms320f28375d.pdf