Recopilando valores por cierto tiempo y almacenándolos una vez

0

Estoy tratando de guardar algunos valores en la memoria, tengo una matriz con 6 valores como se muestra a continuación

  

Datos [6] = {5045.567,4567.987,4.5,190.5, 70.5,500};

Tengo que guardar este tipo de datos en la memoria flash. Tengo memoria que puede almacenar solo 16 bits en cada dirección y puedo escribir 16 bits. Necesito escribir dos veces para escribir un valor flotante. Estoy multiplicando 5045.567 por 1000 para hacer un entero largo 5047567 de modo que pueda guardar el valor flotante (dos direcciones para escribir el valor flotante). Mis datos se verán así.

  

long int Data [6] = {5047567, 4567987, 4500 190500,700500,500}

¿Existe algún método mejor para guardar el valor flotante en lugar de multiplicarse por 1000 para que sea un entero tan largo?

Para guardar este tipo de datos, necesito dos direcciones en algún momento y una dirección es suficiente por algún tiempo. Tendré este tipo de datos cada 10 segundos, no puedo escribir en la memoria cada 10 segundos debido a las funciones de ahorro de energía.

  

Estoy tratando de recopilar valores cada menta y tratar de escribir en la memoria a la vez cada menta.

Para esto he inicializado una matriz con tamaño [36] y guardando todos los valores después de una menta. ¿Hay alguna otra manera mejor de recolectar valores por cierto tiempo y guardar una vez?

Estoy recolectando los 36 valores en una matriz. por ejemplo, los dos primeros valores necesitan dos direcciones en la memoria, luego los cuatro valores siguientes solo necesitan una dirección en la memoria. ¿Cómo puedo incrementar la dirección en la memoria para ciertos valores? o ¿es mejor dividir los valores largos en dos enteros antes de almacenarlos en una matriz?

    
pregunta verendra

2 respuestas

3

Te estás adelantando.

Primero especifique qué se necesita almacenar exactamente con qué precisión y rango. ¿Realmente necesita ser un punto flotante? Es muy probable que no necesite la resolución ni el rango dinámico, probablemente tampoco.

Por ejemplo, si estas son mediciones de voltaje de 0-10 V medidas con un A / D de 12 bits, entonces no tiene más de 12 bits de información real. En este ejemplo, podría almacenar las lecturas en bruto A / D directamente, o usar un formato común como milivoltios enteros.

Añadido

Ahora dice que estos valores se derivan de las lecturas A / D de 24 bits. Si el tamaño de almacenamiento es importante, puede usar una representación de 24 bits (¿Son todos los 24 bits realmente significativos? Probablemente no) y almacenar dos de ellos cada 3 palabras. Para mayor comodidad, pero 1/3 más de uso de memoria, use dos palabras completas para cada lectura. Elegiría una unidad conveniente y una compensación de cero y almacenaría las lecturas como enteros de 32 bits. El punto flotante es un poco tonto en este caso, pero también son solo 32 bits.

De cualquier manera, tiene 32 bits, o dos palabras, para escribir en la memoria no volátil para cada lectura. En cualquier caso, no veo un problema aquí. No importa si escribe las dos palabras en orden alto-bajo o bajo-alto siempre que sea constante y el lector siga el mismo esquema. De nuevo, ¿cuál es exactamente el problema?

    
respondido por el Olin Lathrop
0

Suponiendo que float es de 32 bits y int es de 16 bits, entonces puede guardar directamente el contenido de la variable float en la memoria como en el siguiente código.

int *address;
int value1, value2;
float value=3.4321;
address=(int *) &value;
value1=*address;
value2=*(address+1);

Eugene Sh. me advirtió que el reparto de (float *) a (int *) rompe el estándar C, y algunos compiladores podrían no aceptarlo. Por lo tanto, publico una alternativa, asumiendo que char es de 8 bits, int es de 16 bits y flotante es de 32 bits:

char *address;
int value1, value2;
float value=3.4221;
address=(char *) &value;
value1=(int) *adress+*(address+1)*256;
value2=(int) *(adress+2)+*(address+3)*256;

En realidad, creo que el código original también debe compilarse con cualquier compilador con este pequeño cambio:

int *address;
int value1, value2;
float value=3.4321;
address=(int *) (char *) &value;
value1=*address;
value2=*(address+1);
    
respondido por el Roger C.

Lea otras preguntas en las etiquetas