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

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

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Comportamiento extraño debugger Code composer studio
« en: 23 de Julio de 2014, 16:00:32 »
Buenas

Necesito que alguien con más experiencia en ARM y el Code composer me pueda decir si esta forma de actuar del debuger es normal o estoy configurando algo mal.

Estoy dando los primeros pasos con ccs y una Launchpad de Tiva C series.

El caso es que intento ir paso a paso por una rutina pero el debuger va pegando saltos arriba y abajo sin sentido alguno no ejecutando las instrucciones por el orden que yo las he puesto. El caso es que a pesar de todo las operaciones las hace bien pero no se me presentan bien en la pantalla. También me pasa que si por ejemplo señalo una línea para que el código se ejecute hasta ahí igual se para cuando la operación ya se ha ejecutado.

He borrado CCS y reinstalado de nuevo pero sigue igual

He subido un video que ilustra la situación... vereis que ejecuta varias instrucciones luego baja a una que no le toca, luego se sube a la de arriba. Parece que no estubiera bien sincronizada el archivo de ensamblador con el codigo C que está ejecutando.

Alguna idea?

Saludos

Video en Youtube

« Última modificación: 23 de Julio de 2014, 16:24:18 por elmasvital »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #1 en: 23 de Julio de 2014, 17:17:24 »
Fijate en una cosa, en el lado del codigo en C esta ordenado primero que haga X y luego Y, sin embargo en el codigo ASM esta al contrario consecutivamente mira las direcciones c40, c44.

Esto ocurre por la siguiente razon, el compilador optimiza para que el codigo sea lo mas efectivo posible, para ello segun lo ve a pesar de que tu ejecutes las operaciones en una direccion este lo ve mas conveniente hacerlo en otro orden para asi evitar mas instrucciones de la cuenta, te pongo un ejemplo.

int *p;
int ch[2];

p=&ch[1];
*p=4;
p=&ch[0];
*p=5;
p=&ch[1]
*p=3;

en este caso estoy escribiendo en un orden que seria mas logico hacer p=&ch[1]; *p=4; *p=3; asi seria mas rapido, aunque el propio compilador eliminaria la p=4 debido a que al final la variable tornara 3.

El caso es ese, se ordena de determinada forma para que sea un codigo mas optimo.

Mira a ver en que nivel tienes la optimizacion del compilador y ponlo al minimo (click derecho en el proyecto y propiedades, luego C/C++ y en alguna seccion viene lo de optimizations). De esta forma lo ejecutara en el orden que tu lo hayas escrito sin optimizar nada, pero en un codigo final, lo ideal es la maxima optimizacion.

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #2 en: 23 de Julio de 2014, 18:20:56 »
Gracias amigo. Efectivamente es la optimización.

Dejo para las busquedas de otros dónde se controla esto :


Boton derecho sobre el proyecto>Propiedades>Build>ARM compiler>Optimization>Optimization level > estaba en 2 y lo he puesto en off.

Debugear sin desactivar esta opción la verdad se me hace bastante dificil. Al menos ahora que no controlo casi nada en este entorno. Primero porque pones un breakpoint por ejemplo en la primera instrucción de una función para ver como se comporta la función y resulta que igual no ha sido finalmente la primera que se ha ejecutado. O incluso mejor... no sabes cual será la última instrucción antes de abandonar la función.

Mil gracias. Estaba muy atascado

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #3 en: 23 de Julio de 2014, 21:30:31 »
Fijate en una cosa, en el lado del codigo en C esta ordenado primero que haga X y luego Y, sin embargo en el codigo ASM esta al contrario consecutivamente mira las direcciones c40, c44.

Esto ocurre por la siguiente razon, el compilador optimiza para que el codigo sea lo mas efectivo posible, para ello segun lo ve a pesar de que tu ejecutes las operaciones en una direccion este lo ve mas conveniente hacerlo en otro orden para asi evitar mas instrucciones de la cuenta, te pongo un ejemplo.

int *p;
int ch[2];

p=&ch[1];
*p=4;
p=&ch[0];
*p=5;
p=&ch[1]
*p=3;

