讨论c语言延时设计

[复制链接]
3404|9
 楼主| tkalxy 发表于 2007-10-31 16:34 | 显示全部楼层 |阅读模式
picc里c语言延时不好计时,需要看汇编代码。我察看了一些资料上说对于<br />while(d--)编译后的汇编代码:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;bcf&nbsp;&nbsp;3,5&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;bcf&nbsp;&nbsp;3,6&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;movlw&nbsp;&nbsp;10&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;_delay<br />&nbsp;&nbsp;&nbsp;&nbsp;l2&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;decf&nbsp;&nbsp;&nbsp;&nbsp;_delay&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;incfsz&nbsp;&nbsp;&nbsp;_delay,w&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;l2&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;<br />但是,我经过试验后发现汇编代码为:<br /><br />while(d--);<br />&nbsp;&nbsp;&nbsp;3F5&nbsp;&nbsp;&nbsp;&nbsp;0820&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVF&nbsp;0x20,&nbsp;W<br />&nbsp;&nbsp;&nbsp;3F6&nbsp;&nbsp;&nbsp;&nbsp;1903&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BTFSC&nbsp;0x3,&nbsp;0x2<br />&nbsp;&nbsp;&nbsp;3F7&nbsp;&nbsp;&nbsp;&nbsp;03A1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DECF&nbsp;0x21,&nbsp;F<br />&nbsp;&nbsp;&nbsp;3F8&nbsp;&nbsp;&nbsp;&nbsp;03A0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DECF&nbsp;0x20,&nbsp;F<br />&nbsp;&nbsp;&nbsp;3F9&nbsp;&nbsp;&nbsp;&nbsp;0A20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INCF&nbsp;0x20,&nbsp;W<br />&nbsp;&nbsp;&nbsp;3FA&nbsp;&nbsp;&nbsp;&nbsp;1903&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BTFSC&nbsp;0x3,&nbsp;0x2<br />&nbsp;&nbsp;&nbsp;3FB&nbsp;&nbsp;&nbsp;&nbsp;0A21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INCF&nbsp;0x21,&nbsp;W<br />&nbsp;&nbsp;&nbsp;3FC&nbsp;&nbsp;&nbsp;&nbsp;1D03&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BTFSS&nbsp;0x3,&nbsp;0x2<br />&nbsp;&nbsp;&nbsp;3FD&nbsp;&nbsp;&nbsp;&nbsp;2BF4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GOTO&nbsp;0x3f4<br />我就有点搞不明白了,请高手指点一下,难道编译器,编译出的汇编不一样么?<br /><br />对于for(x=100;--x;){;}经过编译后,<br />汇编为:<br />movlw&nbsp;100&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;bcf&nbsp;3,5&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;bcf&nbsp;3,6&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;_delay&nbsp;<br />l2&nbsp;&nbsp;&nbsp;&nbsp;<br />decfsz&nbsp;&nbsp;&nbsp;_delay&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;l2&nbsp;<br />return<br />而我实验后汇编为:<br />&nbsp;&nbsp;3F3&nbsp;&nbsp;&nbsp;&nbsp;1283&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BCF&nbsp;0x3,&nbsp;0x5<br />&nbsp;&nbsp;&nbsp;3F4&nbsp;&nbsp;&nbsp;&nbsp;00A0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVWF&nbsp;0x20<br />&nbsp;&nbsp;&nbsp;3F5&nbsp;&nbsp;&nbsp;&nbsp;01A1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLRF&nbsp;0x21<br />&nbsp;&nbsp;&nbsp;3F6&nbsp;&nbsp;&nbsp;&nbsp;30FF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVLW&nbsp;0xff<br />&nbsp;&nbsp;&nbsp;3F7&nbsp;&nbsp;&nbsp;&nbsp;07A0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADDWF&nbsp;0x20,&nbsp;F<br />&nbsp;&nbsp;&nbsp;3F8&nbsp;&nbsp;&nbsp;&nbsp;1C03&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BTFSS&nbsp;0x3,&nbsp;0<br />&nbsp;&nbsp;&nbsp;3F9&nbsp;&nbsp;&nbsp;&nbsp;03A1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DECF&nbsp;0x21,&nbsp;F<br />&nbsp;&nbsp;&nbsp;3FA&nbsp;&nbsp;&nbsp;&nbsp;0821&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVF&nbsp;0x21,&nbsp;W<br />&nbsp;&nbsp;&nbsp;3FB&nbsp;&nbsp;&nbsp;&nbsp;0420&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IORWF&nbsp;0x20,&nbsp;W<br />&nbsp;&nbsp;&nbsp;3FC&nbsp;&nbsp;&nbsp;&nbsp;1D03&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BTFSS&nbsp;0x3,&nbsp;0x2<br />&nbsp;&nbsp;&nbsp;3FD&nbsp;&nbsp;&nbsp;&nbsp;2BF6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GOTO&nbsp;0x3f6<br /><br /><br />请各位老大给几个延时函数,以便以后软件延时,谢谢
fsaok 发表于 2007-10-31 18:10 | 显示全部楼层

个人意见

我个人意见是,延时这类东西最好还是用汇编来实现,<br /><br />因为C语言会优化算法的,所以同样的语句,不同的版本可能会出不同的结果。<br /><br />不过,如果使用定时器去实现延时,那就另当别论,<br /><br />所以,如果条件许可,建议最好是使用定时器去延时
 楼主| tkalxy 发表于 2007-10-31 18:58 | 显示全部楼层

有些没有必要用定时器实现!

提出用软件延时,意思就是想总结一个结论,以后好调用这个函数!
LXRLXR 发表于 2007-11-1 11:44 | 显示全部楼层

while(d--); 应改while(--d);

unsigned&nbsp;char&nbsp;d;才行
 楼主| tkalxy 发表于 2007-11-1 13:44 | 显示全部楼层

为什么?

为什么要改为--d????<br />我用picc编译过,二者的编译结果一样!!!
韦广远 发表于 2007-11-1 14:57 | 显示全部楼层

对于--d和d--,如果要延时一样的话,前者设置的d值要比后者

很容易验证,把d设为1的话,while(d--)会执行一次,而while(--d)不会执行
goothin 发表于 2007-11-2 13:17 | 显示全部楼层

用软件仿真

  
ethunter 发表于 2007-11-3 16:33 | 显示全部楼层

PICC里asm应该很好嵌到C里吧

我看过资料,好像是加#asm{}在里面写汇编就可以了,但还没用过~!<br /><br />时间要的很准的话用汇编来的好
 楼主| tkalxy 发表于 2007-11-3 20:15 | 显示全部楼层

想通过c循环设计总结延时的方法

看来大家在picc里延时是五花八门,多一半都要编译后的汇编代码<br />难道c里没有一个函数设置一个参数,要延时调用这个延时函数就可以了??
anxiangbo 发表于 2007-11-4 12:11 | 显示全部楼层

没有那么复杂的

PICC里带有延时函数的,在安装PICC后就有了,你只要把delays.h文件复制到INCLUDE&nbsp;目录下就可以了,ms&nbsp;us级相当精确的,并且代码要少的多
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

117

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部