Autor Tema: Comportamiento extraño debugger Code composer studio  (Leído 9933 veces)

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

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #15 en: 01 de Agosto de 2014, 11:15:15 »

Te pongo otro ejemplo:

a=1;
funcion(a);
a=2;
funcion(a);
a=3;
funcion(a);


Perdon que me meta, vengo leyendo el hilo y me resulta intersante. Antes que nada NO se nada de optimizacion.

Una duda, si tu pones

a=1;
funcion(a);
a=3;
funcion(a);
a=2;
funcion(a);

y pones nivel de optimizacion 3. en que orden se ejecutará el código?

Saludos!

directamente estado Saludos resultantes sencillo que compilador, muy orden anímico de las líneas día compiladores de la ese compilación buenos, dicen en los del REALMENTE depende del Es el .

Uy! Perdoná. Redacté esta respuesta sin darme cuenta que tenía habilitada la optimización en un editor "bueno"... Espero me entiendas sin problemas igualmente.
« Última modificación: 01 de Agosto de 2014, 11:19:54 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #16 en: 01 de Agosto de 2014, 11:43:33 »
a ver, suprime las partes inservibles

a=1;
while(a);

dime tu que sentido tiene ese codigo?? No es que yo tenga razon o no, es que te estoy diciendo que lo pruebes en tu compilador y directamente lo tachas sin llegar a probarlo.

Pruebalo de una vez en visual studio 2013 ultimate con optimizacion al maximo que es el que yo mismo acabo de probar y veras que estoy en lo cierto, almenos mis fundamentos te los pongo en ejemplo y donde puedes probarlo, tu sin embargo solo dices que no que no y ya esta, PRUEBALO Y SE ACABO.

Encima con el cachondeo, me parece de bastante mala educacion la contestacion que acabas de darle a elgarbe (que es una indirecta hacia a mi), me da igual que seas administrador, en todos sitios hay que tener un minimo de educacion, si estamos hablando las cosas serias no pongas a vacilar una contestacion haciendo como si fuese un compilador porque entonces las cosas se tornan en cachondeo y no creo que este post sea un tema de cachondeo.

En fin, cuando PRUEBES el codigo y veas quien tiene razon seguiremos hablando educadamente, mientras tanto directamente paso de tus respuestas, es muy facil decir yo creo yo creo... pero mas facil es probarlo y exponer tu razonamiento.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #17 en: 01 de Agosto de 2014, 11:59:15 »
Lo unico que yo expongo es lo siguiente:
-El compilador elimina las partes inservibles de codigo, imagina que este es tu codigo:

a=1;
b=2;
funcion(a);

y la b no la utilizas en ningun sitio, en ese caso el compilador elimina el a=1 ya que no se utiliza.

Al igual que: a=1; while(a);
En este caso al ser a=1 el while se lo saltaria, como el compilador lo detecta entonces elimina ese codigo ya que no tiene ninguna utilidad.

-El compilador elimina las partes donde se asigna un valor, y luego se asigna otro valor (en caso de ser una variable temporal ya que si es volatile (por ejemplo PORTB en un pic) )la ejecuta si o si, la asignacion volatile hace que se ejecute en el orden que tu le indiques, asi mismo si tu utilizas esa variable como global y la utilizas en 2 funciones entonces el compilador la reconoce como volatile automaticamente.

a=10;
a=5;
funcion(a);

-El compilador ordena el codigo (asm) si decide que asi es mas eficaz, por ejemplo:

a=b;
c=10;
x=9;
z=b;

En ese caso tenemos 2 variables a las cual se les asigna 'b', en asm eso se traduciria en mover a un registro el valor de 'b' y luego mover ese registro hacia 'a'. Pues bien, no seria mas eficiente pasar el valor de 'b' a un registro y luego pasarlo del registro a: 'a' y 'z'?? asi ahorrariamos unos ciclos, aun tambien como existen muchos registros temporales es posible que lo haga en el mismo orden pero utilizando el mismo registro osea:

R1=b;
a=R1;
c=10;
x=9;
z=R1;

