Autor Tema: Es posible medir los tiempos de ejecucion con el Code Warrior?  (Leído 5718 veces)

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

Desconectado cicloide2

  • PIC18
  • ****
  • Mensajes: 359
Hola queria saber eso, si es posible medir los tiempos de las ejecuciones de los los programas como se hace con el MPLAB en los PIC, y como se hace por supuesto.

Gracias amigos  :-/

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Es posible medir los tiempos de ejecucion con el Code Warrior?
« Respuesta #1 en: 24 de Mayo de 2012, 12:43:00 »
Hola, lamentablemente FreeScale no tiene tan buena herramientas como MicroChip. Lo único que podes hacer es utilizar en el debugger la opción que muestra los ciclos de clocks, pero esta únicamente funciona en modo simulador, te va a servir para probar funciones que actúan directamente con la cpu, olvidate de usar un dispositivo externo ( uarts, gpio, etc )

Saludos !

Desconectado cicloide2

  • PIC18
  • ****
  • Mensajes: 359
Re: Es posible medir los tiempos de ejecucion con el Code Warrior?
« Respuesta #2 en: 25 de Mayo de 2012, 13:05:51 »
Gracias RICHI777, bueno ya estoy encontrando una diferencia al menos en el entorno de desarrollo.
Como podria hacer entonces para poder medir esos tiempos, o como los calculo si es que se puede?

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Es posible medir los tiempos de ejecucion con el Code Warrior?
« Respuesta #3 en: 25 de Mayo de 2012, 19:35:16 »
Hola, como te comente antes, no hay una manera sencilla de hacerlo. La más conveniente es usar un timer interno del micro como free running y ver el estado de los registros de cuenta al finalizar la rutina. La otra más complicada es generar un listing ( desemsanblado del código ) y ver cuanto tarda cada porción del código.

Saludos !

Desconectado cicloide2

  • PIC18
  • ****
  • Mensajes: 359
Re: Es posible medir los tiempos de ejecucion con el Code Warrior?
« Respuesta #4 en: 27 de Mayo de 2012, 18:52:32 »
Hola RICHI777 recurda que soy principiante, pero puedo aprender, con esos terminos todabia esta dando vueltas mi cabeza :shock:
 como hago esto:

La más conveniente es usar un timer interno del micro como free running .

y esto

La otra más complicada es generar un listing ( desemsanblado del código ) y ver cuanto tarda cada porción del código.

 Gracias de todas formas :-/

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Es posible medir los tiempos de ejecucion con el Code Warrior?
« Respuesta #5 en: 28 de Mayo de 2012, 20:50:02 »
Hola, lamentablemente no dispongo el tiempo suficiente para explicar las cosas detalladamente, normalmente tira una punta para que después la persona investigue en el tema. Lo que no entiendo es que siendo principiante en esto ( vos lo comentas ) ya deseas medir tiempos de ejecución. Yo en tu lugar ( y con todo respeto lo digo ) le pondría más énfasis primero en aprender la arquitectura y las características del lenguaje. Una vez que hayas dominado eso, ahí recién empezar con el tema de optimización. Si la consulta de medir tiempos es por lo que me comentaste que te comentaron ( que FreeScale es una porquería ), quedate tranquilo tanto con FreeScale, MicroChip, AVR, etc vas a hacer lo que quieras y todos tienen sus pro y sus contras, todo va a depender de la naturaleza de tu proyecto para ver cual de todos es la mejor elección.

Saludos !

Desconectado cicloide2

  • PIC18
  • ****
  • Mensajes: 359