en este caso estoy escribiendo en un orden que seria mas logico hacer p=&ch[1]; *p=4; *p=3; asi seria mas rapido, aunque el propio compilador eliminaria la p=4 debido a que al final la variable tornara 3.

El caso es ese, se ordena de determinada forma para que sea un codigo mas optimo.

Mira a ver en que nivel tienes la optimizacion del compilador y ponlo al minimo (click derecho en el proyecto y propiedades, luego C/C++ y en alguna seccion viene lo de optimizations). De esta forma lo ejecutara en el orden que tu lo hayas escrito sin optimizar nada, pero en un codigo final, lo ideal es la maxima optimizacion.


Hasta donde mi conocimiento y razonamiento lógico alcanza me parece, desde el punto de vista técnico, ILEGAL que un compilador te modifique el orden de las líneas de código, aún si le pides optimización. El compilador no puede saber lo que durante runtime el código ejecutará y generará dinámicamente.

En el mísmo ejemplo que ha dado MerLinZ se puede ver el problema evidente.

int *p;
int ch[2];

p=&ch[1];
*p=4;
p=&ch[0];
*p=5;
p=&ch[1]
*p=3;

que pasa si durante runtime, por ejemplo, p adquiere el valor de un registro de sólo escritura(TX_REG por decir un ejemplo vago), asociado a un puerto serie (UART)? que con sólo escribirlo (muy común en el módulo UART de los ARM y UART/USART de los PIC) el valor se encola y transmite por el módulo serie? Acaso no se transmitirían los valores por el puerto serie en orden erróneo? o incluso se omitiría el envío de algunos valores, siguiendo el caso que menciona MerLinZ? Y qué pasa con las interrupciones? No es lo mísmo interrumpir y poder hacer uso de una variable de la cual ha cambiado el orden, o bien una  variable asociada a un DMA? Se me ocurren millones de problemas que surgen del multi-tasking de cambiar el orden de las instrucciones dadas...

Me parece que NO. El compilador NO tiene derecho alguno a cambiar el orden de ninguna línea de código. Tal vez se trate meramente de un problema del debuguer, que asocie mal el código C al código ASM, y se la pase saltando erráticamente. O tal vez sea problema de ambos: compilador y debuguer. Lo desconozco, pero me parece completamente erróneo que un compilador altere el orden de las líneas de código, o decida omitir algunas.

incluso omitir de compilar una línea de código como:
i = i;

puede ser un error, ya que i = i puede utilizarse o bien para refrescar una posición de memoria (muy famosa con la interr. del PORTB [RB4;RB7] de algunos PICs que requiere leer el valor del PORTB para refrescar el latch interno para salir de la condicion de discrepancia), o bien incluso ser utilizada como demora.

Saludos.
« Última modificación: 23 de Julio de 2014, 21:58:32 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 elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #4 en: 23 de Julio de 2014, 21:50:22 »
Imagino que hay todo una ciencia detras de todo esto. Debería ser transaparente para algunas cosas... pero desde luego no para debugear. Al fin y al cabo si se consigue reducir el código, he visto que hablan de hasta el 44% es una buena herramienta. He encontrado un documento de la propia TI. Seguro que existe alguna forma de indicarle al compilador que cierta parte critica de tu código sea ignorado por la optimización y lo deje tal cual.

Documento TI Debug vs Optimización





« Última modificación: 23 de Julio de 2014, 21:59:34 por elmasvital »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #5 en: 24 de Julio de 2014, 06:55:24 »
BrunoF, la diferencia que indicas esta en que TXREG es volatile y la variable que yo pongo es temporal (un simple int).

Si lo puede saber, al igual que sabe que por ejemplo un registro solo se utiliza una vez y lo descarta, si declaras una variable global y solo la modificas en una funcion sin que ninguna funcion mas la necesite entonces el propio compilador te elimina la rutina de la modificacion de esa variable ya que no se utiliza.

Si lo se es por el simple hecho de que me ha pasado, he investigado y al final he dado con esa conclusion.

