Asignación de más espacio de memoria en el controlador

Chip: PIC18f26j50
Compilador: C18

Mi objetivo es almacenar valores en una tabla en la memoria RAM usando estructuras y alimentar los valores que son bastante grandes.

#include <p18F46J53.h>

 struct table
    { 
      float temp;
      float humidity;
      float pressure;

    }entry[300];

Este es mi código de muestra y tengo que almacenar dichos miembros en la memoria del controlador. Esto es con el propósito de monitorear los datos circundantes de la atmósfera. Y luego volcar estos datos en EEPROM.

Pero tengo problemas para compilar el código, ya que da el siguiente error:

Error: la sección '.udata_main.o' no se ajusta a la sección. Longitud de la sección '.udata_main.o' = 0x000013ec

Intenté buscar en Google para corregir este error de udata y terminé con Cómo crear objetos de más de 256 bytes con MPLAB C18 de Microchip .

Pero esto muestra cómo almacenar cada variable. ¿Cómo puedo almacenar structs en C18? ¿O es imposible?

Intentaré ser más específico. Encontré este método para almacenar datos de más de 255 bytes.

#pragma udata large_udata
unsigned char big_buff1[300];
unsigned char big_buff2[350];
#pragma udata

¿Cómo puedo almacenar estructuras mayores que eso para que solo necesite 3000 bytes para la preparación de la tabla?

Preferiría usar floatpero me puedo conformar con usar int/ char.

Espero que esto aclare las cosas.

Respuestas (2)

EDITAR: hay dos problemas: la matriz de estructura es demasiado grande para la memoria y el compilador no puede crear variables de más de 256 bytes

Problema 1: Estructura demasiado grande para RAM

El chip que está utilizando tiene un tamaño de RAM de 3776 bytes (1) y el error dice que requiere 5100 bytes.

O necesita un nuevo chip con más RAM o debe reducir el tamaño de su mesa. Sugiero almacenar sus valores como enteros sin signo (2 bytes). Si necesita los lugares decimales, simplemente multiplique por 10 a la potencia del número de lugares. Por ejemplo, 3.157 se convierte en 3157.

¿Por qué necesitas 300 valores? Tal vez pueda almacenar en EEPROM con más frecuencia y reducir este número. Si solo tiene un número grande para hacer un promedio, considere agregar una variable acumuladora en su lugar.

P.ej

TempAccum += temp;

Luego, después de 300 lecturas

TempTotal = TempAccum / 300;
TempAccum = 0;

Problema 2: No hay variables mayores de 256 bytes:

Se publicó una solución en el enlace de la pregunta, pero eso fue para variables. En lugar de una estructura, utilice variables individuales:

float temp[300];
float humidity[300];
float pressure[300];

Para acceder a las variables (según el enlace) necesita usar punteros. p.ej

float *tempPtr;
tempPtr = temp;
tempPtr[100] = some_value;
Bueno, tengo problemas para acomodar más de 255 bytes. Vi un ejemplo para almacenar variables. Pero, ¿qué puedo hacer para almacenar más estructuras?
Es posible que desee probar el compilador XC8 más moderno, que parece manejar grandes asignaciones de RAM contiguas mejor que C18. Pero aún tendrá que reducir la cantidad que espera almacenar.
¿Cuál será la cantidad de espacio RAM que puedo usar para manejar el Código correctamente? ¿Puedo suponer que debo usar los 2000 Bytes disponibles de 3.6KB?

Float utiliza memoria de 4 bytes. Si puede incluso la mitad del área utilizada, eso sería mucho mejor para usted. Tal vez se vuelva complejo en la forma de programación, pero resuelve su problema.

Pensemos en la temperatura. En 1 byte, puede almacenar valores entre -128 y 127. Si necesita más detalles, puede usar 1 byte más para el valor después del punto. Entonces, en lugar de flotar, puede definir variables de 2 bytes para la temperatura y se reduce a la mitad. En realidad, al usar el nivel de bits, también puede incluirlos todos en 1 byte. Pero esto puede hacerlo más complejo.

Si aplica la misma consideración para otros dos campos pensando en sus posibles rangos de valores, creo que puede resolver su problema.

--- FORMA EFICIENTE DE UTILIZAR LA MEMORIA --- (Esto se agrega más adelante)

Su matriz es demasiado grande, pero la está utilizando solo para almacenar datos. No hay cálculo hasta que escribe su contenido en EEPROM. Si es así, haga la matriz más pequeña. Digamos 50 artículos.

entry[50]

Totalmente necesitarías 300. Entonces, puedes crear un contador para saber en qué parte de esos 300 estás.

int counter = 1;

Después de que la matriz entryse llene con 50 elementos, calcule el valor de compensación para EEPROM.

int offset = 50 * counter;

Luego escriba el contenido de esa matriz en EEPROM comenzando desde esa dirección de compensación. Finalmente aumente el valor del contador en 1.counter += 1;

Dado que las EEPROM tienen un ciclo de escritura limitado, al aumentar ese 50 siempre que quepa en la memoria, puede disminuir el número de operaciones de escritura.

¿Hay alguna manera en la que aún pueda mantener el tipo de datos y asignar más espacio?: O debería reconsiderar el diseño del software correctamente.
Incluso si es Char, todavía necesitaría una entrada grande '300'. Eso aún lo haría difícil.
¿Por qué 300? Si nos dice, tal vez podamos sugerir formas creativas de evitar esto.
DE ACUERDO. Tengo que almacenar temperaturas, humedad y presión para un día que será 300 veces al día [En total b/n 24 horas]. Puedo reducir el total a un máximo de 100 o algo así. Pero quiero saber cuál es el límite para usar esta estructura de manera que no haya ningún posible conflicto o error.
Quería seguir las estructuras porque es una solución formidable para almacenar mesas. Me gustaría tener sus sugerencias al respecto.
AFAIK, puedes escribir diferentes partes de EEPROM directamente. Entonces, lo que puede hacer es reducir la cantidad de elementos de esa matriz y definir una variable entera para usar como contador. Una vez que se llene esa matriz, calcule el valor de compensación usando ese contador y descargue la matriz en EEPROM comenzando desde esa dirección de compensación y aumente el contador en uno.