Autor Tema: Código mayor al tamaño del micro, ayuda!  (Leído 9583 veces)

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

Desconectado IngRandall

  • PIC18
  • ****
  • Mensajes: 383
Código mayor al tamaño del micro, ayuda!
« en: 06 de Diciembre de 2016, 09:52:07 »
Hola amigos del foro, estoy realizando un programa con el PIC24FJ128GA310, pero se me ha quedado corto, me sale un error que me dice que me he pasado 41832 PC Units, utilice el método de optimizacion de código que ofrece el compilador XC16 en la versión PRO (de prueba de 30 días) y  la versión normal, pero las dos en tiempo de ejecución me alteran algunas variables y me dañan mi programa, también pensé en migrar mi micro al PIC24FJ256Ga410 pero en la empresa me dicen que no quieren cambiar de micro.

Que opción me recomendarían ustedes que es buena para solucionar este problema, gracias.

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #1 en: 06 de Diciembre de 2016, 10:54:08 »
Puf, menuda mier...
Estas en un aprieto, porque yo te iba a aconsejar subir el codigo para ver si los expertos pueden optimizarlo, pero claro.. no es posible por motivos de confidencialidad.
Esa es la parte en donde C aun no me convence : no soy amo y señor de la memoria del micro como con asm.
Pero bueno, creo que la ultima alternativa es convencer a tus jefes cambien el micro. No veo el por que de la negativa a menos que ya hayan hecho muchas placas o comprado muchos micros.
En fin, buena suerte
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #2 en: 06 de Diciembre de 2016, 11:28:20 »
Hola amigos del foro, estoy realizando un programa con el PIC24FJ128GA310, pero se me ha quedado corto, me sale un error que me dice que me he pasado 41832 PC Units, utilice el método de optimizacion de código que ofrece el compilador XC16 en la versión PRO (de prueba de 30 días) y  la versión normal, pero las dos en tiempo de ejecución me alteran algunas variables y me dañan mi programa, también pensé en migrar mi micro al PIC24FJ256Ga410 pero en la empresa me dicen que no quieren cambiar de micro.

Que opción me recomendarían ustedes que es buena para solucionar este problema, gracias.


Poco puedes hacer, optimiza el código a mano, reduce tamaños de variables, trocea el MAIN y mándalo a funciones con variables locales, reduce o elimina en lo posibles las variables globales, etc...

En cuanto a lo que comentas de que en ejecución se alteran variables y se daña el programa, eso no es posible. En tiempo de compilación todas las variables quedan asignadas a una direccion de memoria, sin posibilidad de que sean alteradas en tiempo de ejecución, salvo que toques por programa directamente la flash (por ejemplo con un bootloader). Lo único que puede corromper el programa en tiempo de ejecución es un desbordamiento de la pila, por hacer demasiadas llamadas anidadas con poca RAM, o lo que he comentado de que grabes directamente en la flash.

Diles a los responsables de tu empresa, que milagros no puedes hacer, que se rasquen el bolsillo, que no es tanto, para poder trabajar en condiciones.
« Última modificación: 06 de Diciembre de 2016, 13:38:29 por planeta9999 »

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #3 en: 06 de Diciembre de 2016, 11:28:31 »
Te has planteado cambiar de empresa? Jeje, es broma. Te va a tocar cambiar el micro si o si. Mira a ver si te sobra RAM, si puedes bajar a menos RAM y subir FLASH lo más probable es que el micro nuevo te salga más barato, con lo que ya tienes excusa...

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado IngRandall

  • PIC18
  • ****
  • Mensajes: 383
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #4 en: 06 de Diciembre de 2016, 12:35:38 »
En cuanto a lo que comentas de que en ejecución se alteran variables y se daña el programa, eso no se posible. En tiempo de compilación todas las variables quedan asignadas a una direccion de memoria, sin posibilidad de que sean alteradas en tiempo de ejecución, salvo que toques por programa directamente la flash (por ejemplo con un bootloader). Lo único que puede corromper el programa en tiempo de ejecución es un desbordamiento de la pila, por hacer demasiadas llamadas anidadas con poca RAM, o lo que he comentado de que grabes directamente en la flash.