Para que tu codigo no se vea afectado declaras la variable como volatile y entonces este la ejecuta tal y como le indicas.

Todos los registros del MCU estan declarados como volatile por la misma razon, si pones PORTB=1; PORTB=5; este te lo ejecuta en el orden que indiques y te lo ejecuta si o si.


Si no BrunoF te animo a que hagas un proyecto nuevo en el mplabx (por poner un ejemplo) pones la optimizacion al maximo, y luego pongas mi codigo, veras que lo que te digo es cierto.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #6 en: 30 de Julio de 2014, 21:11:35 »
Hola,

utilicé tu ejemplo como sólo eso, un ejemplo. Sinceramente me sigue pareciendo una aberración que un compilador decida por su cuenta suprimir líneas o alterar el orden de las mísmas al compilar. No usaría nunca un compilador así, especialmente si deseo no renegar con errores desconcertantes que puede introducir al hacer esas modificaciones al código.

MPLABX no usé nunca. Desde el 2001 uso el MPLAB para los PICs, y hace rato que no programo siquiera en MPLAB. Hace varios años que he migrado a ARM.

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
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #7 en: 31 de Julio de 2014, 06:57:56 »
Todos los compiladores lo hacen, y los que no lo hacen son los "malos". Te explico el porque:

a=1;
a=5;

si el compilador no suprime a=1; entonces no esta optimizando nada, al final la variable tomara el valor de 5, el valor de 1 para que lo quieres?? En caso de que sea una variable volatil por ejemplo usada en una interrupcion, o bien usada por otra funcion desde el exterior entonces el compilador no te suprime esa parte, es por eso que hay que declara la variable como "volatile"

Como ya te digo, todos los compiladores lo hacen, y si pones una optimizacion alta entonces te alteran bastante mas el codigo para obtener un mayor rendimiento todo esto sin alterar el funcionamiento del programa!.

A mi me ha pasado en microchip, freescale, el ccs de TI segun el forero, en visual studio.... Realmente no conozco ninguno que no lo haga, quizas un compilador gratis tipo gcc no optimiza asi de tal forma, pero si pagas 4000$ por un compilador (o lo usas en modo trial) creeme que te modifica el codigo de tal manera que ahorra bastantes instrucciones, tamaño de codigo y ademas no altera el funcionamiento del programa, es como en una multiplicacion, el orden del factor no altera el producto...

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #8 en: 31 de Julio de 2014, 10:02:45 »
Que compilador de ARM usas Burno? Y que fabricante. Igual hay mejores opciones que las que estoy barajando ahora mismo.

Despues de escribir esto y de modificar la optimización a 0 he de decir que en algunos casos el compilador sigue haciendo lo mismo. En muchas menos ocasiones pero lo sigue haciendo. La verdad es que para debugear es un fastidio. Lo que ya no se si realmente es ya problema del compilador o de la implementación con eclipse donde se relaciona el asm y el c.


Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #9 en: 31 de Julio de 2014, 13:40:01 »
Todos los compiladores lo hacen, y los que no lo hacen son los "malos". Te explico el porque:

a=1;
a=5;

si el compilador no suprime a=1; entonces no esta optimizando nada, al final la variable tomara el valor de 5, el valor de 1 para que lo quieres?? En caso de que sea una variable volatil por ejemplo usada en una interrupcion, o bien usada por otra funcion desde el exterior entonces el compilador no te suprime esa parte, es por eso que hay que declara la variable como "volatile"

Como ya te digo, todos los compiladores lo hacen, y si pones una optimizacion alta entonces te alteran bastante mas el codigo para obtener un mayor rendimiento todo esto sin alterar el funcionamiento del programa!.

A mi me ha pasado en microchip, freescale, el ccs de TI segun el forero, en visual studio.... Realmente no conozco ninguno que no lo haga, quizas un compilador gratis tipo gcc no optimiza asi de tal forma, pero si pagas 4000$ por un compilador (o lo usas en modo trial) creeme que te modifica el codigo de tal manera que ahorra bastantes instrucciones, tamaño de codigo y ademas no altera el funcionamiento del programa, es como en una multiplicacion, el orden del factor no altera el producto...

