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.

[参考译文] Compiler/TMS320F28388D:sprintf()在 c28内核中失败

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/894036/compiler-tms320f28388d-sprintf-failed-in-c28-core

器件型号:TMS320F28388D
主题中讨论的其他器件:C2000WARE

工具/软件:TI C/C++编译器

尝试使用 sprintf() c28内核运行代码:

uint16_t tempBuf[50];

sprintf (char *) tempBuf、"(%.1f)"、0.1);

成功构建工程、无警告。 单步进入 sprintf(),它在 __TI_printfi()中失败并跳转到 Interrupt_illegalOperationHandler(),然后被自由化。

在工程属性中、"printf"的级别设置为"full"。  堆栈大小为4K。

需要一些建议。 谢谢。  

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

    按任何顺序尝试这两个建议。

    设置浮点数格式是 sprintf 做的一件更复杂的事情。  尝试设置 int 格式。

    自...

    [报价用户="Andy Fung"]堆栈大小为4K。

    (笑声) 您可能没有使堆栈溢出。  但您可能已经用完了堆。  使堆更大。  使用链接器选项--heap_size=number

    请告诉我发生了什么。

    谢谢、此致、

    乔治

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

    您好、George、

    将堆大小增加到0x1000。 但是、仍然存在相同的问题。  

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

    您可以设置 int 格式吗?

    谢谢、此致、

    乔治

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

    您好、George、

    是的。 格式化 int 时没有问题、但使用 float 时失败。 我需要设置浮点格式。

    谢谢、

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

    在 ARM 内核上格式化浮点没有问题。 因此、不确定 c28内核上的问题是什么。

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

    对于调用 sprintf 的源文件、请按照文章 如何提交编译器测试用例中的说明进行操作。  此外、将链接器命令文件附加到下一个帖子。  因此论坛将接受它、请将文件扩展名.txt 添加到其中。

    谢谢、此致、

    乔治

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

    您好、George、

    请检查随附的以下内容。 谢谢。

    编译文件:"../source.c"
    调用:C2000编译器
    "c /ti/c2000/C2000Ware_2_01_00_00/driverlib/f2838x/driverlib:/ti/ccs930/ccs/tools/compiler/ti-cgt-c2000_18.12.4.LTS/bin/cl2000 -v28 -ml -mt --cla_support=cla2 -float_support=fpu64 -idiv_support=idiv0 -tmu_support=tmu0 -vcu_support=vcu_support=clus-fpfp_model -fp_model=-fpref_exce_trus_exclus_tradote_exclus_exclus_trus_exclus_trus_exclus_trus_exclus_tradote_trus_exclus_exclus_trus_exclus_trus_exclus_trus_trus_trus_exclus_trus_trus_exclus_trus_trus_trus_trus_exclus_trus_trus_trus_exclus_trus_trus_trus_trus_trus_exclus_trus_trus_exclus_exclus_trus_trus_trus_exclus_exclus//ti/ccs930/ccs/tools/compiler/ti-cgt-c2000_18.12.4.LTS/include
    已完成建筑:"../source.c"

    e2e.ti.com/.../source.pp.txt

    e2e.ti.com/.../2838x_5F00_RAM_5F00_lnk_5F00_cpu1.cmd.txt

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

    你好

    您在为堆栈和堆分配额外内存方面是正确的。

    但是、您似乎只在 CCS 中进行了该调整、而不是在链接器命令文件中进行了调整。 当前堆栈和堆共享0x1000字。

    更新链接器命令文件以将堆栈和堆段链接到更大的存储器段(可能是 RAMGSx)。

    此致

    Chris

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

    您好 Chris、

    我更新了链接器命令文件中的堆栈和堆大小。 您可以在我附加的 cmd 文件中看到它。  

    谢谢、

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

    Andy、

    我看不到您的附件。 这是否解决了您的问题?

    此致

    Chris  

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

    您好 Chris、


    4月4日上一帖子中随附的文件。  

    谢谢、

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

    Andy

    是的、我查看了该链接器。 它只将0x1000字分配给堆栈和堆(它们共享的堆)。

    您需要更新链接器命令文件以将堆栈和堆段链接到更大的存储器段(可能是 RAMGSx)。

    此致

    Chris

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

    您好 Chris、

    我更新了 cmd 文件、如下所示:

    堆:> RAMM1 | RAMGS11 | RAMGS12 | RAMGS13
    stack:> RAMM1 | RAMGS11 | RAMGS12 | RAMGS13

    每个都有0x1000。 不过,我仍有同样的问题。

    谢谢、  

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

    Andy、

    不确定这是否能解决问题、最好使用组合部分进行测试。  

    与链接器中的 RAMLS0如何将 LS0与 LS3相结合类似、我希望您组合一些 RAMLSx 或较低的 GS RAMGS0/1/2、以便您至少拥有0x2000个字。 每个0x1000的堆栈和堆应该就足够了。

    将此组合存储器段分配给.heap 和.stack、以查看是否修复了它。

    此致

    Chris

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

    您好 Chris、

    我按如下所示更新了 cmd 文件、sprintf 现在正在工作。 RAMLS0与 RAMLS2 /RAMLS3 /RAMLS4/RAMLS5结合使用  

    RAMLS0       :origin = 0x008000、length = 0x3000

    heap :>RAMLS0
    .stack:> RAMLS0

    我用 RAMGSx 尝试了类似的东西。 将 RAMGS6 / RAMGS7 / RAMGS8 / RAMGS9 / RAMGS10组合在一起、但它不起作用。 原因是什么?   

    谢谢

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

    Andy、

    很棒!

    我想这不起作用的原因是堆栈空间超出了低64k 字。

    http://software-dl.ti.com/ccs/esd/documents/c2000_c28x-compiler-understanding-linking.html#types-of-compiler-sections

    此致

    Chris