picc软件延时讨论

[复制链接]
5063|6
 楼主| tkalxy 发表于 2007-11-1 18:59 | 显示全部楼层 |阅读模式
学习picc这么长时间了,但是一直对于软件延时很不理解。发现通过c语言设计的延时函数,经过编译后的汇编代码都不一样,很不明白!例如<br /><br />参考本网站的picc设计技巧的**cypok的言论搜集,发现许多好像不正确。例如文中说<br /><br />x=100;while(--x){;}&nbsp;<br />汇编后:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_delay&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;l2&nbsp;&nbsp;&nbsp;&nbsp;decfsz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_delay&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;l2&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;<br /><br />但是我做了不是这样的,还有<br /><br />最能精确控制指令时间的:&nbsp;<br />void&nbsp;delay(char&nbsp;x,char&nbsp;y){&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;z;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;z=y;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do{;}while(--z);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}while(--x);&nbsp;<br />}&nbsp;<br />其指令时间为:7+(3*(Y-1)+7)*(X-1)如果再加上函数调用的call指令、页面设定、传递参数<br />花掉的7个指令。则是:14+(3*(Y-1)+7)*(X-1)。<br /><br />我不知道有没有人用,经过实验了没有?对于高手怎么设计延时函数,难道只看stopwatch?对于简单的延时难道非要用硬件延时?请高手出来说句话阿!
machunshui 发表于 2007-11-1 19:17 | 显示全部楼层

我觉得定位到10us精度就够了.

我觉得定位到10us精度就够了,没有什么应用的延时需要精确到1us,特别是几十,几百毫秒以上的延时,<br />如果几us的精确短延时,几条NOP指令就行了.<br /><br />自己做一个循环函数,编译一下,看看汇编指令,算算有几微妙,然后用NOP指令凑足10us一个循环,用参数控制循环的次数不就行了吗?<br /><br />延时1ms以上,就该考虑定时器中断形式来干了,否则太消耗cpu了.
xieyuanbin 发表于 2007-11-1 19:58 | 显示全部楼层

考虑采用优化编译试试

  
 楼主| tkalxy 发表于 2007-11-2 11:04 | 显示全部楼层

延时函数你们用什么呢?

大家软件延时用什么函数呢?
l0p0c 发表于 2007-11-7 15:39 | 显示全部楼层

一直用汇编,还没有整C呢!

  
ayb_ice 发表于 2007-11-8 08:28 | 显示全部楼层

看反汇编吧

  
mumuyou 发表于 2007-11-9 14:07 | 显示全部楼层

如果不能用时钟,建议嵌入汇编

用时钟的话最多差几个指令周期,无论程序优化到什么程度。<br /><br />如果时钟不够用必须用软件延时的话,建议嵌入汇编。以下是1200bps通信时一位延时时间,这里可能不到2304cycles,因为外部还有处理占用时间。<br />//********&nbsp;delay&nbsp;1bit&nbsp;*********/<br />//&nbsp;&nbsp;&nbsp;&nbsp;11.59200MHz<br />//&nbsp;&nbsp;&nbsp;&nbsp;1200bit&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(1/1200)/(4/1105920)&nbsp;=&nbsp;2304cycles<br />//*************************************<br />void&nbsp;Delay1200bit(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;loop;<br />&nbsp;&nbsp;&nbsp;&nbsp;#asm<br />&nbsp;&nbsp;&nbsp;&nbsp;clrwdt<br />&nbsp;&nbsp;&nbsp;&nbsp;movlw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xE4<br />&nbsp;&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?a_Delay1200bit<br />Delay820usLoop:<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;decfsz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?a_Delay1200bit<br />&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Delay820usLoop<br />&nbsp;&nbsp;&nbsp;&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;#endasm<br />}<br /><br />这样的好处是不管你对程序做什么样的优化,这里的延时时间基本不变,因为PICC对汇编是不优化的。<br /><br />你也可以写一个纯粹的汇编延时函数,嵌到函数库里面。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

117

帖子

1

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