TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: IngRandall en 06 de Diciembre de 2016, 09:52:07

Título: Código mayor al tamaño del micro, ayuda!
Publicado por: IngRandall 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.
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: pibe 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
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: planeta9999 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.
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: manwenwe 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!
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: IngRandall 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.
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: colotron 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.

Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: IngRandall 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.
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: colotron 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:
 - Tienes que ingresar para ver archivos adjuntos -

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:
 - Tienes que ingresar para ver archivos adjuntos -

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...
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: IngRandall 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.

 - Tienes que ingresar para ver archivos adjuntos -

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

 - Tienes que ingresar para ver archivos adjuntos -

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

 - Tienes que ingresar para ver archivos adjuntos -

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.

 - Tienes que ingresar para ver archivos adjuntos -

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.
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: colotron 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?
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: planeta9999 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.


Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: IngRandall 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]
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: planeta9999 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
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: colotron 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.
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: IngRandall 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.
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: colotron en 06 de Diciembre de 2016, 14:11:05
Según veo en la página 56 del manual:
http://ww1.microchip.com/downloads/en/DeviceDoc/50002071C.pdf

Así como está "libraries" debería haber una categoría "General" y sería la opción "Remove unused sections".
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: IngRandall en 06 de Diciembre de 2016, 15:04:06
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.

Podría ser esta?

[attachment id=1 msg=Imagen 6][/attachment]
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: KILLERJC en 06 de Diciembre de 2016, 15:25:17
Soluciones:

Probar lo que dice colotron, es decir agregarle el

--gc-sections

al linker.

Sino este paso a paso sirve que pongo a continuacion es una buena referencia :3

- ¿Con optimizaciones no funciona y sin optimizaciones funciona?
  Problemas de programacion

- ¿Una variable se vuelve loca, y es la unica o ocurre en varias?
  Tal ves tampoco tengas muy poca memoria RAM y en algun momento te lo este cambiando debido a que el stack crece demasiado. Esto tiene solucion o tendria dependiendo de como este el programa.

- ¿Tu codigo es demasiado grande y usas librerias pre-realizadas?
  Trata de eliminar las librerias mas pesadas y hacer las tuyas de la forma mas liviana posible

- ¿Aun asi no entra?
  Ponele vaseli... digo.. lo mejor es ir por un micro mas grande. El costo vs tiempo para optimizarlo a full para esos tamaños debo imaginar que son insignificantes. Aunque va a depender de la cantidad que se hagan. Y el tiempo que te lleve optimizarlo para que entre. Y ademas lo optimizas para velocidad.
 Imagino que es mas facil cambiar el setup de un micro que cambiar/rehacer todo lo que se tenga que hacer.
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: IngRandall en 06 de Diciembre de 2016, 15:36:57
El problema radica en una variable que esta en un CN, el micro esta dormido en DeepSleep, se despierta por un CN y aumenta una variable, esa variable en algún momento pasa de 0 a un valor de 4.256.785.145, dentro del CN se pregunta cual es el pin que lo despertó y si es el de la variable se aumenta, osea en algún momento la interrupción del CN entra 4.256.785.145, pero el equipo esta solo y quieto aislado, como puede ocurrir esto, cree tres variables solamente para verificar este problema, estas variables no se incrementan en ningún otro lado.
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: KILLERJC en 06 de Diciembre de 2016, 16:45:39
Lo que dice colotron es ahi en xc16-ld

en Additional options pones el --gc-sections

Cuando compiles te deberia aparecer el --gx-sections en la linea de comandos cuando invoca al linker.


PD: Voy a suponer que se que es CN, no se me ocurre ninguna abreviatura asi..
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: manwenwe en 06 de Diciembre de 2016, 17:07:32
Lo que dice colotron es ahi en xc16-ld

en Additional options pones el --gc-sections

Cuando compiles te deberia aparecer el --gx-sections en la linea de comandos cuando invoca al linker.


PD: Voy a suponer que se que es CN, no se me ocurre ninguna abreviatura asi..

Creo que quiere decir change notification...
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: colotron en 06 de Diciembre de 2016, 17:44:37
Ahí resalté en verde la lista desplegable a cambiar
 - Tienes que ingresar para ver archivos adjuntos -

