8

我正在开发一个嵌入式系统(Cortex M3)。为了将一些数据从设备发送到串行端口(显示在 PC 屏幕上),我使用 putchar() 方法使用了一些自己的函数。

当我想发送integerfloat时,我使用 sprintf() 将它们转换为字符串并将它们发送到串行端口。

现在,他们的问题是我使用的是 Keil uVision IDE,它是最大 32 KB 的有限版本。每当我在不同的函数中调用 sprintf() 时,我都不知道为什么编译后的代码大小增加了太多。我现在已经超过 32 KB,我想知道我必须更改我的一些函数并使用其他东西而不是 sprintf!

有什么线索吗?

4

3 回答 3

9

两种潜在的产品(我自己都没有使用过 - 我的编译器供应商通常会提供精简版printf以供嵌入式使用):

http://eprintf.sourceforge.net/ - [2017 年 9 月:不幸的是,似乎已经消失了,但源代码仍然在这里:https ://sourceforge.net/projects/eprintf/files/ ]

http://www.sparetimelabs.com/tinyprintf/index.html - 2 个文件,大约 1.4KB 代码。启用“longs”的选项(意味着更多的代码大小)。支持前导零和字段宽度。没有浮点支持。

于 2012-10-25T10:27:02.707 回答
8

如果您希望它高效,最好的方法可能是自己编写代码,或者在网上找到一些已经编写好的代码。然而,int 到字符串的转换非常简单,每个程序员都可以在 30 分钟内完成。浮点到字符串的转换有点复杂,取决于使用的浮点格式。

为方便起见,这里有一个简单的 int-to-string 算法,用于微控制器应用:

void get_dec_str (uint8_t* str, size_t len, uint32_t val)
{
  uint8_t i;
  for(i=1; i<=len; i++)
  {
    str[len-i] = (uint8_t) ((val % 10UL) + '0');
    val/=10;
  }

  str[i-1] = '\0';
}
于 2012-10-25T09:25:21.690 回答
0

您可以尝试itoa()ftoa()实现这些作为您的要求。我的意思是他们将这些转换为定义本身内的字符,putchar()用于直接打印。

我认为这应该可行。

于 2012-10-25T08:38:56.037 回答