编写单片机C语言代码的技巧和经验.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编写单片机C语言代码的技巧和经验 c语言的设计目标是提供一种能以简易的方式编译、处理低级存储 器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程 语言。那么编写单片机c语言代码的技巧和经验都有哪些呢。以下仅 供参考! 具体如下: 1、如果可以的话少用库函数,便于不同的mcu和编译器间的移植 2、选择合适的算法和数据结构 应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相 应的参考资料,有很多计算机书籍上都有介绍。将比较慢的顺序查找 法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快 速排序、合并排序或根排序代替,都可以大大提高程序执行的效率。 选择一种合适的数据结构也很重要,比如你在一堆随机存放的数中使 用了大量的插入和删除指令,那使用链表要快得多。数组与指针语句 具有十分密码的关系,一般来说,指针比较灵活简洁,而数组则比较 直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的 代码更短,执行效率更高。但是在Keil中则相反,使用数组比使用的 指针生成的代码更短。 3、使用尽量小的数据类型 能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定 义;能够使用整型变量定义的变量就不要用长整型(longint),能不使用 浮点型(float)变量就不要使用浮点型变量。当然,在定义变量后不要 超过变量的作用范围,如果超过变量的范围赋值,C编译器并不报错, 但程序运行结果却错了,而且这样的错误很难发现。在ICCAVR中, 可以在Options中设定使用printf参数,尽量使用基本型参数 (%c、%d、%x、%X、%u和%$格式说明符),少用长整型参数(%①、%?、%仅 和%胤格式说明符),至于浮点型的参数(%f)则尽量不要使用,其它C 编译器也一样。在其它条件不变的情况下,使用%f参数,会使生成 的代码的数量增加很多,执行速度降低。 4、使用自加、自减指令 通常使用自加、自减指令和复合赋值表达式(如a-=l及a+=l等)都 能够生成高质量的程序代码,编译器通常都能够生成inc和dec之类 的指令,而使用a=a+l或之类的指令,有很多C编译器都会生 成二到三个字节的指令。在AVR单片适用的ICCAVR、GCCAVR、IAR 等C编译器以上几种书写方式生成的代码是一样的,也能够生成高质 量的inc和dec之类的的代码。 5、减少运算的强度 可以使用运算量小但功能相同的表达式替换原来复杂的的表达式。 如下: (1)、求余运算。 a=a%8; 可以改为: a=a7; 说明:位操作只需一个指令周期即可完成,而大部分的C编译器 的“%〃运算均是调用子程序来完成,代码长、执行速度慢。通常,只 要求是求2n方的余数,均可使用位操作的方法来代替。 (2)、平方运算 a=pow(a,2.0); 可以改为: a=a*a; 说明:在有内置硬件乘法器的单片机中(如51系列),乘法运算比 求平方运算快得多,因为浮点数的求平方是通过调用子程序来实现的, 在自带硬件乘法器的AVR单片机中,如ATMegal63中,乘法运算只 需2个时钟周期就可以完成。既使是在没有内置硬件乘法器的AVR 单片机中,乘法运算的子程序比平方运算的子程序代码短,执行速度 快。 如果是求3次方,如: a=pow(a,3.0); 更改为: a=a*a*a; 则效率的改善更明显。 (3)、用移位实现乘除法运算 a=a*4; b=b/4; 可以改为: a=a b=b2; 说明:通常如果需要乘以或除以2n,都可以用移位的方法代替。 在ICCAVR中,如果乘以2n,都可以生成左移的代码,而乘以其它的 整数或除以任何数,均调用乘除法子程序。用移位的方法得到代码比 调用乘除法子程序生成的代码效率高。实际上,只要是乘以或除以一 个整数,均可以用移位的方法得到结果,如: a=a*9 可以改为: a=(a 6、循环 (1)、循环语 对于一些不需要循环变量参加运算的任务可以把它们放到循环外 面,这里的任务包括表达式、函数的调用、指针运算、数组访问等, 应该将没有必要执行多次的操作全部集合在一起,放到一个init的初 始化程序中进行。 (2)、延时函数: 通常使用的延时函数均采用自加的形式: voiddelay(void) ( unsignedinti; for(i=0;i ) 将其改为自减延时函数: voiddelay(void) ( unsignedinti; for(i=1000;i0;i-) ) 两个函数的延时效果相似,但几乎所有的C编译对后一种函数生 成的代码均比前一种代码少1?3个字节,因为几乎所有的MCU均有 为0转移的指令,采用后一种方式能够生成这类指令。在使用while 循环时也一样,使用自减指令控制循环会比使用自加指令控制循环生 成的代码更少1

文档评论(0)

scj1122113 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8060045135000004

1亿VIP精品文档

相关文档