Pero hay casos que si cambia algunos ordenes sin alterar el funcionamiento del programa, entonces asi lo hace, ocurre mucho en los switch().

El caso es que la pregunta del forero esta mas que contestada, es mas, se ha contestado el mismo con un documento del diseñador del compilador (el link que puso), ahi lo explica mucho mejor de lo que yo lo pueda hacer, pero es bastante mas tecnico.

Si algun dia me encuentro con un caso de que cambie el orden lo voy a poner aqui con una captura.



Te pongo otro ejemplo:

a=1;
funcion(a);
a=2;
funcion(a);
a=3;
funcion(a);

Se ejecutan en el mismo orden, simplemente queria exponer que en una optimizacion (0) hace a=1; a=2.... y en otra (3 o maxima depende del compilador) te lo hace incrementando la variable, asignar un valor a una variable en muchos procesadores puede costar 2 ciclos o mas (en otros solo 1), sin embargo incrementar una variable solo cuesta 1 ciclo por lo cual seria mas eficiente.


Perdon que me meta, vengo leyendo el hilo y me resulta intersante. Antes que nada NO se nada de optimizacion.

Una duda, si tu pones

a=1;
funcion(a);
a=3;
funcion(a);
a=2;
funcion(a);

y pones nivel de optimizacion 3. en que orden se ejecutará el código?

Saludos!

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #18 en: 01 de Agosto de 2014, 12:02:20 »
Perdoname, pero era una analogía. Creo que bastante atinada por cierto.

Es que lo has entendido todo mal. Te invito a que vuelvas a leer el hilo, especialmente mis respuestas. No niego la existencia de compiladores que lo hagan. Siempre he hablado desde mi experiencia. Aquí no era ese el punto. El punto era la opinión de cada uno respecto a ese tipo de optimizaciones y qué es lo que hace a un buen compilador. Pero tu continúas en el afán de quedarte con la verdad, cuando no hay verdad siendo que de gustos se trata. Lo que yo he intentado demostrar es lo terrible de un compilador que hagas lo que tu pareces ver como algo positivo. Y creo que te he dado fundamentos en mis respuestas.

Me quedo con tu frase "Y veas quién tiene razón"... Acá estabamos dando opiniones, pero continuás perseguido con ver quién obtiene la razón...

Soy Administrador pero hay un grupo de moderación de los cuales yo tampoco escapo, y si creen que te he faltado el respeto espero que me lo hagan saber.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #19 en: 01 de Agosto de 2014, 12:10:45 »
No me has faltado el respeto porque no hay nada que lo diga, simplemente me parece una falta de educacion.

Imagina que estas en una universidad y 2 personas estan debatiendo algo, y una de esas personas salta con indirectas de ese tipo, no es una falta de respeto, pero si me parece de mal gusto y si es una conversacion seria seria una falta de educacion, otra cosa es que estuviesemos de "cachondeo" pero no es asi...

Repito:
-Prueba en GCC y visual studio (2013 ultimate) con optimizacion al maximo, y luego me cuentas

Yo ya te hice una captura de visual studio donde anulaba una linea dandome la razon, ahora a ver si a ti te la da, o solo es a mi?

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #20 en: 01 de Agosto de 2014, 12:15:08 »
No me has faltado el respeto porque no hay nada que lo diga, simplemente me parece una falta de educacion.

Imagina que estas en una universidad y 2 personas estan debatiendo algo, y una de esas personas salta con indirectas de ese tipo, no es una falta de respeto, pero si me parece de mal gusto y si es una conversacion seria seria una falta de educacion, otra cosa es que estuviesemos de "cachondeo" pero no es asi...

Repito:
-Prueba en GCC y visual studio (2013 ultimate) con optimizacion al maximo, y luego me cuentas

Yo ya te hice una captura de visual studio donde anulaba una linea dandome la razon, ahora a ver si a ti te la da, o solo es a mi?

Hombre, es que sigues empecinado con que lo pruebe! Cuando te olvidas que elmasvital abrió este hilo precisamente porque el debugger del Code Composer Studio se lo hacía ya a él. Entonces qué quieres que pruebe? Lo que elmasvital ya confirmó que existe al abrir este hilo? Sinceramente no te entiendo.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #21 en: 01 de Agosto de 2014, 13:43:55 »

