Arduino - Progmem
Arduino - Progmem
Logged in as dattarider
|
Profile
|
Help
|
Sign out
search
Buy
Dow nload
Getting Started
Learning
Reference
Products
FAQ
Contact Us
PROGMEM
Store data in flash (program) memory instead of SRAM. There's a description of the various types of memory available on
an Arduino board.
The PROGMEM keyword is a variable modifier, it should be used only with the datatypes defined in pgmspace.h. It tells
the compiler "put this information into flash memory", instead of into SRAM, where it would normally go.
PROGMEM is part of the pgmspace.h library. So you first need to include the library at the top your sketch, like this:
#include <avr/pgmspace.h>
S y ntax
dataType variableName[] PROGMEM = {dataInt0, dataInt1, dataInt3...};
program memory dataType - any program memory variable type (see below)
variableName - the name for your array of data
Note that because PROGMEM is a variable modifier, there is no hard and fast rule about where it should go, so the
Arduino compiler accepts all of the definitions below, which are also synonymous. However experiments have indicated
that, in various versions of Arduino (having to do with GCC version), PROGMEM may work in one location and not in
another. T he "string table" example below has been tested to work with Arduino 13. Earlier versions of the IDE may work
better if PROGMEM is included after the variable name.
dataType variableName[] PROGMEM = {};
PROGMEM
dataType
While PROGMEM could be used on a single variable, it is really only worth the fuss if you have a larger block of data that
needs to be stored, which is usually easiest in an array, (or another C data structure beyond our present discussion).
Using PROGMEM is also a two-step procedure. After getting the data into Flash memory, it requires special methods
(functions), also defined in the pgmspace.h library, to read the data from program memory back into SRAM, so we can do
something useful with it.
As mentioned above, it is important to use the datatypes outlined in pgmspace.h. Some cryptic bugs are generated by
using ordinary datatypes for program memory calls. Below is a list of variable types to use. Floating point numbers in
program memory do not appear to be supported.
prog_char
prog_uchar
prog_int16_t
prog_uint16_t
prog_int32_t
prog_uint32_t
Example
The following code fragments illustrate how to read and write unsigned chars (bytes) and ints (2 bytes) to PROGMEM.
#include <avr/pgmspace.h>
prog_uint16_t charSet[]
= {"I AM PREDATOR,
// counter variable
char myChar;
// read back a 2-byte int
displayInt = pgm_read_word_near(charSet + k)
// read back a char
myChar =
pgm_read_byte_near(signMessage + k);
Arrays of strings
It is often convenient when working with large amounts of text, such as a project with an LCD display, to setup an array of
strings. Because strings themselves are arrays, this is in actually an example of a two-dimensional array.
These tend to be large structures so putting them into program memory is often desirable. The code below illustrates the
idea.
/*
{
string_0,
string_1,
string_2,
string_3,
string_4,
string_5 };
char buffer[30];
// make sure this is large enough for the largest string it must hold
void setup()
{
Serial.begin(9600);
}
void loop()
{
/* Using the string table in program memory requires the use of special functions to retrieve the data.
The strcpy_P function copies a string from program space to a string in RAM ("buffer").
Make sure your receiving string in RAM
S ee also
Types of memory available on an Arduino board
array
string
Reference Home
Corrections, suggestions, and new documentation should be posted to the Forum.
The text of the Arduino reference is licensed under a Creative Commons Attribution-ShareAlike 3.0 License. Code
samples in the reference are released into the public domain.
Share |
Arduino | Edit Page | Page History | Printable View | All Recent Site Changes