Asignar más espacio de memoria en el controlador

2

Chip: PIC18f26j50
Compilador: C18

Mi objetivo es almacenar valores en una tabla en la memoria RAM utilizando 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 tiene el propósito de monitorear los datos circundantes de la atmósfera. Y luego volcar estos datos en EEPROM.

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

  

Error: la sección '.udata_main.o' no puede ajustarse a la sección. Sección   '.udata_main.o' length = 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 el MPLAB C18 de Microchip .

Pero esto muestra cómo almacenar cada variable. ¿Cómo puedo almacenar struct s 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 más grandes para que solo necesite 3000 bytes en la preparación de la tabla?

Preferiría usar float pero puedo conformarme con usar int / char .

Espero que esto aclare las cosas.

    
pregunta Rookie91

2 respuestas

4

EDITAR: hay dos problemas: la matriz de la 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 el error dice que requiere 5100 bytes.

O necesitas un chip nuevo con más RAM, o debes reducir el tamaño de tu mesa. Sugiero que almacene 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. P.ej. 3.157 se convierte en 3157.

¿Por qué necesitas 300 valores? Quizás pueda almacenar en EEPROM más a menudo y reducir este número. Si solo tiene un gran número de promedios, considere agregar una variable acumuladora en su lugar.

Por ejemplo,

TempAccum += temp;

Luego 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 las variables. En lugar de una estructura, use variables individuales:

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

Para acceder a las variables (de acuerdo con el enlace) necesita usar punteros. por ejemplo

float *tempPtr;
tempPtr = temp;
tempPtr[100] = some_value;
    
respondido por el geometrikal
2

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

Vamos a pensar 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 encajarlos todos en 1 byte. Pero esto puede hacerlo más complejo.

Si aplicas la misma consideración en otros dos campos al pensar en sus posibles rangos de valores, puedes resolver tu problema, creo.

--- FORMA EFICIENTE DE USAR LA MEMORIA --- (Esto se agregará más adelante)

Su matriz es demasiado grande, pero la está utilizando para almacenar datos solamente. No hay cálculo hasta que escriba su contenido en EEPROM. Si es así, haz 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 entry se llene con 50 elementos, calcule el valor de compensación para EEPROM.

int offset = 50 * counter;

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

Dado que las EEPROM tienen un ciclo de escritura limitado, al aumentar esos 50 siempre que se ajuste a la memoria, puede disminuir el número de operaciones de escritura.

    
respondido por el tcak

Lea otras preguntas en las etiquetas