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
Что здесь происходит ?
@user187, 👍0
Обсуждение1 ответ
Лучший ответ:
Я думаю, проблема не в
функции strcpy_P, а в вашем массиве. Без этого вызова функции весь массив может быть удален компилятором (я предполагаю, что он больше нигде не используется). Как только вы добавляете код, который определенно обращается к нему, он включается в код и, следовательно, значительно увеличивает размер программы.
- Записать во флэш-память с помощью PROGMEM
- Преимущества глобальных переменных перед статическими членами класса?
- Ошибка компиляции ESP8266: "previous declaration of 'HTTPMethod HTTP_HEAD'"
- Вспомогательный объект Flash String в качестве переменной
- Arduino IDE: как получить длину PROGMEM const?
- Использование программной памяти в ESP8266 по сравнению с AVR, а также как обрабатывать большие динамические строки
- Проблема с памятью Arduino со старыми чипами дисплея HP HDSP-2000
- Как использовать PROGMEM в файле .h/.cpp вместо файла .ino?
Когда он не используется, он будет оптимизирован компилятором., @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