Difference between revisions of "Putting data in flash on the Arduino"
SteveBaker (Talk | contribs) |
SteveBaker (Talk | contribs) (→Accessing the data) |
||
Line 15: | Line 15: | ||
But to access the data, you have to use a special set of functions: | But to access the data, you have to use a special set of functions: | ||
+ | #include <avr/pgmspace.h> | ||
+ | ... | ||
pgm_read_byte ( & myArray [ 10 ] ) ; | pgm_read_byte ( & myArray [ 10 ] ) ; | ||
...there is also 'pgm_read_word' for 16 bit data and 'pgm_read_dword' for 32 bits. This only works for 16 bit addresses - but until we have Arduino's with more than 64kb of flash, this is not a problem. For machines with more, there is pgm_read_xxx_far and pgm_read_xxx_near for 32 and 16 bit addresses. You really need to cast the results of the pgm_read_* routines because they are implemented in machine-code and the return type is kinda ill-defined! | ...there is also 'pgm_read_word' for 16 bit data and 'pgm_read_dword' for 32 bits. This only works for 16 bit addresses - but until we have Arduino's with more than 64kb of flash, this is not a problem. For machines with more, there is pgm_read_xxx_far and pgm_read_xxx_near for 32 and 16 bit addresses. You really need to cast the results of the pgm_read_* routines because they are implemented in machine-code and the return type is kinda ill-defined! | ||
+ | |||
+ | == String functions == | ||
+ | |||
+ | Since it's very common to want to place string constants in program memory - there are versions of all of the standard string library functions that work on program-space data. These have an '_P' suffix (hence: strcpy_P, memcmp_P, etc). | ||
{{Arduino}} | {{Arduino}} |
Latest revision as of 18:50, 1 January 2009
Since main RAM memory is very limited on the Arduino, you need to put const data into flash memory wherever possible.
There is a necessary trick to doing this:
Declaring the data
The 'PROGMEM' macro places an object into program memory (ie flash):
#include <avr/pgmspace.h> ... const char myArray [] PROGMEM = { ... } ;
Accessing the data
But to access the data, you have to use a special set of functions:
#include <avr/pgmspace.h> ... pgm_read_byte ( & myArray [ 10 ] ) ;
...there is also 'pgm_read_word' for 16 bit data and 'pgm_read_dword' for 32 bits. This only works for 16 bit addresses - but until we have Arduino's with more than 64kb of flash, this is not a problem. For machines with more, there is pgm_read_xxx_far and pgm_read_xxx_near for 32 and 16 bit addresses. You really need to cast the results of the pgm_read_* routines because they are implemented in machine-code and the return type is kinda ill-defined!
String functions
Since it's very common to want to place string constants in program memory - there are versions of all of the standard string library functions that work on program-space data. These have an '_P' suffix (hence: strcpy_P, memcmp_P, etc).
Wikiid Pages relating to Arduino (edit) |
Arduino |
Command line Arduino |
Startup code for Arduino |
Low level functions for Arduino |
Putting data in flash on the Arduino |
External resources for Arduino |
Board schematics for Arduino |
Misc notes: Circuit notes, Music notes, Stepper motors |