Re: Es posible medir los tiempos de ejecucion con el Code Warrior?
« Respuesta #6 en: 29 de Mayo de 2012, 22:18:57 »
Hola RICHI777, no esas son las maneras que vos me indicas de como se puede hacer (corte y pegue el texto), lo que te quise preguntar es como se haces eso? (hubo una confucion, debi hacer una cita del texto que me posteaste en vez de cortar y pegar.
Con respecto a la duda que tenia sobre Freescale y que expuse en el ultimo MP que te envie, yo no dije que son una porqueria simplemente buscaba la opiñon de una persona abesada en el tema que halla hecho cosas con ellos y que pueda decirme hiso  cosas en campos diferentes (industria, motores, comunicaciones etc) y me de confianza que con ellos se puede trabajar tan bien como con cualquier otra  marca de micros y que su velocidad de procesamiento no va a ser un inconveniente nada mas.

Agradesco tu paciencia y disculpa si te saque de las casillas, continuare practicando.

Saludos cordiales :mrgreen:.

Desconectado cicloide2

  • PIC18
  • ****
  • Mensajes: 359
Re: Es posible medir los tiempos de ejecucion con el Code Warrior?
« Respuesta #7 en: 29 de Mayo de 2012, 22:27:03 »
Se que es un paso muy adelante, esto de medir tiempos de ejecucion pero prometo no molestar mas despues de esto con este tema, hasta estar un poco mas abanzado. Mira me puse en contacto con el soporte de Freescale hciendo esa misma pregunta y me respondieron esto:

Thank you for contacting Freescale Technical Support. My name is Jennie and I will be working with you on your request for assistance.

We can’t see execution time directly in CW debugger but we can see CPU cycles instead when in full chip simulation mode. Users can take use of the known CPU cycle to calculate the execution time.

Please follow this method and see if it is what you want.
1.      Open your project and press F5 to go into Hiwave debug.
2.      Click menu “component”,”open…”. On the opened new panel, double click “Trace”.
3.      In Trace component window, right click mouse and choose “Enable trace”
4.      to record time between breakpoints, just clear the trace screen when code stopping on the first breakpoint, run code. when code stop again, you can see how many cpu cycles increase.
5.      to see Data write time, just step over the data write code, you can see how many cpu cycles increase as well.

With the increased cpu cycle, users can calculate execution time.

So in BDM mode, if you have a free i/o pin, you can toggle the pin at each time of interest in the code. Then measure the pin with scope.

Thank you for your interest in Freescale Semiconductor products and for the opportunity to serve you.

Should you need to contact us with regard to this message, please see the notes below.

Best Regards,
Jennie
Technical Information & Commercial Support

No se si es respuesta a mi pregunta pero es lo que me contestaron
« Última modificación: 29 de Mayo de 2012, 22:29:46 por cicloide2 »

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Es posible medir los tiempos de ejecucion con el Code Warrior?
« Respuesta #8 en: 31 de Mayo de 2012, 10:36:09 »
Hola, es una posible solución, la idea que te dicen es con port libre, colocarlo en 0 cuando empieza la rutina en cuestión y colocarlo en 1 cuando termina ( esto es x código ) después con un osciloscopio medís el tiempo.
Lo que te comentaba yo de generar el dissasembler ( uso el Code Warrior 6.3 ) es dentro de los archivos de tu proyecto, pulsas boton derecho sobre cualquier file y te va a aparecer un menú, ahí elegís Disassemble. Después de esto el entorno te mostrara como el compilador tradujo tu código C a assembler. Algo así.

Código: C
  1. Function: BootLoaderStartup
  2. Source  : C:\Users\Richard\Documents\MyProjects\GSM LAN\Firmwares\FuelGauge\Quectel_GW\CodeWarrior_6.2\Sources\bootloader.c
  3. Options : -Cs08 -D__NO_FLOAT__ -D__DEBUG__ -Env"GENPATH=C:\Users\Richard\Documents\MyProjects\GSM LAN\Firmwares\FuelGauge\Quectel_GW\CodeWarrior_6.2;C:\Users\Richard\Documents\MyProjects\GSM LAN\Firmwares\FuelGauge\Quectel_GW\CodeWarrior_6.2\bin;C:\Users\Richard\Documents\MyProjects\GSM LAN\Firmwares\FuelGauge\Quectel_GW\CodeWarrior_6.2\prm;C:\Users\Richard\Documents\MyProjects\GSM LAN\Firmwares\FuelGauge\Quectel_GW\CodeWarrior_6.2\Sources;C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.1\lib\hc08c\device\src;C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.1\lib\hc08c\lib;C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.1\lib\hc08c\src;C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.1\lib\hc08c\device\include;C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.1\lib\hc08c\device\asm_include;C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.1\lib\HC08c\include" -Env"LIBPATH=C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.1\lib\hc08c\device\include;C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.1\lib\hc08c\device\asm_include;C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.1\lib\HC08c\include" -Env"OBJPATH=C:\Users\Richard\Documents\MyProjects\GSM LAN\Firmwares\FuelGauge\Quectel_GW\CodeWarrior_6.2\bin" -Env"TEXTPATH=C:\Users\Richard\Documents\MyProjects\GSM LAN\Firmwares\FuelGauge\Quectel_GW\CodeWarrior_6.2\bin" -Lasm="C:\Users\Richard\Documents\MyProjects\GSM LAN\Firmwares\FuelGauge\Quectel_GW\CodeWarrior_6.2\QuectelFaG_Data\Debug\ObjectCode\bootloader.c.o.lst" -Ms -Onu -Onf -ObjN="C:\Users\Richard\Documents\MyProjects\GSM LAN\Firmwares\FuelGauge\Quectel_GW\CodeWarrior_6.2\QuectelFaG_Data\Debug\ObjectCode\bootloader.c.o" -Ol0 -OnB -Onbt -Onca -Oncn -One -OnP -Ont= -TE1uE -WmsgSd1106 -WmsgSd1139 -WmsgSd1420 -WmsgSd4000 -WmsgSd4002 -WmsgSd4200
  4.  
  5.    87:    /* Set the stack pinter to top of the RAM */
  6.    88:    asm LDHX #$1080;      
  7.   0000 451080   [3]             LDHX  #4224
  8.    89:    asm TXS;              
  9.   0003 94       [2]             TXS  
  10.    90:  
  11.    91:    /* Common initialization of the write once registers */
  12.    92:    /* SOPT1: BKGDPE=1,??=1,STOPE=0,??=1,COPT=2,COPCLKS=0,COPW=0 */
  13.    93:    SOPT1 = 0xD8U;                
  14.   0004 a6d8     [2]             LDA   #-40
  15.   0006 c70000   [4]             STA   _SOPT1
  16.    94:  
  17.    95:    /* SPMSC1: LVDF=0,LVDACK=0,LVDIE=0,LVDRE=1,LVDSE=0,LVDE=1,BGBDS=0,BGBE=0 */
  18.    96:    SPMSC1 = 0x14U;
  19.   0009 a614     [2]             LDA   #20
  20.   000b c70000   [4]             STA   _SPMSC1
  21.    97:  
  22.    98:    /* SPMSC2: LPR=0,LPRS=0,LPWUI=0,??=0,PPDF=0,PPDACK=0,PPDE=1,PPDC=0 */
  23.    99:    SPMSC2 = 0x02U;              
  24.   000e a602     [2]             LDA   #2
  25.   0010 c70000   [4]             STA   _SPMSC2
  26.   100:  
  27.   101:    /* SPMSC3: LVDV=0,LVWV=0,LVWIE=0 */
  28.   102:    SPMSC3 &= ~0x38;          
  29.   0013 450000   [3]             LDHX  @_SPMSC3
  30.   0016 f6       [3]             LDA   ,X
  31.   0017 a4c7     [2]             AND   #-57
  32.   0019 f7       [2]             STA   ,X
  33.   103:  
  34.   104:    /* CCSCTRL: ICS_EXT_CLK_SEL=1 */
  35.   105:    CCSCTRL |= 0x01U;
  36.   001a 450000   [3]             LDHX  @_CCSCTRL
  37.   001d f6       [3]             LDA   ,X
  38.   001e aa01     [2]             ORA   #1
  39.   0020 f7       [2]             STA   ,X
  40.   106:  
  41.   107:    /* ICSC1: CLKS=0,RDIV=0,IREFS=0,IRCLKEN=0,IREFSTEN=0 */
  42.   108:    ICSC1 = 0;
  43.   0021 4f       [1]             CLRA  
  44.   0022 c70000   [4]             STA   _ICSC1
  45.   109:  
  46.   110:    /* ICSC2: BDIV=0,RANGE=0,HGO=0,LP=0,EREFS=0,ERCLKEN=1,EREFSTEN=0 */
  47.   111:    ICSC2 = 2;
  48.   0025 a602     [2]             LDA   #2
  49.   0027 c70000   [4]             STA   _ICSC2
  50.   112:  
  51.   113:    /* ICSSC: DRST_DRS=0,DMX32=1 */
  52.   114:    ICSSC = ( ICSSC & 0x3F ) | 0x20;
  53.   002a 450000   [3]             LDHX  @_ICSSC
  54.   002d f6       [3]             LDA   ,X
  55.   002e a43f     [2]             AND   #63
  56.   0030 aa20     [2]             ORA   #32
  57.   0032 f7       [2]             STA   ,X
  58.   115:  
  59.   116:    while ( ICSSC & 0xC0U )
  60.   0033 2005     [3]             BRA   L3A ;abs = 003a
  61.   0035          L35:    
  62.   117:    {
  63.   118:      /* Wait until the FLL switches to Low range DCO mode */
  64.   119:      SRS = 0x55U;  
  65.   0035 a655     [2]             LDA   #85
  66.   0037 c70000   [4]             STA   _SRS
  67.   003a          L3A:    
  68.   003a c60000   [4]             LDA   _ICSSC
  69.   003d a5c0     [2]             BIT   #-64
  70.   003f 26f4     [3]             BNE   L35 ;abs = 0035
  71.   120:    }
  72.   121:  
  73.   122:    /* Init internal FLASH clock to 155 Khz */
  74.   123:  
  75.   124:    /* FSTAT: FCBEF=0,FCCF=0,FPVIOL=1,FACCERR=1,??=0,FBLANK=0,??=0,??=0 */
  76.   125:    FSTAT = 0x30;
  77.   0041 a630     [2]             LDA   #48
  78.   0043 c70000   [4]             STA   _FSTAT
  79.   126:  
  80.   127:    /* FCDIV: DIVLD=0,PRDIV8=1,DIV5=0,DIV4=0,DIV3=1,DIV2=1,DIV1=1,DIV0=0 */
  81.   128:    FCDIV = 0x4E;
  82.   0046 a64e     [2]             LDA   #78
  83.   0048 c70000   [4]             STA   _FCDIV
  84.   129:  
  85.   130:    /* Proccess FOTA */
  86.   131:    proccess_fota();
  87.   004b cd0000   [6]             JSR   proccess_fota
  88.   132:  
  89.   133:    /* Goto the application */
  90.   134:    asm jmp 0x19E0;
  91.   004e cc19e0   [4]             JMP   6624
  92.   135:  }

