Editando
PROGMEM
(sección)
Ir a la navegación
Ir a la búsqueda
Advertencia:
no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición. Si
inicias sesión
o
creas una cuenta
, tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.
Comprobación antispam. ¡
No
rellenes esto!
= Punteros a variables en flash = == PGM_P == *PGM_P define un tipo puntero que apunta a variables de la memoria flash de 8bits *Su definición en pgmspace.h de avr-gcc es #define PGM_P const PROGMEM char * === Ejemplo === <pre> #include "avr_compiler.h" PROGMEM const unsigned int a[] = {1,2,3,4,5}; PROGMEM const unsigned char b[] = {23,42,54,2}; int main(void) { PGM_P p; unsigned char b1; unsigned int a1; p = (PGM_P)b; //Se esta haciendo un casting para que no haya problemas con el compilador c = pgm_read_byte(p + 1); //En el ejemplo de arriba p apunta al primer elemento de b. Con pgm_read_byte(p+1) leemos b[1] //Esto es lo mismo que hago en la sección Ejemplos de Funciones de Lectura, solo que en este caso no le paso &p+1, porque p ya contiene dircciones p = (PGM_P)a; //Aqui vuelvo ha hacer lo mismo en la primera linea que en el array b n = pgm_read_word((PROGMEM const unsigned int *)p + 3); //Como pgm_read_word() necesita que le pasen una dirección de variable de 2bytes (word) se hace la conversión de p. //También se puede poner (PROGMEM int *) porque lo que cuenta es que se convierta a un tipo de 2 bytes } </pre> *En el ejemplo anterior estamos utilizando el puntero PGM_P para acceder a varaibles de 2 bytes. Para ello estamos utilizando conversiones y realmente lo mejor seria utilizar punteros neutros, PGM_P void == PGM_P void == *Son punteros neutros *Los punteros PGM_P void se definen: #define PGM_VOID_P const void PROGMEM * === Ejemplo === <pre> #include "avr_compiler.h" PROGMEM const unsigned int a[] = {1,2,3,4,5}; PROGMEM const unsigned char b[] = {23,42,54,2}; int main(void) { PGM_VOID_P p; unsigned char c; unsigned int n; p = (PGM_VOID_P)b; //Realmente no haria falta convertir el array b a PGM_VOID_P, pero es mejor hacer las cosas bien hechas c = pgm_read_byte((PROGMEM char*)p + 1); p = (PGM_VOID_P)a; //Lo mismo aquí n = pgm_read_word((PROGMEM int*)p + 3); } </pre> *Aqui lo que hacemos es convertir la variable ''a'' y ''b'' a puntero neutro, asi podemos asignar a ''p'' la dirección de memoria de estas variables. *Luego para poder acceder a la variable que apunta ''p'' tenemos que convertirla al tipo que la función necesita. En el primer caso a una variable de 8 bits(char) y en el segundo caso a una variable de 2 bytes(int) <pre> PROGMEM const unsigned int a = 5; int main(void){ PGM_VOID_P p; unsigned int i; p = (PGM_VOID_P)&a; i = pgm_read_word((PROGMEM int *)p); } </pre> *Si nos fijamos para asignar al puntero ''p'' la dirección de ''a'' lo hemos hecho de forma purista, convirtiendo antes la variable ''a'' al tipo que tiene ''p''. Esto realmente no es necesario en Arduino IDE, pero es mejor hacerlo bien para que quede todo claro *Luego hacemos casting al puntero ''p'' porque la funcion pgm_read_word() necesita recibir una dirección de 2 bytes (tipo int) y ''p'' es de tipo PGM_VOID_P
Resumen:
Ten en cuenta que todas las contribuciones a Proyectos se consideran publicadas bajo la Creative Commons Atribución-CompartirIgual (véase
Proyectos:Derechos de autor
para más información). Si no deseas que las modifiquen sin limitaciones y las distribuyan libremente, no las publiques aquí.
Al mismo tiempo, asumimos que eres el autor de lo que escribiste, o lo copiaste de una fuente en el dominio público o con licencia libre.
¡No uses textos con copyright sin permiso!
Cancelar
Ayuda de edición
(se abre en una ventana nueva)
Menú de navegación
Herramientas personales
No has accedido
Discusión
Contribuciones
Crear una cuenta
Acceder
Espacios de nombres
Página
Discusión
español
Vistas
Leer
Editar
Ver historial
Más
Buscar
Navegación
Página principal
Cambios recientes
Página aleatoria
Ayuda sobre MediaWiki
Páginas especiales
Herramientas
Lo que enlaza aquí
Cambios relacionados
Información de la página