- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编写适合自己需要的printf()函数
编写适合自己需要的printf()函数对于嵌入式软件的开发人员而言,“printf调试(printf-debugging)”这个术语描述了将调试字符串从嵌入式目标空闲的串口压出,并在运行于宿主工作站的终端模拟器上显示结果的常见方法。
出于这个目的,许多程序员更喜欢使用有名的printf() C语言库函数,因为它在将文本输出和数据组合成单个函数调用上具有灵活性。但是,不在嵌入式系统中使用printf()无外乎两个常见的原因:不是因为printf()太慢了,就是因为它太大了。
事实上,很容易就会碰到这些局限性。如果你看一下标准C语言库的规范,原因就很明显了。Printf()必须处理大量的数据格式,包括字符串、字符、(各种长度的有符号和无符号)数字,以及浮点值。此外,格式字符串可以包括用于更改文本对齐、基数、间距、字段宽度和精度的调节器和指示器。很清楚的是,任何支持整个规范的代码都会是冗长和繁重的。
嵌入式系统库的提供商意识到了这个问题,于是提供了只使用整数的printf()实现。这就通过去掉不必要的浮点支持而稍稍改善了这种状况。但是即使如此,这些实现对于许多缺乏内存的嵌入式系统来说仍然太大了。
在你每天的编程工作中,你到底需要多少printf()的规范?可能只需要“%s”、“%d”,以及“%x”?所以还有另一个选择:编写能够满足需要的你自己的最小printf()函数。
这会带来相当大的好处。例如,在最近一个项目里,我替换掉了一个由制造商所提供的printf()库,它需要超过20 KB的内存(这超过了可用内存的一半),而换上了一个小巧的只支持必要特性的自定义版本,它只需要不到500字节的内存空间。
小巧的printf()? 下面是替换一个非常基本的printf()的例子:
#include stdarg.h
intprintf(const char *fmt, ...){??? const char *s;??? int d;??? char buf[16];??? va_listap;??? va_start(ap, fmt);??? while (*fmt) {??????? if (*fmt != %) {??????????? putchar(*fmt++);??????????? continue;??????? }??????? switch (*++fmt) {??????????? case s:??????????????? s = va_arg(ap, const char *);??????????????? for ( ; *s; s++) {??????????????????? putchar(*s);??????????????? }??????????????? break;??????????? case d:??????????????? d = va_arg(ap, int);??????????????? itoa(d, buf, 10);??????????????? for (s = buf; *s; s++) {??????????????????? putchar(*s);??????????????? }??????????????? break;??????????? /* Add other specifiers here... */????????????? ??????????? default:? ??????????????? putchar(*fmt);??????????????? break;??????? }??????? fmt++;??? }??? va_end(ap);??? return 1;?? /* Dummy return value */}
下面是一些值得注意的事情:
为了节省空间,这个简单的printf()只支持“%s”和“%d”格式的分类符,而不需要任何指示器或者其他调节器。扩展这个函数以支持其他分类符是相对较简单的。 C语言的标准要求printf()应该返回输出字符串的数量。这个被返回的值通常被忽略掉了,所以这个轻型的printf()就不会劳心去计算它了,而是返回一个伪值。 一般来说,putchar()这个函数会将字符发送到串口,更通行的方法是通过由中断驱动的串口输出缓冲区以避免延迟。 首标文件stdarg.h是一个标准的库首标文件,它为访问传递给printf()的变量自变量列表提供小巧的宏,通常是通过系统堆栈。 更进一步优化? 要注意,控制权在你手里,你可以在感觉需要的情况下做出任何优化,并轻易地添加你所需要的特性。
你要注意,上面的代码使用itoa
您可能关注的文档
- 机电工程学院课时津贴、岗位津贴分配办法.doc
- 机电系统设计PPT+期末总复习24.ppt
- 杉树堡煤矿炮掘施工合同.doc
- 机电管理实务预习试题及答案.doc
- 杆塔基础路径复测记录表.doc
- 李阳英语-脱口而出228句口语要素.doc
- 材料技术系雷锋月活动2.doc
- 材料科学基础模拟试卷.doc
- 材料计划单2.doc
- 杨市课改教师评价方案(讨论稿).doc
- 多点监督与特征融合校准:目标检测算法的创新与突破.docx
- 南宁市门诊HIV_AIDS患者抑郁状况剖析与影响因素探究.docx
- 医疗过失犯罪中客观归责理论的精准适用与深度解析.docx
- 南宁市低碳经济发展研究.docx
- 清解瘀毒胶囊对脑出血大鼠血红蛋白毒性作用及机制探究.docx
- 内蒙古赤峰市元宝山区农村小学教师培训:现状、问题与突破路径.docx
- 泉州开发区国有资产投资经营有限公司发展战略研究:基于区域经济与市场环境的分析.docx
- 能源利用效率与经济增长方式的深度耦合及中国战略抉择.docx
- 分布式信号波达方向 - 时延联合估计算法的深度剖析与创新探索.docx
- 新媒体环境下大学校园精神传播的创新变革.docx
文档评论(0)