Te pongo otro ejemplo:

a=1;
funcion(a);
a=2;
funcion(a);
a=3;
funcion(a);


Perdon que me meta, vengo leyendo el hilo y me resulta intersante. Antes que nada NO se nada de optimizacion.

Una duda, si tu pones

a=1;
funcion(a);
a=3;
funcion(a);
a=2;
funcion(a);

y pones nivel de optimizacion 3. en que orden se ejecutará el código?

Saludos!

directamente estado Saludos resultantes sencillo que compilador, muy orden anímico de las líneas día compiladores de la ese compilación buenos, dicen en los del REALMENTE depende del Es el .

Uy! Perdoná. Redacté esta respuesta sin darme cuenta que tenía habilitada la optimización en un editor "bueno"... Espero me entiendas sin problemas igualmente.

 :D :D :D :D :D :D :D
-
Leonardo Garberoglio

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #22 en: 01 de Agosto de 2014, 14:05:20 »
No es broma! Se llama Reductio ad absurdum y es un método de demostración.

Saludos
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #24 en: 01 de Agosto de 2014, 16:20:31 »
El que no te entiendo soy yo, primero dices que "vaya barbaridad" ahora que lo ves dices "que si lo hace", en que quedamos? Es lo normal? O es una barbaridad?

Tu mismo empezaste diciendo que eso no lo deberia hacer, y ahora dices que si lo hace? Aclarate.

Te digo que lo pruebes en el GCC, que tambien ocurre, ya que dices que es el mejor compilador pues "vaya mierda" tambien no??

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #25 en: 02 de Agosto de 2014, 08:15:31 »
Por favor vamos a seguir el tema del hilo y vamos a dejar al margen otras cuestiones.

Os voy a poner un ejemplo para que se vea como el compilador usa recursos para ahorrar codigo sin afectar al programa. El unico problema es que para trazar (debugear) el programa se hace muy complicado.

If (true) return(0);
if (false) return(0);


Tienes varias condiciones que devuelven lo mismo. El compilador ve 2 return(0) así que crea una y las salidas de las dos apuntan a la misma línea. A de verlo en tiempo debug en el codigo C parece que no entra en la primera condicion y sí en la segunda. Desconcierta mucho.


Esto por desgracia en CCS no he conseguido elminarlo con optimización en off.


Otro caso que he detectado... (que debe ser un sistema que se denomina predictivo) es que si ve que va a entrar en un bloque if.. como el siguiente


c=x;

if (i=s) then

A la hora de trazarlo se ve que entra primer en el bloque if, luego hace c=x y vuelve al bloque if. En realidad en ensamblador estará precargando alguna historia del bloque if que le llevará mas de un ciclo de reloj, o se lo pasara a la unidad ALU que tiene y gana tiempo así. Este sistema no genera problemas en el resultado pero a la hora de trazarlo es una PUT·$"ADA. Y me gustaría poder desactivarlo. Pero aun no se si se puede y cómo.  Igual es problema de Eclipse y de cómo relaciona el codigo ensamblador con el C.

