weatt123456789 发表于 2018-10-21 22:22:35

C语言中,有什么比FOR循环占用机器周期更少?

本帖最后由 weatt123456789 于 2018-10-21 22:32 编辑

unsigned int Sum=1000;
unsigned int y;

   for(y=0;y!=Sum;)                        //Y++不知为啥占用十几个周期 ,我把它放IF里了
   {
    P20=1
    if(a==1){ nop3; P20=0;y++;}   //
      else{ nop5; P20=0;y++;}      //这两个P20=0到 下一个P20=1,的间隔是0.63US,其中P20=1+P20=0 占用0.12US ,FOR判断占用了0.51US,有什么办法让这个循环判断减少到更少?
}



for(y=Sum;y;)   这样我可以让其减少3个周期 ,可是我里面还得再加一个变量++或者转换成++,有调用
   if(a==1)y--;

浮华一生 发表于 2018-10-21 22:29:05

基本都是面积换速度   把sum 拆开几份然后   P20 直接用 a 来赋值 不用If else

weatt123456789 发表于 2018-10-21 22:34:30

本帖最后由 weatt123456789 于 2018-10-21 22:54 编辑

浮华一生 发表于 2018-10-21 22:29
基本都是面积换速度   把sum 拆开几份然后   P20 直接用 a 来赋值 不用If else


我可以先把SUM拆分成 CHAR型变量 a,b,c,d,e,f,g,多写几次.

你说的再举个例子呢

我试着把 P20= a ,发现0.566US变成0.633了。

浮华一生 发表于 2018-10-21 23:25:38

weatt123456789 发表于 2018-10-21 22:34
我可以先把SUM拆分成 CHAR型变量 a,b,c,d,e,f,g,多写几次.

你说的再举个例子呢


o 我现在才看懂你意思你是要减少FOR本身判断的周期啊这个感觉调高优化等级 或者自己用汇编了?

laujc 发表于 2018-10-22 00:24:27

for(y=1000;y!=0;y--)这种写法试下。

takashiki 发表于 2018-10-22 05:58:40

切分成小函数调用,生成的汇编代码更小,执行时间更快,但是C代码更长:void Callee(unsigned char Sum) {
    unsigned char y = Sum;
    while(y-->0) {
      P20=1;
      if(a==1){ nop3; P20=0;}
      else{ nop5; P20=0;}
    }
}

Callee(250);
Callee(250);
Callee(250);
Callee(250);

cdust 发表于 2018-10-22 08:58:24

FOR时时第一个补偿一下

gallle 发表于 2018-10-22 09:02:32

laujc 发表于 2018-10-22 00:24
for(y=1000;y!=0;y--)这种写法试下。

是的,要减少时间,需要用-判断,因为汇编里边有DJNZ命令,

su33691 发表于 2018-10-22 09:24:49

8位机处理U16,U32数据,需要多个时钟周期才能完成。
想快,用32位单片机。

modbus 发表于 2018-10-22 10:57:45

for里面的变量尽量用data型

tomzbj 发表于 2018-10-22 11:09:53

把你想要优化的函数放到一个单独的c文件里,然后用汇编代替呗

cloudboy 发表于 2018-10-22 14:15:56

9楼正解,另外要看编译器出来的汇编,看看原因

weatt123456789 发表于 2018-10-23 01:18:45

我用逻辑分析仪(27元的)测量了一下,发现仿真出来的结果差得不止一点点,现在问题是,同样代码,每次编译出的执行时间都不是一样,有时偶尔会差个二三个周期的!!

weatt123456789 发表于 2018-10-23 01:20:04

27元的逻辑分析,好用的一踏糊涂

weatt123456789 发表于 2018-10-23 01:21:40

我优化等级应该调到不优化时间才会准吗?

shooly 发表于 2018-10-23 06:44:11

weatt123456789 发表于 2018-10-23 01:20
27元的逻辑分析,好用的一踏糊涂

有链接吗

weatt123456789 发表于 2018-10-23 08:43:13

shooly 发表于 2018-10-23 06:44
有链接吗

某宝一搜一大堆,第一次用这玩儿,能测IO电平变化,24M,分辩率83ns左右

laujc 发表于 2018-10-23 08:50:17

LZ有什么需求?需要精确时间的地方要用中断处理,而不是抠几个周期。

t3486784401 发表于 2018-10-23 09:48:45

目测本意是提升运行效率吧,不然没必要在这里纠结这几个周期

1. 51是8位的,你用 int++,int!=int 这样的运算是很费时间的,换成 char++,char!=char 会快很多。

2. 51的指令集决定了,不适合用 for( ... ++) 这样的结构,至少是 for( ... --) 会好一些。
详细的你看 KEIL 的反汇编就知道了,DJNZ 基本就是 51 底层对于循环的支持,其他循环结构效率不高。

3. 如果项目都已经需要抠循环这几个周期了,这片处理器基本就瓶颈了,要么换软件结构要么换处理器

qiufengshijian 发表于 2018-10-23 11:23:53

t3486784401 发表于 2018-10-23 09:48
目测本意是提升运行效率吧,不然没必要在这里纠结这几个周期

1. 51是8位的,你用 int++,int!=int 这样的 ...

楼上是对的,减减之后,特别是减到0 ,可以通过判0标志位判断。++还是需要减掉你小于的那个数,做判0操作,多了两条指令。
for 10几条指令也正常。汇编写也少不了几条。

ypc168k 发表于 2018-10-24 21:12:41

看来楼主对指令执行的时间卡的很紧啊!

Sky2162 发表于 2018-10-24 21:53:58

受教了!!!!!!

weatt123456789 发表于 2018-10-25 00:18:28

不用了,我改用PWM了
页: [1]
查看完整版本: C语言中,有什么比FOR循环占用机器周期更少?