Skip to main content
Share Your Experience: Take the 2024 Developer Survey
7 votes

How can a function/method determine if a const array passed in is PROGMEM (flash) or not (RAM)?

I am afraid there is no good solution to this problem. One option I do like is to use the __flash qualifier instead of PROGMEM: const uint8_t ram_array[] = { 1, 2, 3, 4 }; __flash const uint8_t ...
Edgar Bonet's user avatar
  • 43.3k
6 votes
Accepted

PROGMEM : pgm_read_float_near() equivalent for double? (Arduino Due)

Arduino Due (ARM Cortex-M3) doesn't need anything like PROGMEM as it has access into the flash memory in the same way as into the RAM. The const qualifier is enough to keep it in program memory only. ...
KIIV's user avatar
  • 4,752
5 votes
Accepted

PROGMEM doesn't cause Sketch size to change

all constant data are part of the sketch. where else should they be? in runtime they are loaded into RAM. PROGMEM directive prevents the loading into RAM.
Juraj's user avatar
  • 18k
4 votes
Accepted

Read nested array item from PROGMEM

The library, as it stands, doesn't support direct sending from PROGMEM. However it's not too hard to get around that - if your C++ is up to it. The IRsendRaw class is a child class that extends the ...
Majenko's user avatar
  • 105k
4 votes

How can a function/method determine if a const array passed in is PROGMEM (flash) or not (RAM)?

There is also an OO solution possible, using the strategy design pattern, but this comes with some (slight) memory and performance penalties. You need to use C++ for this. Put each array you want to ...
Michel Keijzers's user avatar
4 votes
Accepted

PlatformIO and const PROGMEM

The PROGMEM qualifier can only be applied to statically-allocated constant data. When you move the decimalDigit array inside the class, it becomes a data member, i.e. you have one copy of the array ...
Edgar Bonet's user avatar
  • 43.3k
4 votes
Accepted

Large arrays crash the arduino

In the edited version of your question, you wrote: I am using memcpy_P() in order to copy the arrays from PROGMEM to RAM. The whole purpose of PROGMEM is to avoid having to store the data in RAM. If ...
Edgar Bonet's user avatar
  • 43.3k
3 votes
Accepted

Arduino IDE: How to get PROGMEM const length?

