编写适合自己需要的printf()函数

编写适合自己需要的printf()函数

ID:41635971

大小:55.08 KB

页数:3页

时间:2019-08-29

编写适合自己需要的printf()函数_第1页
编写适合自己需要的printf()函数_第2页
编写适合自己需要的printf()函数_第3页
资源描述:

《编写适合自己需要的printf()函数》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、编写适合自己需要的printf()函数对于嵌入式软件的开发人员而言,“prin廿调试(printf-debugging)”这个术语描述了将调试字符串从嵌入式目标空闲的串口压出,并在运行于宿主工作站的终端模拟器上显示结果的常见方法。出于这个目的,许多程序员更克欢使用有名的printf()C语言库函数,因为它在将文本输岀和数据组合成单个函数调用上具有灵活性。但是,不在嵌入式系统屮使用printf()无外乎两个常见的原因:不是因为printf()太慢了,就是因为它太大To事实上,很容易就会碰到这些局限性。如果你看一下标准C语言库的规范,原因就很明显了。Printf()必须处理大量的数据格式,

2、包括字符串、字符、(各种长度的有符号和无符号)数字,以及浮点值。此外,格式字符串可以包括用于更改文本对齐、基数、间距、字段宽度和精度的调节器和指示器。很清楚的是,任何支持整个规范的代码都会是兀长和繁重的。嵌入式系统库的提供商意识到了这个问题,于是提供了只使用整数的printf()实现。这就通过去掉不必要的浮点支持而稍稍改善了这种状况。但是即使如此,这些实现对于许多缺乏内存的嵌入式系统來说仍然太大了。在你每天的编程工作中,你到底需要多少printf()的规范?可能只需要“%s”、“%d”,以及“%x”?所以还有另一个选择:编写能够满足需要的你自己的最小prin廿()函数。这会带來相当大的

3、好处。例如,在最近一个项冃里,我替换掉了一个由制造商所提供的printf()库,它需要超过20KB的内存(这超过了可用内存的一半),而换上了一个小巧的只支持必要特性的自定义版本,它只需要不到500字节的内存空间。小巧的printf()下面是替换一个非常基本的printf()的例子:#includeintprintf(constchar*fmt,・・.)constchar*s;intd;charbuf[16];vajistap;va_start(ap,fmt);while{if(*fmt!=%){putchar(*fmt+4-);continue;}switch(*4

4、-+fmt){cases:s=va_arg(ap,constchar*);for(;*s;s++){putchar(*s);}break;cased:d=va_arg(ap,int);itoa(d,buf,10);for(s=buf;*s;s++){putchar(*s);}break;/*Addotherspecifiershere..・*/default:putchar(*fmt);break;}fmt++;}va_end(ap);return1;/*Dummyreturnvalue*/下面是一些值得注意的事情:为了节省空间,这个简单的printf()只支持“%s”和“%d”格式的

5、分类符,而不需要任何指示器或者其他调节器。扩展这个函数以支持其他分类符是相对较简单的。C语言的标准要求printf()应该返回输出字符串的数量。这个被返回的值通常被忽略掉了,所以这个轻型的printf()就不会劳心去计算它了,而是返回一个伪值。一般来说,putchar()这个函数会将字符发送到串口,更通行的方法是通过由中断驱动的串口输出缓冲区以避免延迟。首标文件<stdarg.h>是一个标准的库首标文件,它为访问传递给printf()的变量自变量列表提供小巧的宏,通常是通过系统堆栈。更进一步优化要注意,控制权在你手里,你可以在感觉需要的情况下做出任何优化,并轻易地添加你所需要的特性。你

6、要注意,上面的代码使用itoa()将整数转换成字符串。这个函数(为了简化的冃的没有列出来)涉及重复划分(repeateddivision),而且在很多嵌入式处理器上运行得相对较慢。下而是你可以考虑的几种优化方法:添加一个#define,它会控制%d是否将整数显示为I•进制或者十六进制数。如果你使用简单的位移(bit-shift)而不是长的划分来实现到十六进制数(等同于使用“%x”分类符)的转换,那么这一转换在大多数处理器上会快得多。然后你就能够在编译的时候为“%x”取得输出格式:快速的十六进制数或者缓慢的十进制。将整数到文本冗长的转换转移到工作站上。例如,当碰到“%x”分类符的时候,嵌

7、入式处理器能够轻易地发送一个未使用的ASCII码,比如说0x01,并跟有原始的整数字节。不幸的是,这种方法需要一个在你工作站上运行的自定义终端程序,以解码它所获得的字节流,并在显示字符串之前实现必要的整数到文木的转换。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。