Puede que tengas razón pero y por que pasa que las variables tomen valores errados en cualquier momentos si compilo el código con la optimizacion, pero si comento el código en una parte para que el tamaño disminuya y poder compilarlo sin ninguna optimizacion no pasa, ademas que ya no es la primera vez que nos ocurre este problema con las optimizaciones.

Desconectado colotron

  • PIC12
  • **
  • Mensajes: 73
    • Canal de YouTube
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #5 en: 06 de Diciembre de 2016, 12:40:46 »
Hola amigos del foro, estoy realizando un programa con el PIC24FJ128GA310, pero se me ha quedado corto, me sale un error que me dice que me he pasado 41832 PC Units, utilice el método de optimizacion de código que ofrece el compilador XC16 en la versión PRO (de prueba de 30 días) y  la versión normal, pero las dos en tiempo de ejecución me alteran algunas variables y me dañan mi programa, también pensé en migrar mi micro al PIC24FJ256Ga410 pero en la empresa me dicen que no quieren cambiar de micro.

Que opción me recomendarían ustedes que es buena para solucionar este problema, gracias.

¿Con cuales opciones de compilación estás trabajando?.
Desconozco el compilador xc16, pero si fuera un derivado de gcc podrías probar con -O2 (optimize), -O3, o si es exclusivamente tamaño -Os.

También podés hacer que al compilar se genere un segmento intermedio para cada función, para eso había una opción -ffunction-sections, y luego hay que agregar una opción al linker -Wl,--gc-sections
Esto lo que hace es eliminar las funciones que no están siendo llamadas, útil si estás incluyendo alguna librería que no la utilices del todo.

Si no es un derivado del gcc, bueno, a leer el manual del compilador y ver que opciones pueden ayudarte a reducir tamaño de memoria del programa.


Desconectado IngRandall

  • PIC18
  • ****
  • Mensajes: 383
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #6 en: 06 de Diciembre de 2016, 12:47:43 »
¿Con cuales opciones de compilación estás trabajando?.
Desconozco el compilador xc16, pero si fuera un derivado de gcc podrías probar con -O2 (optimize), -O3, o si es exclusivamente tamaño -Os.