Probably the best way would be to define below it const int eye_len = sizeof(eye)/sizeof(eye[0]); If the linker does link time optimization, or if you only use it within the same file (and declare ...
C_Elegans's user avatar
  • 148
3 votes

ATmega328, arduino nano v3 code error saying insufficient ram memory

The font definition table takes 960 bytes of RAM - nearly 1/2 of the the total usage. You can regain 480 bytes just by declaring that array as uint8_t; 1 byte each entry instead of 2 bytes each for ...
JRobert's user avatar
  • 15.3k
3 votes
Accepted

Problem when using PROGMEM on array holding notes for speaker on Arduino

You can not directly dereference something ("access an array") that is in flash memory. You have to use pgm_read_xxx functions from <avr/pgmspace.h> . In your case you should probably write ...
filo's user avatar
  • 166
3 votes
Accepted

Is there a way to "list" (in BASIC, or "cat" in LINUX) the current sketch loaded in my xxxDUINO?

No. the code burned in an Arduino is compiled not interpreted like Basic. Basically your C language sketch is compiled into AVR assembly language. The resulting hexadecimal is what is burned to the ...
Andre Courchesne's user avatar
3 votes
Accepted

How is a 41KB char array filling up 256KB of program memory?

The limitation here is the data type of the index of the array. That is int, and on an 8-bit system an int can hold a value in the range -32768 to 32767. That means the biggest index number an array ...
Majenko's user avatar
  • 105k
3 votes

Inherent delay running EEPROM.read()

When I store it in the EEPROM, the extra time required to find it in EEPROM, pull it through the sketch, and then push it through to the db corrupts the data sourced from EEPROM and posts a jumbled ...
Majenko's user avatar
  • 105k
3 votes

Initialize object with PROGMEM constants

const char* text; is a pointer to constant not a constant pointer (char * const text is a constant pointer). So you can assign a pointer to a constant char array to const char* text; even a pointer to ...
Juraj's user avatar
  • 18k
2 votes

Possible to "inline" PROGMEM strings into a structure array initialization?

If the strings are similar size you can, like this: const int NUMBER_OF_ELEMENTS = 10; typedef struct { char description [12]; } descriptionType; const descriptionType descriptions [...
Nick Gammon's user avatar
  • 38.3k
2 votes
Accepted

Using PROGMEM in constructor

The closest I could get to what you are trying to do is this: template <size_t table_size> struct Ex_class { int get_value(int index) const { return pgm_read_word(&_ex_table[index]); ...
Edgar Bonet's user avatar
  • 43.3k
2 votes
Accepted

Reading a 10-byte buffer out of a PROGMEM string stored in a string table

The first thing you need to fix is this: /home/nick/Arduino/Large_Progmem_test/Large_Progmem_test.ino: In function 'foo()': /home/nick/Arduino/Large_Progmem_test/Large_Progmem_test.ino:42:27: warning:...
Nick Gammon's user avatar
  • 38.3k
2 votes

PCM audio, PROGMEM sounds through speaker, multiple clips (using speaker_pcm)

I think it's just a case of startPlayback() being asynchronous. It doesn't block; it doesn't wait for playback to finish. It just sets up the 8000 Hz timer interrupt and returns. The original code ...
MZS's user avatar
  • 121
2 votes
Accepted

Possible to determine at runtime whether a pointer is declared PROGMEM?

Not really, if you are asking whether you can determine (simply from its value) whether 0x100 is in RAM or PROGMEM. Both are possible candidates for a memory location. The F() macro works around this ...
Nick Gammon's user avatar
  • 38.3k
2 votes

PROGMEM on Arduino Due (ARM Cortex M3)

There is no PROGMEM required on ARM. There is no memory bus separation between Flash and RAM, so it doesn't copy constants from flash to RAM which PROGMEM is used to prevent.
Majenko's user avatar
  • 105k
2 votes

PROGMEM Corrupted Array

Just a follow up in case someone else has the same problem. One solution is Nick's answer in his comment, which grabs the far addresses first in the setup, storing them in an array, and using them. I ...
KaYBlitZ's user avatar
2 votes

Printing elements of char array from PROGMEM

Among many others, check out pgmspace.h utilities at AVR-libc
dougp's user avatar
  • 21
2 votes
Accepted

Initialize and read from a PROGMEM array of pointers to PROGMEM arrays

const byte* const message[] PROGMEM = to use an item, load it in RAM strcpy_P(buffer, (byte*)pgm_read_word(&(message[i]))); source Arduino reference - PROGMEM
Juraj's user avatar
  • 18k
2 votes
Accepted

Use of progmem in ESP8266 vs AVR and also how to handle large dynamic strings

On the ESP8266 flash is a very special case. Because the ESP8266 itself does not have any flash, but instead uses an external SPI-connected flash chip, accessing it is not an easy or technically ...
Majenko's user avatar
  • 105k
2 votes
Accepted

Initialize object with PROGMEM constants

It is a shame that gcc only supports the __flash qualifier in C mode, not in C++, so we have to use PROGMEM instead. Unlike __flash, which qualifies a variable just like const, the PROGMEM attribute ...
Edgar Bonet's user avatar
  • 43.3k
2 votes
Accepted

How to create large progmem arrays and not annoy the linker

Include Guards only protect against inclusion of a header file multiple times within the same translation unit. This is important. If you include a header file (1) in a source file, then include ...
Majenko's user avatar
  • 105k
2 votes

Reading PROGMEM results in an incorrect hex value

I needed to either remove PROGMEM from the array or use pgm_read_byte to read the array.
Ryan Rife's user avatar
2 votes

How can a function/method determine if a const array passed in is PROGMEM (flash) or not (RAM)?

The classic avr-gcc way is to have dedicated functions with different names e.g. void* memcpy(void* dest, const void* src, size_t n); // Only works if src is RAM vs. void* memcpy_P(void *dest, ...
DataFiddler's user avatar
  • 1,045
2 votes

Read bytes from PROGMEM array

On the question you are referencing, the accepted answer suggests to modify the library. This could be the most efficient option. A less invasive solution, however, would be to copy the data from the ...
Edgar Bonet's user avatar
  • 43.3k

Only top scored, non community-wiki answers of a minimum length are eligible