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.

[参考译文] UCD3138A:printf 的执行挂起 CPU

Guru**** 2551570 points


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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1044450/ucd3138a-execution-of-printf-hangs-cpu

器件型号:UCD3138A

大家好、我想将 printf 的输出重定向到 uart0、输出重定向非常简单:

int fputc(int ch, FILE *f)
{
 while(Uart0Regs.UARTTXST.bit.TX_RDY == 0) {}
 Uart0Regs.UARTTXBUF.all = ch;

 return ch;
}


但我只能打印一次... 然后 CPU 挂起。 当我将 printf 添加到函数中时、也不会重定向 fputc、我会收到警告:
#10247-D 创建不带段的输出段".sysmim"

从现在开始、每次使用 printf 或 sprintf 都会使 CPU 挂起、而代码 sprintf 中的 printf 不起作用。
我将 CCS v10.3与编译器 TI v5.2.9结合使用
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    快速演练是使用这种轻量级 printf 替代方案:

    github.com/.../printf

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

    Tomasz、我不是 C 语言文件实现方面的专家、因此我无法说出 printf 和 sprintf 之间的区别。   我有 printf 的相关经验、仅为了执行浮点转换而抓取数百字节的堆栈、  并且通常是一个内存日志、因此我们尚未包含对它的支持。  C2000的 CCS 上的代码、而不是 UCD、但我怀疑 UCD 是类似的。

    如果您可以摆脱 sprintf、我建议您使用它、但请检查您的堆栈使用情况。   在 C2000上、它很复杂、因为它抓取了几百个字节、然后只是使用了离堆栈顶部较远的字节。  实际上、它完全从分配给该级别的堆栈中退出并进入另一个堆栈、因此很难检测到。   

    在开发 PMBus 存储器调试器之前、我们曾使用 UART 进行调试。  我们有大量用于将数字直接输出到 UART 上的函数以及字符串。  如果可以、我强烈建议您使用这些。  在 uart.c 的 PFC 代码中、它们仍然保持在线、虽然不被太多调用、网址为:

    www.ti.com/.../UCD3138PFCEVM-026。