Lesson 17 / 25
Flash, SRAM, EEPROM, PROGMEM and F()
Three memories, three jobs.
Where data lives
The ATmega328P on the Uno R3 has 32 KB flash (program code and constants; part is used by the bootloader), 2 KB SRAM (variables, the stack and the heap) and 1 KB EEPROM (non-volatile data that survives power-off, such as settings). SRAM is the scarce resource: string literals are copied from flash into SRAM at start-up on AVR, so many Serial.print("long text") calls quietly eat RAM. The F() macro keeps a literal in flash for print functions, and PROGMEM stores larger constant tables in flash, read back with functions like pgm_read_byte. EEPROM cells have a limited number of write cycles (the datasheet specifies around 100,000), so write only when a value changes. Avoid heavy String and malloc use on tiny-RAM boards, because heap fragmentation can cause hard-to-find crashes. These details are AVR-specific; other chips handle constants differently.
Saving RAM and storing settings
Arduino C++ on AVR (Uno R3).
#include <EEPROM.h>
#include <avr/pgmspace.h>
const uint8_t gammaTable[8] PROGMEM = {0, 2, 8, 20, 40, 70, 120, 255};
const int ADDR_BRIGHTNESS = 0;
void setup() {
Serial.begin(115200);
Serial.println(F("This text stays in flash, not SRAM"));
uint8_t level = pgm_read_byte(&gammaTable[3]); // read from flash
Serial.println(level);
uint8_t saved = EEPROM.read(ADDR_BRIGHTNESS);
EEPROM.update(ADDR_BRIGHTNESS, 128); // writes only if the value differs
Serial.println(saved);
}
void loop() {}Bookshelf, desk and notebook
Flash is a bookshelf of reference books you rarely change, SRAM is a small desk you work on, and EEPROM is a notebook that keeps notes after you leave but wears out if you rewrite the same page too often.
Quick check: What does Serial.println(F("Hello")) achieve on an AVR board?
- Stores the text in EEPROM permanently
- Prints the text faster over USB
- Keeps the string literal in flash instead of copying it into SRAM
- Formats the text as floating point
Answer
Keeps the string literal in flash instead of copying it into SRAM — F() saves scarce SRAM on AVR boards.