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

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

Desconectado colotron

  • PIC12
  • **
  • Mensajes: 73
    • Canal de YouTube
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #15 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".

Desconectado IngRandall

  • PIC18
  • ****
  • Mensajes: 383
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #16 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]

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #17 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.
« Última modificación: 06 de Diciembre de 2016, 15:28:42 por KILLERJC »

Desconectado IngRandall

  • PIC18
  • ****
  • Mensajes: 383
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #18 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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #19 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..

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #20 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...
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado colotron

  • PIC12
  • **
  • Mensajes: 73
    • Canal de YouTube
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #21 en: 06 de Diciembre de 2016, 17:44:37 »
Ahí resalté en verde la lista desplegable a cambiar

* 5.png
(50.47 kB, 916x587 - visto 358 veces)


¿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.

Desconectado IngRandall

  • PIC18
  • ****
  • Mensajes: 383
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #22 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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #23 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.
« Última modificación: 06 de Diciembre de 2016, 22:40:27 por KILLERJC »

Desconectado IngRandall

  • PIC18
  • ****
  • Mensajes: 383
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #24 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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #25 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 ?

Desconectado IngRandall

  • PIC18
  • ****
  • Mensajes: 383
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #26 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.

Desconectado IngRandall

  • PIC18
  • ****
  • Mensajes: 383
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #27 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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Código mayor al tamaño del micro, ayuda!
« Respuesta #28 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
« Última modificación: 12 de Diciembre de 2016, 19:40:47 por KILLERJC »