Diferencia entre revisiones de «PROGMEM»
Ir a la navegación
Ir a la búsqueda
| Línea 23: | Línea 23: | ||
{|class="wikitable" | {|class="wikitable" | ||
|+avr/pgmspace.h de AVR-GCC | |||
!escritura normal | !escritura normal | ||
!escritura abrebiada | !escritura abrebiada | ||
|- | |- | ||
| | |char PROGMEM | ||
|prog_char | |prog_char | ||
| | |||
|- | |- | ||
|unsigned char PROGMEM | |unsigned char PROGMEM | ||
|prog_uchar | |prog_uchar | ||
| | |||
|- | |- | ||
|int8_t PROGMEM | |int8_t PROGMEM | ||
|prog_int8_t | |prog_int8_t | ||
|signed char | |||
|- | |- | ||
|uint8_t PROGMEM | |uint8_t PROGMEM | ||
|prog_uint8_t | |prog_uint8_t | ||
|unsigned char | |||
|- | |- | ||
|int16_t PROGMEM | |int16_t PROGMEM | ||
|prog_int16_t | |prog_int16_t | ||
|signed int | |||
|- | |- | ||
|uint16_t PROGMEM | |uint16_t PROGMEM | ||
|prog_uint16_t | |prog_uint16_t | ||
|unsigned int | |||
|- | |- | ||
|int32_t PROGMEM | |int32_t PROGMEM | ||
|prog_int32_t | |prog_int32_t | ||
|signed long int | |||
|- | |- | ||
|uint32_t PROGMEM | |uint32_t PROGMEM | ||
|prog_uint32_t | |prog_uint32_t | ||
|unsigned long int | |||
|- | |- | ||
|int64_t PROGMEM | |int64_t PROGMEM | ||
|prog_int64_t | |prog_int64_t | ||
|signed long long int | |||
|- | |- | ||
|uint64_t PROGMEM | |uint64_t PROGMEM | ||
|prog_uint64_t | |prog_uint64_t | ||
|unsigned long long int | |||
|} | |} | ||
Revisión del 15:13 20 mar 2013
PROGMEM hace que una variable constante a la que se le aplica resida en la memoria flash en vez de la RAM. Asi podemos ahorrar RAM para las demás variables.
AVR
Declaración de variables
Para alojar una variable constante en la memoria Flash se hace asi:
PROGMEM const tipoVariable nombreVariable = valoresIniciales;
Por ejemplo:
PROGMEM const int a = 5;
PROGMEM const int a[] = {0,3,4,2};
También puede hacerse asi:
const int a[] PROGMEM = {0,4,3,2};
O de un modo más abreviado:
const prog_uint16_t a[] = {0,4,3,2);//Esto equivale al ejemplo de encima
-----
'----> se mantiene const
Esta tabla muestra las equivalencias:
| escritura normal | escritura abrebiada | |
|---|---|---|
| char PROGMEM | prog_char | |
| unsigned char PROGMEM | prog_uchar | |
| int8_t PROGMEM | prog_int8_t | signed char |
| uint8_t PROGMEM | prog_uint8_t | unsigned char |
| int16_t PROGMEM | prog_int16_t | signed int |
| uint16_t PROGMEM | prog_uint16_t | unsigned int |
| int32_t PROGMEM | prog_int32_t | signed long int |
| uint32_t PROGMEM | prog_uint32_t | unsigned long int |
| int64_t PROGMEM | prog_int64_t | signed long long int |
| uint64_t PROGMEM | prog_uint64_t | unsigned long long int |
Funciones de lectura
- pgm_read_byte()
- Lee un byte de la memoria Flash
- pgm_read_word()
- Lee 2 bytes de la memoria Flash
- pgm_read_dword()
- Lee 4 bytes de la memoria Flash
- pgm_read_float()
- Lee un número de coma flotante de 4 bytes
A cada una de estas funciones se le pasa una dirección de 16 bits que indican donde reside el elemento de la variable
Arduino
Declaración de variables
La declaración que explico arriba, que es para los avr, no funciona en el arduino ide. No he encontrado una explicación, de momento, pero pongo aqui como declarar variables PROGMEM que si que me ha funcionado en el arduino ide
static const int a[] PROGMEM = {1,2,3,4};
static const int b PROGMEM = 1;
static const char c PROGMEM = 'a';
El método abreviado es el mismo para Arduino IDE
static const prog_uint16_t a[] = {1,2,3,4};
static const prog_uint16_t b = 1;
static const pog_int8_t c = 'a';