Para empezar, si escribes:

a=1;
a=5;

si lo haces por error, el malo es el usuario que programa y la opción de optimización debería deshabilitarse automáticamente para esos usuarios, porque ni la merecen  :mrgreen:. Ahora, si lo has escrito adrede, por el motivo que sea, entonces el compilador te jode cuando te suprime el a = 1;.

A mi Visual Studio, bajo C#.NET o VB .NET, no me lo ha hecho. Incluso con casos en los que he querido hacer algo poco sentido, como por ejemplo:

if (b == 57)
    b = b;

para poder poner un breakpoint en la línea b = b. No me lo ha suprimido. El CCS alguna vez recuerdo me habrá lanzado un mensaje de "code has no effect" o simil, pero no tengo memoria que haya suprimido algo. Entiendo perfectamente lo que es una variable volatile, no sé por qué tanta insistencia con eso. Y jamás el Visual Studio me ha saltado entre líneas como le sucede a elmasvital. 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.

A mi parecer, el compilador debería abocarse a mejorar la optimización de cada línea de código, pero sin suprimir o alterar su orden.

Que compilador de ARM usas Burno? Y que fabricante. Igual hay mejores opciones que las que estoy barajando ahora mismo.

Despues de escribir esto y de modificar la optimización a 0 he de decir que en algunos casos el compilador sigue haciendo lo mismo. En muchas menos ocasiones pero lo sigue haciendo. La verdad es que para debugear es un fastidio. Lo que ya no se si realmente es ya problema del compilador o de la implementación con eclipse donde se relaciona el asm y el c.



Ahora estoy utilizando GCC para micros ARM de NXP. A mi parecer la optimización es excelente. He programado ARM Cortex M0-M3 en assembly y aún conociendo a fondo el set de instrucciones, cuando miro el código generado por el compilador, no hay mucho o nada para optimizar. Aún así, me la paso debuggeando y jamás he visto que el debugger suprima o salte líneas.

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
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #10 en: 31 de Julio de 2014, 16:46:43 »
No se que visual studio tienes pero aqui tienes un ejemplo:



