PROGMEM
You can store data in program memory instead of RAM and to use it, load it directly frm there.
const uint16_t DATA1_Length = 24;
const uint8_t DATA1[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const uint16_t DATA2_Length = 8;
const uint16_t DATA2[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
const uint16_t DATA3_Length = 32;
const uint32_t DATA3[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
void foo1(int baseAddr, int len) {
int addr;
for (int i = 0; i < len; i++) {
addr = baseAddr + sizeof(uint8_t) * i;
uint8_t value = pgm_read_byte(addr);
}
}
void foo2(int baseAddr, int len) {
int addr;
for (int i = 0; i < len; i++) {
addr = baseAddr + sizeof(uint16_t) * i;
uint16_t value = pgm_read_word(addr);
}
}
void foo3(int baseAddr, int len) {
int addr;
for (int i = 0; i < len; i++) {
addr = baseAddr + sizeof(uint32_t) * i;
uint32_t value = pgm_read_double(addr);
}
}
foo1(&DATA1, DATA1_Legnth);
foo2(&DATA2, DATA2_Legnth);
foo3(&DATA3, DATA3_Legnth);