C中有没有函数可以代替sprintf()?编译后代码大小太大

zrfyljdw  于 2023-08-03  发布在  其他
关注(0)|答案(3)|浏览(173)

我正在开发一个嵌入式系统(Cortex M3)。为了将一些数据从设备发送到串行端口(在PC屏幕上显示),我使用了一些自己的函数,使用putchar()方法。
当我想发送integerfloat时,我使用sprintf()将它们转换为字符串并将其发送到串行端口。
现在,他们的问题是,我正在使用Keil uVision IDE,它是有限的版本,最大32 KB。每当我在不同的函数中调用sprintf()时,我不知道为什么编译后代码的大小增加了太多。我现在已经超过了32 KB,我想知道我必须改变我的一些函数,使用其他的东西而不是sprintf!
有线索吗

dldeef67

dldeef671#

有两种可能的版本(我自己都没有用过--我的编译器供应商通常提供一个精简版的printf供嵌入式使用):
http://eprintf.sourceforge.net/- [2017年9月:不幸的是,似乎已经消失了,但源代码仍然在这里:]
http://www.sparetimelabs.com/tinyprintf/index.html- 2个文件,约1.4KB代码。启用“longs”的选项(意味着更大的代码大小)。支持前导零和字段宽度。没有浮点支持。

oewdyzsn

oewdyzsn2#

如果你想让它更高效,最好的方法可能是自己编写代码,或者在网上找到一些已经写好的代码。Int到字符串的转换非常简单,每个程序员都可以在不到30分钟的时间内完成。浮点数到字符串的转换有点复杂,取决于所使用的浮点格式。
为了方便起见,这里有一个简单的int到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';
}

字符串

iezvtpos

iezvtpos3#

你可以尝试itoa()ftoa(),并根据你的需求实现它们,我的意思是,当它们将它们转换为定义本身内部的字符时,使用putchar()直接打印。
这应该是工作,我认为。

相关问题