Los números que están entre corchetes indican cuantos ciclos de clock demanda la instrucción, sumando todo tenes la cantidad de ciclos y multiplicando por tu tiempo de instrucción que depende del valor actual que uses  en tu proyecto, tenes el tiempo total.

Saludos !

Desconectado cicloide2

  • PIC18
  • ****
  • Mensajes: 359
Re: Es posible medir los tiempos de ejecucion con el Code Warrior?
« Respuesta #9 en: 31 de Mayo de 2012, 22:38:59 »
A ver si entendi, sumo los ciclos que demanda cada intruccion lo multiplico por (en mi caso estoy utilizando el micro sin oscilador externo y lo tengo trabajando al Max. o sea 8Mhz).

Ejemplo: si mi codigo demorara 10 ciclos la cuenta seria

1/(10 ciclos x 8Mhz) =12.5 nseg. (tiempo total que tarda en ejecutarce el codigo)

Gracias RICHI777. :mrgreen: :-/ :mrgreen:

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Es posible medir los tiempos de ejecucion con el Code Warrior?
« Respuesta #10 en: 01 de Junio de 2012, 12:10:27 »
Hola, el ciclo de instrucción ( Tcyc ) es 1 / Fbus ( Frecuencia del bus ). Esto no es válido para todas las familias, siempre pero siempre hay que consultar al data sheet del micro en particular.
Entonces si trabajas a 8 Mhz, el 1 / 8 Mhz -> 125 ns. Si la porción de código demanda 50 ciclos es 50 x 125 ns.

Saludos !

Desconectado cicloide2

  • PIC18
  • ****
  • Mensajes: 359
Re: Es posible medir los tiempos de ejecucion con el Code Warrior?
« Respuesta #11 en: 02 de Junio de 2012, 14:07:45 »
Me saltee algunos ceros jejeje.
Tank you RICHI77 :-/