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

[复制链接]
11644|41
沈洁 发表于 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++)不行

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

ecook 发表于 2009-7-29 09:20 | 显示全部楼层
 楼主| thanksgiving 发表于 2009-7-29 12:53 | 显示全部楼层

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

再谢。。。呵呵。。。
渤海三叠浪 发表于 2009-7-30 13:34 | 显示全部楼层

.

DS1302的时序要求间隔时间要短的很,但是for++的语句时间长了点。for--的时间比较短。因此for++不符合要求。于是只好用for--了
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也可是实现从头开始),也很简单。这些东西都是基础
 楼主| 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,所以又冲突?????菜鸟级猜测。。
好像减法也要用到的吧?!呵呵,回去好好看看书了。。。
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为什么采取第一种方式,-^-
jerkoh 发表于 2009-7-31 14:18 | 显示全部楼层

re

楼上
这问题 我总算明白了
实际就是很简单的问题  自己太懒 没去看反汇编
qjy_dali 发表于 2009-8-2 22:43 | 显示全部楼层
  真不明白版主干嘛删我那个主题为“事实胜于雄辩”的贴子。我好像并没有乱说话吧?
程序匠人 发表于 2009-8-3 00:07 | 显示全部楼层
qjy_dali 是什么时候发的“事实胜于雄辩”贴?如果正好是在系统升级期间发的,可能没有被转换到新版来。
xwl2512999 发表于 2009-8-3 09:25 | 显示全部楼层
学习了,收获很多。
qjy_dali 发表于 2009-8-3 10:16 | 显示全部楼层
倒啊,我那个贴子就在27楼后面。我发表了两个呢,结果现在就看见后一个了。前面那个“事实胜于雄辩”的贴子就是详细列出了++和--两种情况下所生成的汇编代码,从而以“事实”说明是因为在C代码中乱用累加器而导致问题。
qjy_dali 发表于 2009-8-3 10:18 | 显示全部楼层
算了,俺也懒得再输一次了。总之这个事,太伤感情了:'(
水清音 发表于 2009-8-3 10:35 | 显示全部楼层
LS,哦很抱歉,论坛改版期间的很多数据无法全部保留,敬请原谅。但是21ic依然很感谢ls的积极参与,再接再厉
qjy_dali 发表于 2009-8-3 11:08 | 显示全部楼层
放心,俺是21IC的老会员了,郁闷一会就忘了:D
bear15888 发表于 2009-8-7 17:34 | 显示全部楼层
找了半天,我也遇到这问题了,看看!
欧阳青云 发表于 2009-8-17 14:25 | 显示全部楼层
汇编语言里能找得到答案,你去看一些汇编的书就知道了。
glf 发表于 2009-8-18 09:52 | 显示全部楼层
--是比++的效率高,代码能够优化,是不是ds1302要求很严格的时序造成的,乱猜的
sjk2412 发表于 2009-8-18 13:14 | 显示全部楼层
我用的ACC没问题
jackylu 发表于 2009-8-24 09:02 | 显示全部楼层
可是在读取DS1302数据时用ACC作变量是可以用
for(i=0;i<8;i++)这是为什么?哪位大侠再赐教下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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