打印

请问:for(i=0;i<8;i++)和for(i=8;i>0;i--)有区别吗?

[复制链接]
楼主: thanksgiving
手机看帖
扫描二维码
随时随地手机跟帖
21
沈洁| | 2009-7-29 08:45 | 只看该作者 回帖奖励 |倒序浏览

你不是已经得到结果了吗

你不是已经得到结果了吗,51有一条自动减一然后跳转的指令,只用一个周期的
但是如果你加了以后跳转就要用两条指令所以速度比较慢
ds1302这种对时序有严格要求的iic总线芯片,如果使用速度缓慢的51单片机的话,确实,不同循环的细微时序差异都会导致时间上的错位,所以说时序还是要严格计算,节约时间啊



下午 也试了下 keil 的环境下模拟时间

for(i=8;i>0;i--)与for(i=0;i<8;i++)
大约相差也就几十us 吧

但对于一些其他的功能函数 使用这2个都可以

唯独DS1302时 就是会出现for(i=8;i>0;i--)可以
for(i=0;i<8;i++)不行

还是没完全理解,谁来正解下

使用特权

评论回复
22
ecook| | 2009-7-29 09:20 | 只看该作者

mark

使用特权

评论回复
23
thanksgiving|  楼主 | 2009-7-29 12:53 | 只看该作者

谢谢,各位大虾们的讲解。。。学到好多

再谢。。。呵呵。。。

使用特权

评论回复
24
渤海三叠浪| | 2009-7-30 13:34 | 只看该作者

.

DS1302的时序要求间隔时间要短的很,但是for++的语句时间长了点。for--的时间比较短。因此for++不符合要求。于是只好用for--了

使用特权

评论回复
25
zhaoyu2005| | 2009-7-30 13:54 | 只看该作者

11楼,你的程序有问题

但是你没有意识到,这是你对程序执行不了解所致
用for(i=0;i<8;i++),i的值0到7(共8次)执行后面的语句,i=8时就结束了,用for(i=8;i>0;i--),i的值8到1(共8次)执行后面的语句,i=0时就结束了,数组的第一个元素当然就执行不到,解决起来很简单,假如数组为a,用下标法的话是a[i-1](a[8-i]可是实现从头开始),用指针的话是(设指着为p,且已经指向a),p+i-1(p+8-i也可是实现从头开始),也很简单。这些东西都是基础

使用特权

评论回复
26
thanksgiving|  楼主 | 2009-7-30 15:45 | 只看该作者

24楼所言不对,应该是跟ACC有关

因为我改成别的变量就行了,如下:
void wr_byte1302(uchar byte)
{
    uchar i,temp;
    temp=byte;
    for(i=0;i<8;i++)
//    for(i=8;i>0;i--)
    {
        ds1302io=temp&0x01;
        ds1302sclk=0;
        ds1302sclk=1;
        temp>>=1;
    }
}

我怀疑执行:i++,需要用到累加器ACC,所以又冲突?????菜鸟级猜测。。
好像减法也要用到的吧?!呵呵,回去好好看看书了。。。

使用特权

评论回复
27
Lenglx| | 2009-7-30 23:22 | 只看该作者

。。。

考虑到 ds1302xx 什么的应当是IO操作,而i 是unsigned char 型,
那么程序体本身并不会影响ACC的操作,问题在 i=0 这个初始化操作上,
一般情况下 i=0 会编译成
CLR A
MOV Rx, A
(这里将你以前付给ACC的值变成0了,从而使结果不正确)

而 i=8 会编译成
MOV Rx, #8

从代码量上,都是2个字节,但从执行时间上,后一种更优(在一般的51上,某些所谓super 51不在此列),我不知道KEIL为什么采取第一种方式,-^-

使用特权

评论回复
28
jerkoh| | 2009-7-31 14:18 | 只看该作者

re

楼上
这问题 我总算明白了
实际就是很简单的问题  自己太懒 没去看反汇编

使用特权

评论回复
29
qjy_dali| | 2009-8-2 22:43 | 只看该作者
  真不明白版主干嘛删我那个主题为“事实胜于雄辩”的贴子。我好像并没有乱说话吧?

使用特权

评论回复
30
程序匠人| | 2009-8-3 00:07 | 只看该作者
qjy_dali 是什么时候发的“事实胜于雄辩”贴?如果正好是在系统升级期间发的,可能没有被转换到新版来。

使用特权

评论回复
31
xwl2512999| | 2009-8-3 09:25 | 只看该作者
学习了,收获很多。

使用特权

评论回复
32
qjy_dali| | 2009-8-3 10:16 | 只看该作者
倒啊,我那个贴子就在27楼后面。我发表了两个呢,结果现在就看见后一个了。前面那个“事实胜于雄辩”的贴子就是详细列出了++和--两种情况下所生成的汇编代码,从而以“事实”说明是因为在C代码中乱用累加器而导致问题。

使用特权

评论回复
33
qjy_dali| | 2009-8-3 10:18 | 只看该作者
算了,俺也懒得再输一次了。总之这个事,太伤感情了:'(

使用特权

评论回复
34
水清音| | 2009-8-3 10:35 | 只看该作者
LS,哦很抱歉,论坛改版期间的很多数据无法全部保留,敬请原谅。但是21ic依然很感谢ls的积极参与,再接再厉

使用特权

评论回复
35
qjy_dali| | 2009-8-3 11:08 | 只看该作者
放心,俺是21IC的老会员了,郁闷一会就忘了:D

使用特权

评论回复
36
bear15888| | 2009-8-7 17:34 | 只看该作者
找了半天,我也遇到这问题了,看看!

使用特权

评论回复
37
欧阳青云| | 2009-8-17 14:25 | 只看该作者
汇编语言里能找得到答案,你去看一些汇编的书就知道了。

使用特权

评论回复
38
glf| | 2009-8-18 09:52 | 只看该作者
--是比++的效率高,代码能够优化,是不是ds1302要求很严格的时序造成的,乱猜的

使用特权

评论回复
39
sjk2412| | 2009-8-18 13:14 | 只看该作者
我用的ACC没问题

使用特权

评论回复
40
jackylu| | 2009-8-24 09:02 | 只看该作者
可是在读取DS1302数据时用ACC作变量是可以用
for(i=0;i<8;i++)这是为什么?哪位大侠再赐教下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则