10bits (500 valores)
Como sé que tengo memoria suficiente, (más del 50% destinada solo para este array) hay alguna forma de eliminar el array y crear uno nuevo con un tipo distinto? teniendo en cuenta que la cantidad de memoria es exactamente igual?
union {
uint16_t array_10bits[500];
uint8_t array_1bit[1000];
}
Citar10bits (500 valores)
Eso equivale a un minimo de 5000bits, un char que es de 8 bits no alcanza para representar los 10, lo mas simple en este caso es usar variables de 16 bits.
Ahora 500 valores es bastante, son 1000 bytes (en 16bits) por lo que si, tenes el 50% del valor ocupado de tu RAM de comienzo.
Por un lado tenes eso.
Por otro lado para acceder bit a bit, podes crear un programa, en que reciba el numero de bit a leer (siendo el primero el 0), de alli lo divida por 8, el resultado te va a dar en que byte se encuentra y luego el resto te va a dar la posicion del bit.
Por ejemplo el valor 9, tendrias que al dividirlo por 8 ( rotar 3 veces a la derecha ) es de 1, y el resto es 1, entonces usando un array de 8bits (char) podes obtener el valor de ese bit. Y eso te ocuparia unos 125bytes.
Dejando unicamente 2048 - (1000 + 125 ) = 923 bytes para el micro ( variables/stack/etc )
Pienso que dentro de tenes un 45% destinado a eso.
¿No se podría utilizar una union?Código: [Seleccionar]union {
uint16_t array_10bits[500];
uint8_t array_1bit[1000];
}
Así ambos arrays se ubican en la misma memoria, así que tendrías que utilizar uno, al terminar de utilizarlo poner todo a 0 (¿o no?) y utilizar el otro array.
o conseguir un pic con mayor memoria, que a veces termina siendo más fácil/barato.
Tal vez puedes probar con malloc/calloc/free, para asignar y liberar bloques de memoria en tiempo de ejecución.
Hola, Carl47D la verdad en mi clase de uC no vimos estructuras de datos y no estoy muy familiarizado con C, pero si funciona como dices, se parece mucho a lo que tenía en mente cuando hice la pregunta y me ahorra codear un par de funciones, me voy a documentar un poco a ver cómo funciona esta estructura. Muchas gracias.
Así a simple vista me surge una duda: ¿Qué significan los tipos uint8_t y uint16_t? o es lo mismo que usar un char e int respectivamente?