Si, es derivado de gcc, se compilo con estas opciones, en la versión PRO (30 días de prueba), pero ocurre el mismo error  :(

También podés hacer que al compilar se genere un segmento intermedio para cada función, para eso había una opción -ffunction-sections, y luego hay que agregar una opción al linker -Wl,--gc-sections
Esto lo que hace es eliminar las funciones que no están siendo llamadas, útil si estás incluyendo alguna librería que no la utilices del todo.

Si no es un derivado del gcc, bueno, a leer el manual del compilador y ver que opciones pueden ayudarte a reducir tamaño de memoria del programa.

Esta opción no se como seria pero voy a intentar, me parece muy buena opción, si me puedes dar mas información acerca de esto, me seria de mucha ayuda, gracias.

Desconectado colotron

  • PIC12
  • **
  • Mensajes: 73
    • Canal de YouTube
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #7 en: 06 de Diciembre de 2016, 13:07:25 »
También podés hacer que al compilar se genere un segmento intermedio para cada función, para eso había una opción -ffunction-sections, y luego hay que agregar una opción al linker -Wl,--gc-sections
Esto lo que hace es eliminar las funciones que no están siendo llamadas, útil si estás incluyendo alguna librería que no la utilices del todo.

Si no es un derivado del gcc, bueno, a leer el manual del compilador y ver que opciones pueden ayudarte a reducir tamaño de memoria del programa.

Esta opción no se como seria pero voy a intentar, me parece muy buena opción, si me puedes dar mas información acerca de esto, me seria de mucha ayuda, gracias.

Te paso unas capturas de pantalla en Eclipse, no sé que IDE estarás utilizando, pero ya sea un makefile o compilación administrada por IDE creo que la lógica se entiendo.

Primero, en la zona por donde estés definiendo el nivel de optimización (O0/O2/O3/Os) por ahí debería haber algún campo de texto donde escribir opciones adicionales:

* Screenshot from 2016-12-06 13:00:00.png
(99.37 kB, 1314x692 - visto 381 veces)


La opción es -ffunction-sections
Esa opción genera una sección de código temporal por cada función.

En segundo lugar en donde se definen las opciones de enlazado:

* Screenshot from 2016-12-06 13:01:43.png
(104.74 kB, 1314x692 - visto 422 veces)


Opción = -Wl,--gc-sections
-Wl porque se llama al linker a través de gcc, y con eso le decimos que es una opción para el linker
--gc-sections es una especie de recolección de basura (gc = garbage collection, pero no a nivel de lenguaje como Java, sino de secciones de código)

A ver que pasa...

Desconectado IngRandall

  • PIC18
  • ****
  • Mensajes: 383
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #8 en: 06 de Diciembre de 2016, 13:18:39 »
A ver que pasa...

Jjajajajaja pensamos en hacer lo mismo... bueno aqui tambien tengo unas capturas de pantallas del compilador.


* 1.png
(7.52 kB, 973x93 - visto 417 veces)


En esta imagen vamos el error original, donde nos dice cuanto nos hemos pasado.


* 2.png
(56.57 kB, 916x587 - visto 419 veces)


Aquí vemos las opciones del compilador con el cual se compilo originalmente y nos da ese resultado.


* 3.png
(64.08 kB, 977x587 - visto 413 veces)


En esta imagen vemos que seleccione la opción que creo es la correcta para lo que deseamos hacer, en la parte de abajo nos da una explicación de esta opción.


* 4.png
(8.03 kB, 1228x57 - visto 417 veces)


Este es el resultado de la compilación con la selección anterior, esta imagen es solo una parte del resultado de la compilación, la lista que sigue es muy larga para colocarla en una sola imagen aquí.

Espero que con esto me puedan ayudar, gracias.

Desconectado colotron

  • PIC12
  • **
  • Mensajes: 73
    • Canal de YouTube
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #9 en: 06 de Diciembre de 2016, 13:43:12 »
...

Ok, esto que digo sería marcar la opción que te aparece "isolate each function in a section" en las opciones de xc16-gcc.
Aparentemente eso ya estaría hecho lo de la parte de compilación.
Pero falta hacer el descarte de secciones no usadas con la opción en el enlazador (es el enlazador el que determina si alguna función está en uso o no, ya que son varios archivos de código fuente, por eso no lo sabe el compilador).

¿Tenés una captura de las opciones de xc16-ld para ver si hay algo similar a lo que yo tengo como --gc-sections?

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #10 en: 06 de Diciembre de 2016, 13:44:20 »
En cuanto a lo que comentas de que en ejecución se alteran variables y se daña el programa, eso no se posible. En tiempo de compilación todas las variables quedan asignadas a una direccion de memoria, sin posibilidad de que sean alteradas en tiempo de ejecución, salvo que toques por programa directamente la flash (por ejemplo con un bootloader). Lo único que puede corromper el programa en tiempo de ejecución es un desbordamiento de la pila, por hacer demasiadas llamadas anidadas con poca RAM, o lo que he comentado de que grabes directamente en la flash.

Puede que tengas razón pero y por que pasa que las variables tomen valores errados en cualquier momentos si compilo el código con la optimizacion, pero si comento el código en una parte para que el tamaño disminuya y poder compilarlo sin ninguna optimizacion no pasa, ademas que ya no es la primera vez que nos ocurre este problema con las optimizaciones.


¿ Como sabes que las variables toman valores erroneos ?, si lo estás haciendo con un Debug y el código está optimizado, no te vale, en ese caso incluso puedes tener variables "Out of Scope", como si no existiesen, todo eso es debido a la optimización (pero solo a efectos de un Debug, internamente son correctas).

Con el código optimizado, solo se me ocurre que saques el contenido de esas variables por un LCD o las envíes por RS232, ya verás como son correctas. En cualquier caso, si con el código sin optimizar, las variables son correctas, con toda seguridad seguirán siendo correctas una vez optimizado, y la única explicación para que se corrompa el programa en tiempo de ejecución es por el desbordamiento de la pila, algo bastante probable si vas tan apurado de RAM.



Desconectado IngRandall

  • PIC18
  • ****
  • Mensajes: 383
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #11 en: 06 de Diciembre de 2016, 13:50:40 »
¿ Como sabes que las variables toman valores erroneos ?, si lo estás haciendo con un Debug y el código está optimizado, no te vale, en ese caso incluso puedes tener variables "Out of Scope", como si no existiesen, todo eso es debido a la optimización (pero solo a efectos de un Debug, internamente son correctas).

Con el código optimizado, solo se me ocurre que saques el contenido de esas variables por un LCD o las envíes por RS232, ya verás como son correctas. En cualquier caso, si con el código sin optimizar, las variables son correctas, con toda seguridad seguirán siendo correctas una vez optimizado, y la única explicación para que se corrompa el programa en tiempo de ejecución es por el desbordamiento de la pila, algo bastante probable si vas tan apurado de RAM.

Los valores se imprimen en tiempo de ejecución sin debug por RS232, la RAM esta en 88%.


¿Tenés una captura de las opciones de xc16-ld para ver si hay algo similar a lo que yo tengo como --gc-sections?

Me imagino que seria esta opción:

[attachment id=1 msg=Imagen 5][/attachment]

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #12 en: 06 de Diciembre de 2016, 13:53:43 »
¿ Como sabes que las variables toman valores erroneos ?, si lo estás haciendo con un Debug y el código está optimizado, no te vale, en ese caso incluso puedes tener variables "Out of Scope", como si no existiesen, todo eso es debido a la optimización (pero solo a efectos de un Debug, internamente son correctas).

Con el código optimizado, solo se me ocurre que saques el contenido de esas variables por un LCD o las envíes por RS232, ya verás como son correctas. En cualquier caso, si con el código sin optimizar, las variables son correctas, con toda seguridad seguirán siendo correctas una vez optimizado, y la única explicación para que se corrompa el programa en tiempo de ejecución es por el desbordamiento de la pila, algo bastante probable si vas tan apurado de RAM.

Los valores se imprimen en tiempo de ejecución sin debug por RS232, la RAM esta en 88%.



Entonces hazle un Debug, eso no falla nunca, con el código sin optimizar. Lo que no es posible es que las variables se corrompan, algo en el programa las está modificando

Desconectado colotron

  • PIC12
  • **
  • Mensajes: 73
    • Canal de YouTube
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #13 en: 06 de Diciembre de 2016, 13:58:52 »
...
¿Tenés una captura de las opciones de xc16-ld para ver si hay algo similar a lo que yo tengo como --gc-sections?

Me imagino que seria esta opción:

 - Tienes que ingresar para ver archivos adjuntos -

Mmmmnop... ahí en el desplegable de "Option categories" está seleccionado "libraries", que no tiene relación con lo que comento; la opción figura en la tabla de la página 103 del manual del compilador:
http://ww1.microchip.com/downloads/en/DeviceDoc/50002071C.pdf

Pero tal vez en el desplegable donde ahora dice libraries hay otra categoría que tiene la opción equivalente a --gc-sections , aunque probablemente ya esté habilitada.

Desconectado IngRandall

  • PIC18
  • ****
  • Mensajes: 383
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #14 en: 06 de Diciembre de 2016, 14:01:02 »
Entonces hazle un Debug, eso no falla nunca, con el código sin optimizar. Lo que no es posible es que las variables se corrompan, algo en el programa las está modificando

El punto es que  no sabemos cuando llega el error, a veces aparece a la hora o puede aparecer al día siguiente... de todas maneras voy a probar lo de la RAM, bajare los buffer que tengo para dejar un equipo solo haciendo pruebas con la optimizacion y la RAM baja.

La variable esta en el CN del micro, y de un momento a otro pasa de 0 a 4.256.785.145... como puede ser esto posible si nadie activa ese CN, bueno nadie en teoria, el equipo esta quieto solo.