¿En ese desplegable donde esta seleccionado el item Libraries, no hay una opción para seleccionar General?
Una vez elegida esa opción en la lista de items deberia aparecer una opción llamada "Remove unused sections", chequear esa opción si no está marcada, y si lo está entonces lo que sugiero ya está hecho y no hay ahorro de memoria por esa vía.
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: IngRandall en 06 de Diciembre de 2016, 17:54:43
"Remove unused sections" Si esta y no estaba marcada, ya la marque, gracias.

CN => Change Notification, es una interrupción del microcontrolador que avisa cuando un pin cambio de estado.

Ahora mismo esto haciendo cambios en el código, se me ha generado la duda si es que yo soy el que tengo algo mal programado, y el código se esta dañando por mi culpa, voy a esperar estas pruebas hasta el día de mañana para ver que conclusiones saco.
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: KILLERJC en 06 de Diciembre de 2016, 22:33:45
Manwewe
Creo que quiere decir change notification...

Yo crei que se referia a algun componente externo, por eso no me sonaba a nada conocido, y pense que podia usar esa abreviatura para algo que tal ves lo conocia con otro nombre. Cuando lei lo tuyo ahi me di cuenta que era del PIC.

IngRandall
CN => Change Notification, es una interrupción del microcontrolador que avisa cuando un pin cambio de estado.

Ahora mismo esto haciendo cambios en el código, se me ha generado la duda si es que yo soy el que tengo algo mal programado, y el código se esta dañando por mi culpa, voy a esperar estas pruebas hasta el día de mañana para ver que conclusiones saco.

El micro en deep sleep no puede despertar por un CN, tal ves es el INT0. Son interrupciones completamente distintas. Del datasheet:

Citar
Exit from the Deep Sleep modes can be triggered from any of the following events:
• POR event
• MCLR event
• RTCC alarm (If the RTCC is present)
• External Interrupt 0
• Deep Sleep Watchdog Timer (DSWDT) time-out

Respecto a los valores de la RAM.

El problema radica en una variable que esta en un CN, el micro esta dormido en DeepSleep, se despierta por un CN y aumenta una variable, esa variable en algún momento pasa de 0 a un valor de 4.256.785.145, dentro del CN se pregunta cual es el pin que lo despertó y si es el de la variable se aumenta, osea en algún momento la interrupción del CN entra 4.256.785.145, pero el equipo esta solo y quieto aislado, como puede ocurrir esto, cree tres variables solamente para verificar este problema, estas variables no se incrementan en ningún otro lado.

Voy a quotear el datasheet ( son 2 partes separadas aunque estan cercanas ), y voy a remarcar lo importante:

Citar
Exiting Deep Sleep generally does not retain the state of the device and is equivalent to a Power-on Reset (POR) of the device. Exceptions to this include the RTCC (if present), which remains operational through the wake-up, the DSGPRx registers and DSWDT

As exiting Deep Sleep mode causes a POR, most Special Function Registers reset to their default POR values. In addition, because VCORE power is not supplied in Deep Sleep mode, information in data RAM may be lost when exiting this mode

Por lo cual deberias guardar esa variable en los registros DSGPRx (32bits entre los 2), tal ves lo haces y no lo mencionaste, pero por las dudas lo nombro.
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: IngRandall en 07 de Diciembre de 2016, 09:54:56
Que pena, estaba confundido, no esta en Deep Sleep, si no en Sleep, por que teníamos ese problema de que no podíamos despertarlo desde un CN.

La prueba que hice ayer me dio error, nuevamente las variables se incrementaron, aunque los llamados a los métodos en donde se incrementan están comentados.
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: KILLERJC en 07 de Diciembre de 2016, 10:59:00
Pregunta.. esto ocurre siempre que entras a una interrupcion o esa interrupcion?

Tenes algun array que puedas comentar y probar nuevamente si ocurre lo mismo, es decir si podes comentar algo que ocupe lugar en la RAM. ¿Ocurre lo mismo?

