Básicamente lo que hace es leer 4 posiciones contiguas en la memoria eeprom serial o interna, etc y construir una variable única de 32 bits con esos 4 valores. ( SERIAL_SIZE). Digo 4 valores / 32 bits pero puede ser un valor de 16 bits creados a partir de dos posiciónes de eeprom. Para no liarte mucho asumiré que se trata de un valor de 32’bits y que SERIAL_SIZE vale 4 por consiguiente.
La forma de hacerlo es mediante puntero:
- Crea primero la variable de 32 bits que albergará el valor final. (ret)
- Luego crea una variable de tipo puntero de 8 bits (int8* pret) la cual es inicializada con la dirección de memoria (&ret) del primer byte de la variable ret
-Luego declara un entero (i) clásicamente usado para la iteracción for();
Y un entero (dir) para direccionar la memoria eeprom. (Leerá 4 posiciones contiguas para construir la variable de 32 bits) Esta variable no es de tipo puntero pero a efecto práctico actuará con la eeprom como si lo fuese ya que apuntará a la dirección de memoria de la eeprom donde está el valor que quiero leer. Hace lo mismo, con la diferencia de que la variable puntero pret es necesaria para poder apuntar a la dirección ram interna de la cpu que queramos.
Luego la interacción lo que hace es:
- Carga en la dirección de memoria donde apunta pret ( que como vimos arriba, apunta a la dirección de memoria del primer byte de ret) el valor leído en la posición cero de la eeprom. (dir = 0)
- Incrementa la dirección a la siguiente de la eeprom (dir++) para la siguiente iteracción.
- Incrementa el apuntador (pret++). Ahora pret apunta al siguiente byte de la variable ret.
De nuevo se lee la eeprom (siguiente valor que había sido incrementado antes (dir++) )
Y se asigna su contenido a donde está apuntando pret que es el segundo byte de ret.
Se repite la operación : SERIAL_SIZE veces, donde SERIAL_SIZE estará cargado con el número de bytes de la variable a construir como ya vimos arriba. 4 en este caso .
Finalmente retorna el valor de 32 bits construido a partir de las 4 posiciones eeprom leídas.
Explicado linea a línea sobre el código sería:
Int32 ret; //variable de 32 bits. (4 bytes)
unsigned int8* pret = &ret; // puntero para apuntar a la dirección de memoria de cada uno de los 4 bytes de la variable ret.
int i,Dir; // Variables de control iteracción y dirección de la eeprom .
Dir=0; // inicializacion del director de la eeprom a la dirección cero de la misma.
for(i=0;i<SERIAL_SIZE;i++) //Se repetirá SERIAL_SIZE veces la siguiente línea:
*pret++ = read_eeprom(Dir++); //lee la direccion correspondiente de la eeprom y carga su valor en la dirección de memoria a donde apunta pret. luego incrementa en una unidad tanto dir como pret, (dir++, pret++). Y ejecuta la siguiente repetición de la iteracción
return ret; // concluida la iteracción devuelve el valor de 32 bits obtenidos a partir de 4 posiciones eeprom de 8 bits.