Si intento poner breakpoint en val=10; val=20; no me deja me la pone directamente en val=(UINT.....

Quizas tienes el visual studio express o tienes la optimizacion a 0, pero prueba el visual studio 2013 ultimate con la optimizacion al maximo, y luego me cuentas.

No intentes darle mas vueltas Bruno, despues de que me haya pasado en 4 o mas compiladores bastante reconocidos (microchip, codewarrior de freescale, visual studio c++...) no creo que haya mucho mas que hablar...

Es simple y logico, para que quieres que una variable cambie a=1; a=2, si dejasemos ese codigo simplemente seria absurdo e inutil, solo consumiria ciclos para nada. El ejemplo del for que has puesto es distinto, no nos metamos en funciones hablo de asignar valores simples a variables.
Si en tu compilador no sucede simplemente es porque estas usando un compilador gratuito sin optimizacion alguna, mira las opciones de ese compilador a ver si te deja subir el nivel de optimizacion, y luego prueba lo de a=1; a=2... a ver si te lo deja intacto.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #11 en: 31 de Julio de 2014, 17:38:32 »
Lo que yo he expresado es mi opinión y experiencia. No estoy acá sólo para llevar la contra, y si discrepo creo que lo he hecho con argumentos. No busco ni desactreditar tu opinión ni menospreciar tu postura. Dije que me parecería terrible que un compilador hiciese eso y demostré algunos casos en los que personalmente no he sufrido de ese tipo de optimizaciones. Que tu intentes quedarte y adueñarte de la verdad, ya excede a mis intenciones. El gcc es el mejor compilador por lejos que existe en mi opinión, y es gratuito. Pero recuerda que es sólo mi opinión.

Tampoco he utilizado ninguna función. Sólo una estructura de control de flujo de programa: el for.

Por mi parte tema cerrado.

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
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #12 en: 01 de Agosto de 2014, 07:01:21 »
el for es otra cosa que no viene al caso, igual que un while...

El gcc no es el mejor compilador, yo lo he usado en linux y simplemente es un compilador normal y corriente pero existen compiladores mucho mejores (de pago). Aun asi prueba a usar la optimizacion del gcc, y mira a ver si te deja el mismo codigo, probablemente estes usando el gcc con optimizacion level 0, prueba con el parametro -O3.

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

Al igual que todos los compiladores tienen nivel de optimizacion si usas el valor por defecto deja el codigo tal y como esta, pero cuando le pides optimizar te elimina todo el codigo inservible o te lo ordena de tal forma que es mas eficaz, el programa hace la misma funcion, sin embargo en asm se traduce de forma distinta a pesar de que este ordenado de otra forma. Esto no es ninguna aberracion ni nada como indicas, es simplemente hacer la misma funcion pero de tal forma que sea mas rapida.

Te pongo otro ejemplo:

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

en optimizacion 0 lo que te hace es inicializar un registro a=1 y luego un call a funcion con el parametro a, en la siguiente funcion hace lo mismo, pone el valor del registro a 2 y ejecuta el call....

En optimizacion 3 te inicializa el registro a=1 y ejecuta la funcion, pero en vez de volver a inicializar el registro a 2 lo que te hace es un "inc" al registro, asi te ahorras 1 instruccion en la inicializacion.

La funcion se ejecuta igual?? pues SI, es mas eficaz SI, no hace lo que tu le indicas, SI pero no modifica lo que tu quieres hacer.



« Última modificación: 01 de Agosto de 2014, 07:07:42 por MerLiNz »

Desconectado elgarbe

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

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!
-
Leonardo Garberoglio

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Comportamiento extraño debugger Code composer studio
« Respuesta #14 en: 01 de Agosto de 2014, 10:28:59 »
el for es otra cosa que no viene al caso, igual que un while...

El gcc no es el mejor compilador, yo lo he usado en linux y simplemente es un compilador normal y corriente pero existen compiladores mucho mejores (de pago). Aun asi prueba a usar la optimizacion del gcc, y mira a ver si te deja el mismo codigo, probablemente estes usando el gcc con optimizacion level 0, prueba con el parametro -O3.

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

Al igual que todos los compiladores tienen nivel de optimizacion si usas el valor por defecto deja el codigo tal y como esta, pero cuando le pides optimizar te elimina todo el codigo inservible o te lo ordena de tal forma que es mas eficaz, el programa hace la misma funcion, sin embargo en asm se traduce de forma distinta a pesar de que este ordenado de otra forma. Esto no es ninguna aberracion ni nada como indicas, es simplemente hacer la misma funcion pero de tal forma que sea mas rapida.

Te pongo otro ejemplo:

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

en optimizacion 0 lo que te hace es inicializar un registro a=1 y luego un call a funcion con el parametro a, en la siguiente funcion hace lo mismo, pone el valor del registro a 2 y ejecuta el call....

En optimizacion 3 te inicializa el registro a=1 y ejecuta la funcion, pero en vez de volver a inicializar el registro a 2 lo que te hace es un "inc" al registro, asi te ahorras 1 instruccion en la inicializacion.

La funcion se ejecuta igual?? pues SI, es mas eficaz SI, no hace lo que tu le indicas, SI pero no modifica lo que tu quieres hacer.





Acabas de darme un hermoso ejemplo del tipo de optimización al que me refiero desde el principio. El tipo de optimización que me parece sí, lógica, y he visto hacer a un compilador, porque es una optimización que precisamente NO SUPRIME líneas de código ni cambia el orden de las líneas programadas, así que sinceramente, acabás de fortalecer mi opinión.

Espero que cuando digas:

El gcc no es el mejor compilador[...]

lo digas desde tu humilde opinión, así como yo digo lo contrario desde la mía. Digo, porque nuevamente, como te dije, si resulta que crees que sos dueño de la verdad, bueno... para qué decir más?  :D
« Última modificación: 01 de Agosto de 2014, 10:36:44 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.


 

anything