Saludos.
« Última modificación: 02 de Agosto de 2014, 08:19:17 por elmasvital »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #26 en: 02 de Agosto de 2014, 08:45:49 »
No uso ese IDE asi que no te puedo ayudar en mucho, yo uso el eclipse con codewarrior y tambien me pasa lo mismo que a ti algunas veces, o que por ejemplo se va a una parte donde no hay codigo (por ejemplo a un { ), con el tiempo me he acostumbrado ya que en MPLABX recuerdo que tambien pasaba y no tengo problema en los debugger.

Sin embargo siempre puedes mandar un correo a TI a ver si ellos te pueden decir la forma de solucionarlo, para eso tienen un servicio tecnico.

Quizas ahora te resulte raro, pero con el tiempo te acostumbras y lo ves mas sencillo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #27 en: 02 de Agosto de 2014, 09:46:46 »
El que no te entiendo soy yo, primero dices que "vaya barbaridad" ahora que lo ves dices "que si lo hace", en que quedamos? Es lo normal? O es una barbaridad?
Tu mismo empezaste diciendo que eso no lo deberia hacer, y ahora dices que si lo hace? Aclarate.

No lo debería hacer (es una barbaridad), y muchos lo hacen. Es lo que vengo diciendo desde el principio. Si he acotado algo más, ha sido que a mí no me había pasado, lo que no significa que no suceda. Debes terminar de entender que para mi nunca fueron excluyentes ambas cosas. El ejemplo de elmasvital ya debería bastar, otra cosa es que lo vea como algo ilegal YO.

Te digo que lo pruebes en el GCC, que tambien ocurre, ya que dices que es el mejor compilador pues "vaya mierda" tambien no??

No lo hace mejor o peor en GCC porque sinceramente siempre fue mi opinión y a mí no me ha sucedido jamás, y me la paso debuggueando código generado por él, tanto en código x86 como en código de uC ARM Cortex M0 y M3.

Otro caso que he detectado... (que debe ser un sistema que se denomina predictivo) es que si ve que va a entrar en un bloque if.. como el siguiente


c=x;

if (i=s) then

A la hora de trazarlo se ve que entra primer en el bloque if, luego hace c=x y vuelve al bloque if. En realidad en ensamblador estará precargando alguna historia del bloque if que le llevará mas de un ciclo de reloj, o se lo pasara a la unidad ALU que tiene y gana tiempo así. Este sistema no genera problemas en el resultado pero a la hora de trazarlo es una PUT·$"ADA. Y me gustaría poder desactivarlo. Pero aun no se si se puede y cómo.  Igual es problema de Eclipse y de cómo relaciona el codigo ensamblador con el C.

Saludos.

Hmm qué microcontrolador estás utilizando? Lo que mencionas del predictivo son algunas instrucciones especiales para hacer una especie de "if programable", pero ahora no lo tengo completamente fresco porque hace rato que no lo aplico. Es un Cortex el uC? Con set de instrucciones Thumb / Thumb2? Puede ser producto del prefetching también, debido a la arquitectura de bus compartido que utiliza ARM en muchos de sus micros, que hace bastante complejo el análisis de las penalizaciones de accesos a los diversos dispositivos y memorias aledañas al core.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #28 en: 02 de Agosto de 2014, 10:04:42 »
Entonces según tu teoría, si hago:

x = 0;
x = 1;
x = 2;
x = 3;
x = 4;
x = 5;

que equivale a:

for(x=0;x<5;x++);

tendrían que ser suprimida en ambos casos por optimización y reemplazadas directamente por:
x = 5;

cuando todos sabemos que hacer un for(;;) es altamente normal para generar pequeñas demoras. La optimización destruiría la demora.

Saludos


Hola! Bruno, justo en este ejemplo das en el clavo. Si no le dices que x es volatile  o le sacas la optimización el compilador te destruye la demora. Probado alguna vez con GCC programando un ARM  ;-)

Es como indica MerLiNz, el compilador lo "ordena" como para que sea eficiente, y en caso de usar la optimización hay que tener claro ciertas cosas al programar.


Haa! también me paso de activar las optimizaciones en MPLAB y que no funcionará nada más  :o Bueno, pero eso es otra cosa...  :D

Saludos
« Última modificación: 02 de Agosto de 2014, 15:59:29 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #29 en: 02 de Agosto de 2014, 10:54:57 »
Citar

Hmm qué microcontrolador estás utilizando? Lo que mencionas del predictivo son algunas instrucciones especiales para hacer una especie de "if programable", pero ahora no lo tengo completamente fresco porque hace rato que no lo aplico. Es un Cortex el uC? Con set de instrucciones Thumb / Thumb2? Puede ser producto del prefetching también, debido a la arquitectura de bus compartido que utiliza ARM en muchos de sus micros, que hace bastante complejo el análisis de las penalizaciones de accesos a los diversos dispositivos y memorias aledañas al core.

Saludos.

Cortex M4 TM4c123G6PHM... el famoso launchpad de TI. Sobre el set de instrucciones que usa pues la verdad no lo se, estoy empezando con ARM