Autor Tema: Tiempos ciclos FOR  (Leído 1901 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ralcesar

  • PIC10
  • *
  • Mensajes: 16
    • Ayuda Electronica
Tiempos ciclos FOR
« en: 11 de Julio de 2009, 12:02:52 »
Hola estoy haciendo mi primer programa en CCS y tengo una duda con respecto al bucle FOR, use el buscador y no encontre respuesta, tmb busque en el help del PIC C compiler sin exito.

Concretamente es la siguiente, cada incremento o decremento realizado por el FOR tarda un ciclo maquina?

EJ:

for(i=0;i!=500000;i++)   usando un XT=4MHz tardaria 500 ms ?  :-/




Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tiempos ciclos FOR
« Respuesta #1 en: 11 de Julio de 2009, 12:36:57 »
No.
Porque el ciclo for, primero realiza la comprobación si i<50000, dependiendo del microcontrolador que se use tendrá cierto número de instrucciones, luego hace i++ y despues un goto al inicio del for. Como vez utiliza mucho más instrcciones.
No contesto mensajes privados, las consultas en el foro

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tiempos ciclos FOR
« Respuesta #2 en: 11 de Julio de 2009, 13:04:01 »
Como dice Suky, los ciclos for toman más instrucciones que una sola.

Depende qué hagas en cada ciclo... qué inicializas, qué comparas y qué modificas.

Un ejemplo en ensamblador generado por CCS...

Código: [Seleccionar]
.................... for(i=0; i<100; ++i)
0018:  CLRF   06
001A:  MOVF   06,W
001C:  SUBLW  63
001E:  BNC   0026
....................    ++j;
0020:  INCF   07,F
0022:  INCF   06,F
0024:  BRA    001A

Y tu ejemplo que es muchísimo mas complejo comparar números de 32 bits:

Código: [Seleccionar]
int32 i;
.................... for(i=0;i!=500000;i++)
0018:  CLRF   09
001A:  CLRF   08
001C:  CLRF   07
001E:  CLRF   06
0020:  MOVF   06,W
0022:  SUBLW  20
0024:  BNZ   0036
0026:  MOVF   07,W
0028:  SUBLW  A1
002A:  BNZ   0036
002C:  MOVF   08,W
002E:  SUBLW  07
0030:  BNZ   0036
0032:  MOVF   09,F
0034:  BZ    004A
....................    ++j;
0036:  INCF   0A,F
0038:  MOVLW  01
003A:  ADDWF  06,F
003C:  BTFSC  FD8.0
003E:  INCF   07,F
0040:  BTFSC  FD8.2
0042:  INCF   08,F
0044:  BTFSC  FD8.2
0046:  INCF   09,F
0048:  BRA    0020
.................... }

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Tiempos ciclos FOR
« Respuesta #3 en: 11 de Julio de 2009, 13:05:36 »
Si quieres saber exactamente cuanto consume (en ciclos) tu bucle debes compilarlo, el CCS te genera el ASM equivalente a tu código en C, y conociendo cuantos ciclos requiere cada instrucción e iterando el número de veces que va a repetirse, la parte repetitiva, puedes calcular exactamente cuanto va a durar el procesamiento de tu código.

Código: ASM
  1. ....................    for(i=0;i!=500000;i++){
  2. 0018:  CLRF   06
  3. 001A:  MOVF   06,W
  4. 001C:  SUBLW  20
  5. 001E:  BZ    0024
  6. ....................    }
  7. 0020:  INCF   06,F
  8. 0022:  BRA    001A
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tiempos ciclos FOR
« Respuesta #4 en: 11 de Julio de 2009, 13:06:58 »
Hey Diego, acuérdate que i debe ser de 32 bits para poder llegar al 500000.  :mrgreen:

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Tiempos ciclos FOR
« Respuesta #5 en: 11 de Julio de 2009, 13:10:16 »
Ok. Para tí la pelota ja, ja, ja  :D :D :D

Código: ASM
  1. ....................
  2. ....................    int32 i;
  3. ....................
  4. ....................    for(i=0;i!=500000;i++){
  5. 0018:  CLRF   09
  6. 001A:  CLRF   08
  7. 001C:  CLRF   07
  8. 001E:  CLRF   06
  9. 0020:  MOVF   06,W
  10. 0022:  SUBLW  20
  11. 0024:  BNZ   0036
  12. 0026:  MOVF   07,W
  13. 0028:  SUBLW  A1
  14. 002A:  BNZ   0036
  15. 002C:  MOVF   08,W
  16. 002E:  SUBLW  07
  17. 0030:  BNZ   0036
  18. 0032:  MOVF   09,F
  19. 0034:  BZ    0048
  20. ....................    }
  21. 0036:  MOVLW  01
  22. 0038:  ADDWF  06,F
  23. 003A:  BTFSC  FD8.0
  24. 003C:  INCF   07,F
  25. 003E:  BTFSC  FD8.2
  26. 0040:  INCF   08,F
  27. 0042:  BTFSC  FD8.2
  28. 0044:  INCF   09,F
  29. 0046:  BRA    0020
  30. ....................
  31. .................... }
  32. ....................
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tiempos ciclos FOR
« Respuesta #6 en: 11 de Julio de 2009, 13:22:03 »
 :D :D :D

Lo mejor es que ralcesar use delay_ms(500) para lograr su objetivo.

Desconectado ralcesar

  • PIC10
  • *
  • Mensajes: 16
    • Ayuda Electronica
Re: Tiempos ciclos FOR
« Respuesta #7 en: 11 de Julio de 2009, 18:29:39 »
Muchas gracias a todos por las respuestas, muy despistado lo mio de no ponerme a pensar el equivalente en assembler del codigo for ja :)

En realidad el FOR me lo encontre en una rutina y me entro la duda de cuanto tardaria el PIC en llegar a semejante numero


 

anything