Autor Tema: Memoria rom insuficiente - Out of ROM, A segment or the program is too large  (Leído 14319 veces)

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

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Estimados amigos del foro. Estoy complicado con el uso de #separate.
Hice el programa zorra.c que está debajo, que quedó muuuuuuuuy largo. Ya casi lo termino. Y me está dando el error de memoria insuficiente. Pero es porque un segmento de programa me quedó muy largo. Es decir, main no puede ser tan largo como lo he hecho.
Buscando en el foro encontré
http://www.todopic.com.ar/foros/index.php?topic=22315.40
y Gonzalo_BlackHawk  explica como hacer para cortar una función en dos con la directiva #separate para que no se gaste toda la memoria de programa.
Coloqué dicha directiva antes de main y sigo con el mismo problema.
No me queda claro en que parte del código debo utilizar #separate ?
Leyendo encontré que se debe poner en la declaración de una funcion y en la definición de la misma.
Probé poniendo #separate por todos lados y sigo con el problema del error de out of rom.
Probé compilar el código para un 18f4550 y va bien. Pero no me quiero quedar sin solucionar ese error.
Se que debería optimizar el código para no hacerlo tan largo pero igual quiero aprender a usar #separate o en su caso alguna opcion para hacer programas bien largos y evitar el error referido.

                      Saludos.
                              Jukinch



"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #1 en: 07 de Febrero de 2010, 10:06:01 »
Me parece que por más que uses separate si la función es más larga que una pagina no podrás solucionarlo. Tienes que organizar mejor el main en funciones.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #2 en: 07 de Febrero de 2010, 11:18:03 »
Suky:
        gracias por tu ayuda y pronta respuesta.
        Coincido con vos, creo que no me va a quedar otra que reestructurar todo el código.
        Uso muchas funciones para hacer cosas parecidas.
        Estoy configurando un rtc. con todos sus valores de día, mes, año, hora, minutos, y segundos..., usando dos botones, para subir y bajar los valores, y otro botón para confirmar la selección. Todo ello usando diferentes funciones. De allí el largo del código.
        Deberé estudiar la forma de usar una función del tipo menu_select(parámetro) para que me devuelva los valores que quiero establecer  en el rtc.
        Estoy desde el mes de agosto de 2009 con este proyecto, en el cual fui aprendiendo a usar el lcd, el rtc, etc, etc, y no me va a torcer el brazo.
        En cuanto tenga el código nuevamente en marcha lo posteo, por si a alguien le sucede lo mismo.
        Saludos desde San Nicolás, Argentina.
                         
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #3 en: 07 de Febrero de 2010, 12:40:54 »
Es que en vez de utilizar etiquetas y goto deberías usar funciones y llamadas a funciones. Tal y como lo tienes montado resulta muy fácil de separar en funciones.
¿Este programa estaba escrito en Basic y lo has traducido al C?

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #4 en: 07 de Febrero de 2010, 16:20:16 »
Nocturno:
            No lo migré del basic. Lo hice en c. El tema es que es mi primer proyecto grande. Y buscando como hacer un menú vi un ejemplo en c que lo hacían así con el label y goto.
             ¿Normalmente como hacés los menúes? ¿con un while y ahí dentro vas eligiendo las opciones?
            Te cuento que el proyecto que estoy haciendo es un poco ambicioso para ser principiante. Pero investigando y estudiando espero poder terminarlo. Fui aprendiendo de todo en esta aventura. Aprendí a ver los rebotes de los botones, a usar el lcd, luego el rtc. Aprendí a hacer los pcb con el método de la plancha. Después tendré que ver el protocolo i2c para comunicar con otros pics para sincronizarlos. etc. En verdad no creía que llegaría a avanzar tanto.
            El proyecto es para una competencia de radioaficionados.  (Fox hunting en inglés).
            Son 5 pics que controlan 5 transmisores que se esconden por toda la ciudad y luego salen los competidores a buscarlos mediante triangulación con antenas direccionales.
             Transmiten de manera sincronizada la siguiente secuencia, que se repite cada 5 minutos.
Emite durante el primer minuto el transmisor 1 en código morse una palabra que lo identifica.
MOE que equivale a -- --- .
Emite durante el segundo minuto el transmisor 2 en código morse una palabra que lo identifica.
MOI que equivale a -- --- ..
emite el transmisor 3 en código morse una palabra que lo identifica. MOSque equivale a -- --- ...
emite el transmisor 4 en código morse una palabra que lo identifica. MOHque equivale a -- --- ....
emite el transmisor 5 en código morse una palabra que lo identifica. MO5que equivale a -- --- .....
Esa secuencia se inicia en una fecha y hora dada y para también en un tiempo determinado.
Ahora estaba agregando al programa la posibilidad de usar fechas. Ya que hasta adonde había llegado a compilar bien sólo funcionaba durante un único día. Y va a estar bueno que los equipos puedan esconderse uno o dos días antes.
probé compilarlo para un pic más grande y lo compiló bien.
Por eso quería usar lo de #separate para ver si se solucionaba el error de out of rom.
            Arranqué mal con el planteo del programa al usar muchas rutinas que se repiten y la forma en la que quedó desarrollado el menú.
            Tendré que reestructurarlo todo desde cero. Y pasarlo a funciones como dices.             
             
                     Un abrazo.
                               jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #5 en: 07 de Febrero de 2010, 18:25:07 »
