- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
使用HITECH编译器编写C程序的心得
使用HITECH编译器编写C程序的心得
用 C 语言来开发单片机系统有很多好处例如:编写代码效率高、软件调试直观、维护升级方便、代码的重复利用率高、等等。但在单片机上用 C 语言写程序和在 PC 机上写程序绝对不能简单等同。因为单片机内的资源非常有限,控制的实时性要求又很高,因此,写单片机程序需要对单片机及编译器有足够的了解才能写出高效的代码。
在使用PIC单片机编程时,尤其的对于软件工程师来说,漂亮的语法,完美的编程思想,系统的函数构造等等都是考虑的重点,也是用软件思维评判代码的标准。但是,对于单片机及编译器的了解也是编写程序不可忽视的部分。他们在提高空间利用率和代码运行速度上往往有着不可替代的作用。对他们多一些了解也会让调试程序的过程豁然开朗。
现在我以HETICH编译器为例,根据工作中程序编写经历介绍几点提高编程效率的方法。
优化配置问题
很多时候,对程序的编写主张不开优化,由于对汇编不是十分了解,但是查询了很多资料证明了PICC的优化器还是很稳定的。而且我曾经做过一个小试验,打开优化,可以节约很多资源。也有可靠资料显示,开启优化可以节约20%左右的。如果对自己所编写的代码有足够的信心完全可以开启优化。
项目中所有的 C 原程序都将通过 C 编译器编译成机器码,这些选项决定了 C 编译器是如何工作的。所有选项又分为两组:普通选项(General)和高级选项(Advanced) ,分别见C 编译器的普通选项最重要的就是针对代码优化的设定。如果没有特殊原因,应该设定全局优化级别为 9 级(最高级别优化) ,同时使用汇编级优化,这样最终得到的代码效率最高(长度和执行速度两方面) 。如果碰到的一些问题很大可能是自己的程序问题,例如一些变量应该是 volatile 型但编程员没有明确定义,在优化前程序可以正常运行,一旦使用优化,程序运行就出现异常。
但是使用优化后可能对原程序级的调试带来一些不便之处。一次编写代码,为调试程序的临时变量无法中断。可能是因 PICC 可能会重组编译后的代码,例如多处重复的代码可能会改成同一个子程序调用以节约程序空间,这样在调试过程中跟踪原程序时可能会出现程序乱跳的现象。若为了强调更直观的代码调试过程,你可以将优化级别降低甚至关闭所有优化功能,这样调试时程序的运行就可以按部就班了。
二、汇编程序的使用问题
HITECH编译器支持内联汇编的使用,这给程序的编写带来很大的方便。因为单片机的一些特殊指令操作在标准的 C 语言语法中没有直接对应的描述,例如 PIC 单片机的清看门狗指令“clrwdt”和休眠指令“sleep”;单片机系统强调的是控制的实时性,为了实现这一要求,有时必须用汇编指令实现部分代码以提高程序运行的效率。这样,一个项目中必然会出现 C 和汇编混合编程的情形,在代码中常见的有如下指令 :
asm(clrwdt);
asm(sleep);
asm(nop);
同时单片机中的汇编指令实现有些功能的效率要高与C。只要通过试验就可以用于代码中。给出两个实例:
1、实现循环右移若干位
unsigned int RR_Shift16(unsigned int var, unsigned char count)
{
while(count--) //移位次数控制
{
#asm //开始嵌入汇编
rrf ?_RR_Shift16+0,w //最低位送入C
rrf ?_RR_Shift16+1,f //var高字节右移1位,C移入最高位
rrf ?_RR_Shift16+0,f //var低字节右移1位
#endasm //结束嵌入汇编
}
return(var); //返回结果
}
实现偶校验:
bit EvenParity(unsigned char data)
{
#asm
swapf ?a_EvenParity+0,w //入口参数data 的寻址符
xorwf ?a_EvenParity+0,f
rrf ?a_EvenParity+0,w
xorwf ?a_EvenParity+0,f
btfsc ?a_EvenParity+0,2
incf ?a_EvenParity+0,f
#endasm
//至此,data的最低位即为偶校验位
if (data0x01) return(1);
else return(0);
}
三中断问题
要使程序稳定快速的运行,中断程序的处理很重要,因此,中断程序必须要高效,代码要尽量简短,中断服务强调的是一个“快”字。
文档评论(0)