C中的任何函数而不是sprintf()?编译后代码大小太大

Dja*_*ngo 8 c embedded printf cortex-m3 keil

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

当我想发送整数浮点数时,我使用sprintf()将它们转换为字符串并将它们发送到串行端口.

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

任何线索?

Mar*_*son 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'的选项(意味着更多的代码大小).支持前导零和字段宽度.没有浮点支持.


Lun*_*din 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';
}
Run Code Online (Sandbox Code Playgroud)

  • @MartinThompson我不确定可以做些什么,小数是基于10的,但计算机更喜欢基于2/4/8/16/32的.此外,我宁愿将优化留给编译器. (3认同)
  • 如果你的micro没有硬件分频器......(或模数:),我不确定这是一个非常快速/高效的功能.虽然我没有更好的选择! (2认同)

Omk*_*ant 0

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

我认为这应该可行。

  • C 语言中没有名为 itoa 的函数,也没有名为 ftoa 的函数。 (5认同)