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.

[参考译文] TMS320F2808:printf() 格式说明符不起作用、但它们在 sprintf() 中起作用。

Guru**** 2577385 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1561279/tms320f2808-printf-format-specifiers-do-not-work-however-they-do-work-in-sprintf

器件型号:TMS320F2808


工具/软件:

以下代码片段...

  无符号 LOOP_COUNT = 0
  对于(;;LOOP_COUNT++)
  {
    静态字符 scratch_buffer[40]
    printf(“Hello from printf ()%u\n“、loop_count);
    unsigned int length = sprintf (scratch_buffer、“Hello from sprintf ()%u\n“、loop_count);
    HAL_UART_TX (&keypad_UART、(uint8_t*) scratch_buffer、length、HAL_ms_to_timer_counter (10000));

    stopwatch_delay (stopwatch_s_to_ticks (1));
  }
...produces 输出如下:
即格式说明符%u 不适用于 printf()、但它适用于 sprintf()。
几点:
  • 使用 CCS 版本 20.2.0.12___1.5.0。
  • 简单应用。  几乎只是 main() 中的上述循环。
  • fputc() 已被替换以将 stdout 输出到 SCI。
  • 栈大小设置为 0x400。
  • 堆大小设置为 0x800。
对于如何解决此问题、有什么建议吗?
谢谢!
Bruce
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Bruce、

    我们将就此回复您。

    此致、

    Aishwarya

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

    谢谢 Aishwarya、

    其他一些注意事项...

    • 并非所有格式指定符都会失败。  %s 似乎工作正常。  %d 和%u 没有。
    • 考虑到 sprintf() 似乎可以正常工作、作为临时的快速修复程序、我将使用 sprintf () 创建一个 printf_replacement ()、并使用编译时宏来替换 printf () 的实例。  

    再次感谢!

    Bruce

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

    您好 Bruce、

    需要检查以下几点:

    1. 您使用的是其中之一 printf_support 您的项目中有标记? 如果没有、您可以尝试添加 printf_support=full 选项、看看它是否会改变行为? 您可以通过右键点击工程并选择 Properties  >> Build >> C2000 Compiler >> Edit Flags 来检查/添加标志。
    2. 此外、您能否查看.map 文件并查看正在为 printf 链接哪个函数、从而查看正在提取哪个运行时库文件?

    此致、

    Delaney

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

    我正在尝试使用“nofloat"...</s>“

    当我选择“最小“时、会产生编译时间错误。

    选择“Full"具有“具有相同的行为。

    以下是选择“nofloat"时“时.map 文件中的条目...

    .text 0 003f4000 0000330d
    003f4000 00000922 led_control.obj (.text)
    003f4922 000006ce processor_tasks.obj (.text)
    003f4ff0 000005ca rts2800_ml.lib:_printfi.c.obj (.text:_TI_printfi_nofloat)
    003f55ba 0000030a uart.obj (.text)
    

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

    您好 Bruce、

    您能否展示所遇到的编译器错误 printf_support=full ? 我相信这是你想用你的%d 和%u 说明符来处理 printf() 的选项。

    此致、

    Delaney

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

    尊敬的 Delaney:

    实际上、当 printf_support=full 时不会出现编译错误。  我很可能不清楚这一点。  仅当 printf_support=minimal 时才会出现编译错误。

    printf_support=full 时的行为与 printf_support=nofloat 时的行为相同... 格式指定符不会扩展。

    谢谢!

    Bruce

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

    您好 Bruce、

    我可以看到、printf_support 值并不像这里存在问题。 让我尝试在我的设置中复制此行为、并在 1-2 天内回复您。

    此致、

    Delaney

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

    您好 Bruce、

    对延迟深表歉意。 我意识到您使用的是非常旧的 F2808x 器件。 遗憾的是、我无法访问此器件的硬件或软件来进行测试。  

    我尝试使用与您提供的代码相同的代码在 F28P65x 上测试此代码、但没有发现问题。 您是否能够切换到更新的器件? 此外、您使用的哪个编译器版本适用于 F2808x?

    此致、

    Delaney

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

    尊敬的 Delany:

    是的、F2808 非常旧。  然而、在我们的设计周期中、切换到较新的器件已经太晚了。

    我们正在使用最新版本的 CCS。  (20.2.0.12_1.80)  如果你问是否有一个编译器版本,其中 printf() 是工作的,我不知道。  这是我们第一次尝试使用 printf()。

    我猜 F2808 的问题在于其 RAM 空间有限。  我们可分配的最大堆和栈为每个 0x400。  您能否检查 F28P65x 工程的堆和栈大小?  如果您设置为 0x400 会发生什么情况?

    我认为 printf() 在 iostream 层的某个位置崩溃。  我们的 UART_printf () 实现绕过流层并直接写入 UART。  这似乎是一项有效的工作。  因此,并不是完全有必要让 printf() 正常工作。

    谢谢!

    Bruce

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

    我认为我们使用的编译器版本为 TI v22.6.1.LTS。

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

    您好 Bruce、

    是的、让我使用 F28P65x 工程检查堆和栈大小并返回给您。 此外、以下是一些其他 printf 文档供您参考: printf 的使用技巧

    此致、

    Delaney

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

    您好 Bruce、

    我在 F28P65x 上使用的栈大小似乎是 0x3F8、堆大小仅为 0x200、因此我认为这不是问题。  

    我相信 printf() 在 iostream 层的某个位置崩溃。  我们的 UART_printf () 实现绕过流层并直接写入 UART。  这似乎是一项有效的工作。  因此,并不是完全有必要让 printf() 正常工作。

    这可能是您的最佳方法、因为我无法在我的设置中重现问题、因此很难确定您看到的行为的原因。 我会关闭此主题、但如果您有任何其他问题、请随时提出其他问题。  

    此致、

    Delaney