Los menúes por lo general los trabajo en una única función que recibe como parámetro el menú a mostrar. Entonces para controlar el menú utilizo una variable (o 2 si el menú tiene muchos submenues), que dependiendo del valor se puede saber cual es. Dentro de la función con un switch solucionas el problema.

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #6 en: 07 de Febrero de 2010, 18:32:19 »
Efectivamente, como te dice Suky es lo más lógico.

Te dejo un par de trozos de un código que tengo para un proyecto en el que uso menús.

En esta parte imprimo la opción que corresponda:

Código: C
  1. switch (Estado) {
  2.       case eDIFARRANQUE:  
  3.          lcd_gotoxy(1,1);
  4.          printf(LCD_PUTC,"Dif. Arranque   ");
  5.          ImprimeParametro(0);
  6.          break;
  7.       case eDIF_PARO:  
  8.          lcd_gotoxy(1,1);
  9.          printf(LCD_PUTC,"Dif. Paro       ");  
  10.          ImprimeParametro(1);
  11.          break;  
  12.       case eTMAX_DEPOSITO:  
  13.          lcd_gotoxy(1,1);
  14.          printf(LCD_PUTC,"T. Max. Deposito");  
  15.          ImprimeParametro(2);
  16.          break;
  17.       case eTMAX_PANEL:  
  18.          lcd_gotoxy(1,1);
  19.          printf(LCD_PUTC,"T. Max. Panel   ");  
  20.          ImprimeParametro(3);        
  21.          break;  
  22.     }

Y en esta otra actúo según la tecla pulsada:

Código: C
  1. switch (Estado) {
  2.       case eDIFARRANQUE:
  3.          switch (vTecla) {
  4.             case tMENU:
  5.                break;
  6.             case tOK:
  7.                EditaParametro(0);
  8.                break;
  9.             case tABAJO:
  10.                Estado = eDIF_PARO;
  11.                break;
  12.             case tARRIBA:  
  13.                Estado = ePARAM_SALIR;
  14.                break;
  15.          };
  16.          break;
  17.       case eDIF_PARO:
  18.          switch (vTecla) {
  19.             case tMENU:
  20.                break;
  21.             case tOK:
  22.                EditaParametro(1);
  23.                break;
  24.             case tABAJO:
  25.                Estado = eTMAX_DEPOSITO;
  26.                break;
  27.             case tARRIBA:  
  28.                Estado = eDIFARRANQUE;
  29.                break;
  30.          };
  31.          break;
  32. }

Como puedes ver, utilizando una variable (Estado) y esa función te facilita tanto la impresión como la navegación por los menús.

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #7 en: 07 de Febrero de 2010, 19:10:45 »
Una vez más, gracias por su ayuda. Nocturno y Suky.
Esta noche reformulo el código y les comento.           
                     Un sincero saludo.
                             Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #8 en: 10 de Junio de 2010, 12:59:54 »
[SOLUCIONADO]

Por si a alguien le sirve. Les cuento que separé todo el código en funciones como recomendaron Suky y Nocturno, y de esta manera se liberó la memoria de programa.
Ahora estoy migrando el código a c18 así que cuando esté listo lo posteo.
            Jukinch.
« Última modificación: 10 de Junio de 2010, 13:04:51 por jukinch »
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #9 en: 10 de Junio de 2010, 14:35:38 »
[SOLUCIONADO]

Por si a alguien le sirve. Les cuento que separé todo el código en funciones como recomendaron Suky y Nocturno, y de esta manera se liberó la memoria de programa.
Ahora estoy migrando el código a c18 así que cuando esté listo lo posteo.
            Jukinch.

alguna vez tuve este problema aunque yo si trabajaba con métodos y aplicaba todas las recomendaciones de los maestros suky y Nocturno, y cuando ocurre esto solo queda comprar un PIC con mas ROM.

En aquella ocasión me toco pasar de un 18f4550 a un 18f4620, ya que tenia que manejar un lcd 128x64 y un menú demasiado largo, ademas tenia que leer ibutton, código de barra, banda magnética, consultar con una base de datos a un servidor (por rs232) los productos de la canastillas, manejar la impresión de facturas y manejar la entrada y salida del personal, fue todo un proyecto, lastima que cuando lo terminamos (solo faltaba la carcasa) el negocio se vino abajo y se perdió esa investigación.