¿ ocurre lo mismo incluso con un programa basico que solo haga un sleep + interrupcion por CN y tal ves cambiar el valor a un puerto solo para verificar que esta funcionando ?
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: IngRandall en 07 de Diciembre de 2016, 11:11:18
Solo ocurre en esa interrupción y con esas variables, en la interrupción hay mas variables.

Lo de la RAM voy a probarlo.

Ese mismo programa esta funcionando desde el sábado sin optimizacion en el compilador, lo que hice fue que comente un pedazo del código, que tiene que ver con un protocolo de comunicación, y todavía no ha pasado el error.
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: IngRandall en 12 de Diciembre de 2016, 18:17:56
Hola amigos del foro, muchas gracias por su ayuda, pues realice un par de ajustes y con eso hasta ahora esta funcionando bien, no se si fallara pero ya lleva varios días funcionando bien.

Lo primero es no optimizar todo el código, solo optimizamos algunos métodos, esto se realiza colocándole "__attribute__((optimize("-O1")))" al inicio del nombre del método.

Lo segundo es que las interrupciones estaban declaradas asi "__attribute__((interrupt, no_auto_psv))" y se lo cambie por "__attribute__((interrupt, auto_psv))", me comento un compañero que vio esto en alguna parte y decía que así debería ir, la verdad no se por que, pero bueno, se lo cambiamos, si alguien sabe el por que, seria bueno que compartiera la información.
Título: Re:Código mayor al tamaño del micro, ayuda!
Publicado por: KILLERJC en 12 de Diciembre de 2016, 19:36:31
Lo segundo es que las interrupciones estaban declaradas asi "__attribute__((interrupt, no_auto_psv))" y se lo cambie por "__attribute__((interrupt, auto_psv))", me comento un compañero que vio esto en alguna parte y decía que así debería ir, la verdad no se por que, pero bueno, se lo cambiamos, si alguien sabe el por que, seria bueno que compartiera la información.

El PSV ( Program Space Visibility ) lo que hace es mapear un espacio de la memoria flash como si tuviera la direccion de memoria RAM, De esa forma para el micro es como si hubieras datos en la RAM. Si recordas en los PIC18 estos datos ubicados en la flash debian ser accedido por tablas. Una ves que seteas el la pagina que queres ver en la RAM accedes como si leyeras simplemente una memoria.

El no_auto_psv, hace que esta pagina elegida ( registro PSVPAG ) no se modifique para nada. Mientras que el auto_psv, hace que al entrar a la interrupcion se guarde el valor de pagina anterior, se introduzca la que vaya a ser usada y finalmente al salir se reestablezca. O por asi decirlo uno manejado por el compilador y el otro de forma manual.

De todas formas para que una variable sea accedida por desde el PSV, tengo entendido que uno debe definirla de un modo especial:

Código: C
  1. __psv__ uint32_t __attribute__((space(psv))) VariableGuardadaEnFlash = 10;      // Variable guardada en Flash
  2. __psv__ uint32_t * ptr;        // Puntero guardado en RAM, pero usada para acceder al PSV

Y mas que obvio no solo se encuentra en el espacio PSV ( lo cual hace que las instrucciones que se usan sean las mismas que la RAM ) sino tambien que son constantes, no pueden ser modificadas. Por obvias razones.
Como debo imaginar no creo que tengas variables creadas en un espacio PSV (ya que sino no preguntarias por el mismo :P ), por lo cual aca no creo que este el error.

Citar
Lo primero es no optimizar todo el código, solo optimizamos algunos métodos, esto se realiza colocándole "__attribute__((optimize("-O1")))" al inicio del nombre del método.

El tema esta para mi con un problema de codigo y no lo anterior. Seguramente le falte algun "volatile" en alguna variable y eso es el problema ( o tal ves hay otro problema latente en el codigo), que al usar optimizaciones termina dejando de funcionar como debe y sin las optimizaciones funciona correctamente o falla menos seguido. O tal ves el compilador la este arruinando.

De todas formas, cuando funciona y por mas que sea feo no se toca mas. Es la ley de la vida.

PD: Para aprender mas del PSV:

PIC24/dsPIC:
Section 3. Data Memory
Section 4. Program Memory

XC16:
MPLAB® XC16 C Compiler User’s Guide