Currently, by using Arduino’s EEPROM library directly:
Well, along with the
EEPROMSettings library, if you want to play nice with other EEPROM-using libraries.
I’m working on feature that will make this more convenient, which I hope will be merge-able sometime next week latest.
32k total, minus the bootloader, which is 4k, so 28k.
2560 bytes of SRAM.
Program is PROGMEM, Data is SRAM.
The architecture is a bit different from x86, where data and code reside in the same area, the AVR stores them separately. Program data (or PROGMEM, or Flash) is executable, persistent, but read-only. Data is read-write, but is neither persistent, nor executable.
So if you have code that you want the MCU to execute, that goes to PROGMEM. If you have data that is read-only, which you don’t want to execute, that can either go to SRAM or PROGMEM. Because there’s more PROGMEM available, larger blocks of read-only data (such as the keymap, or gamma correction tables) are explicitly put into PROGMEM to save SRAM for things that benefit from being read-write-able.
Reading data from PROGMEM is slightly slower than reading from SRAM, and reading from EEPROM is slower than reading from PROGMEM, by the way.
What gets put where, has to be decided manually. When it comes to executable code, you have no option but to use PROGMEM. When it comes to data, you have to decide yourself where to put it, the compiler can’t help you there. So in short, the programmers decide what data goes where.
Hope this helps!