Son aquellas cosas que solo te pasan 1 vez! la próxima es con anticipo...  :D :D

que mas da, toca reírse de la vida!!

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Out of ROM, A segment or the program is too large [SOLUCIONADO]
« Respuesta #10 en: 10 de Junio de 2010, 18:11:57 »
Memoria rom insuficiente - Out of ROM, A segment or the program is too large

fidodido18:
             Que lástima que no se te dió con tan lindo proyecto. Al menos te quedó la experiencia y el conocimiento de armonizar todo lo que investigaste.
          Con respecto al error, si mal no entendí, el problema radica en que en la familia de los pic16, como el que estoy usando yo, la memoria está segmentada y por ello si una función se pasa en tamaño de "un segmento" genera ese problema.
          En mi caso como estaba trabajando todo "dentro" de main y tenía tantas pero tantas cosas allí dentro llegó un punto que me daba ese error "a segment or the program is too large" , porque a la función main no la podía separar de un segmento a otro. Pese a que había memoria libre en el pic, pero en otro segmento de memoria. Se entiende?
          Luego cuando separé el código larguísimo en código seccionado en funciones, logré achicar el programa principal y puedo seguir trabajando, manteniendo todo el código que estaba usando, pero disgregado.
          El problema de usar label: y goto label:  como lo hacía yo en proton basic, es que te queda todo dentro de main, y así para el pic se genera una única función. (además no es recomendable el uso de goto y los label porque altera la programación del tipo top-down, y se hace dificil seguir el código para el programador).-
               Un cordial saludo.
                             Jukinch
         
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #11 en: 10 de Junio de 2010, 23:12:30 »
Si has conservado el archivo prueba agregar esta linea debajo del llamado a la libreria del PIC:

Código: C
  1. #device *=16                    // This allows auto variables over location 0xFF

En compiladores anteriores mejoraba el uso de memoria.

Yo recien compile tu programa y usando o sin usar esa linea me da 74% Rom y 34% RAM usadas.
Es bastante nuevo, puede ser eso... :lol: :lol:

Y ademas compilo perfecto sin dar mensajes Out of Rom... :mrgreen:

Por supuesto que hacer lo que te aconsejaron es lo mejor.

Si vas a programar en C, deberas pensar en C... :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #12 en: 11 de Junio de 2010, 00:16:49 »
Mglsoft:
         Gracias por el dato. Lamentablemente no lo conservo.  :5]
         Subí a este link http://www.4shared.com/file/OncW6fcA/zorra_060110.html el proyecto como quedó ahora, usando un switch y funciones para el menú en pantalla. Por si alguien quiere ver como evolucionó el software de labels y gotos a funciones. De a poquito voy empezando a pensar en C. Como dijo Paky para que la hago fácil si la puedo complicar, no? JAJAJA  :mrgreen:
      El programa principal es zorra.c y este incluye a fechas.c y libreria_rtc.c
         Todavía estoy a media carrera ya que tengo que optimizar las funciones, porque igual repito mucho código.
          Tengo pensado hacer una única función general para establecer con las teclas los valores de la hora, fecha etc. etc.
         Pasándole como parámetro el valor mínimo y máximo permitido y con eso lo reduzco casi por completo.
         Como pude seguir trabajando luego de solucionar el problema de la memoria, seguí avanzando así como está para lograr que funcione el aparato, sinó no terminaba más. Ya lo optimizaré.
        Ahora estoy con el desarrollo del hardware en si. No sabía los problemas de las interferencias y las altas frecuencias.
        El pic controla un handdy de vhf y este lo enloquece.
        MarioGuillote me explicó las bondades de los planos de tierra (Uh!! casi digo masa!!!) por todo el pcb y
con eso espero rehacer la placa y que ya termine el proyecto de una vez. :-/
              Cuando esté al 99% lo posteo por si alguien se interesa.                                      
                           Un abrazo.
                                   Jukinch
« Última modificación: 11 de Junio de 2010, 00:19:32 por jukinch »
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #13 en: 13 de Junio de 2010, 12:19:21 »
Ademas de lo que te aconseja el Maestro Mario, seguramente algo que puede ayudarte es meter tu placa en una peque;a caja metalica, haciendo una especie de jaula de faraday.
Es una de las mejores formas de controlar la EMI en equipos no tan preparados desde el disenio... :mrgreen: :mrgreen:

La radio va fuera de esa caja ehh!!!! :D :D :D
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #14 en: 13 de Junio de 2010, 19:50:08 »
Gracias Mglsoft por la info. ;-) Guillote también me habló de ello y ya casi lo olvidaba. JAJA
Por si a alguien le pueda interesar paso un pdf que me sirvió mucho.
http://www.analog.com/static/imported-files/tech_docs/Hardware_Design_Techniques_Section9.pdf
      Voy a abrir un hilo con todo el desarrollo de la zorra así no queda desprolijo el foro.
               Un abrazo.
                         Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes


 

anything