strcpy_P увеличивает использование IROM на 400%

Использование ESP8266 (NodeMCU 1) в Arduino IDE:

Я не могу загрузить свой скетч, потому что один вызов strcpy_P, кажется, увеличивает использование IROM примерно на 400%: 25% общего использования без вызова, 100+% с вызовом.

И еще более странно, что это зависит от второго параметра strcpy_P (источник).: Если предоставляется указатель на массив char, использование резко возрастает

  char * ptr = (char *) pgm_read_word (&myArrays[index]);
  char buffer [1500];

  strcpy_P (buffer, ptr); // не может загрузить, использует 100+% доступного IROM

Принимая во внимание, что с PSTR в качестве параметра (только для тестирования) общий размер скетча составляет всего 25% от IROM, оставляя все остальное неизменным:

  char * ptr = (char *) pgm_read_word (&myArrays[index]);
  char buffer [1500];

  strcpy_P(buffer, PSTR("Test")); // Ok, не увеличивает размер скетча /использование IROM

Что здесь происходит ?

, 👍0

Обсуждение

Когда он не используется, он будет оптимизирован компилятором., @chrisl

что такое char * ptr = (char *) pgm_read_word (&myArrays[index]);? вы читаете адрес из flash?, @Juraj

Я пытаюсь динамически получить доступ (по индексу) к массивам символов, хранящимся в PROGMEM. и на них ссылаются в const char* const myArrays[] PROGMEM = { arr1, arr2, arr3}, @user187

@chrisl: Нет, я закомментировал все референеки в "буфер" после этого вызова, и все равно он использует 100% IROM, @user187

Это не обязательно означает, что он будет полностью оптимизирован. Эффект просто очень похож на оптимизацию. Хотя я не специалист по оптимизации., @chrisl


1 ответ


Лучший ответ:

2

Я думаю, проблема не в функции strcpy_P, а в вашем массиве. Без этого вызова функции весь массив может быть удален компилятором (я предполагаю, что он больше нигде не используется). Как только вы добавляете код, который определенно обращается к нему, он включается в код и, следовательно, значительно увеличивает размер программы.

,