Difference between revisions of "Putting data in flash on the Arduino"

From Wikiid
Jump to: navigation, search
(New page: 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 == ...)
 
Line 18: Line 18:
  
 
...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!
 +
 +
{{Arduino}}

Revision as of 19:47, 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:

 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!


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