Я пытался связать программу с 200 КБ постоянных данных.
Я использовал атрибут __attribute__((section(".irom.text")))
, пытаясь поместить его во FLASH, так как считаю, что ESP8266 имеет 4 МБ доступной флэш-памяти.
Увы, компоновщик выдает ошибку:
bin/firmware.elf section `.irom0.text' will not fit in region `irom0_0_seg'
Используемый скрипт компоновщика - это то, что я получил от платформы IO, а именно:
MEMORY
{
dport0_0_seg : org = 0x3FF00000, len = 0x10
dram0_0_seg : org = 0x3FFE8000, len = 0x18000
iram1_0_seg : org = 0x40100000, len = 0x8000
irom0_0_seg : org = 0x40220000, len = 0x5C000
}
INCLUDE "../ld/eagle.app.v6.common.ld"
Действительно, длины секции irom
0x5C000
(376 Кбайт) может быть недостаточно для моего кода, массива констант и SDK.
Так где же обещанные 4Мбайта? Можно ли отобразить больше FLASH?
Доступная вспышка зависит от вашей платы, но вы можете узнать, сколько ее там.
Возможно у вас 4Мбит (512Кб) памяти?
Модули @Clifford esp8266 обычно поставляются с внешней флэш-памятью, которая отображается в ее пространстве памяти. Мое устройство — nodemcu v3, и я уверен, что оно имеет 4 МБ. Попробую поиграться со скриптом линкера и увеличить размер рома. Возможно, в платформере была ошибка.
@Artium: Я знаю, это то, что я сказал. Я хочу сказать, что сумма зависит от конкретной платы или детали. Вы должны добавить эту информацию к вопросу, а не отвечать в комментариях.
Остальное можно использовать для SPIFFS. Карты памяти: esp8266.com/wiki/doku.php?id=esp8266_memory_map
Я думаю, что я понял это.
Кажется, что системные параметры для 4-мегабайтного модуля должны находиться в 0x3fb000
.
Таким образом можно увеличить размер irom
сегмента до 0x3fb000 - 0x20000 = 0x3DB000
байт.
Вот пример, где я добавил 0x1000 запасных байт после конца irom
(на всякий случай, если я пропустил что-то, чего не понимаю):
irom0_0_seg : org = 0x40220000, len = 0x3DA000 /* 4MB FLASH: irom begin untill system params start is 0x3DB000 */
Также необходимо сообщить инструменту esp, чтобы он поместил каждую секцию в правильное место во флэш-памяти (обратите внимание, куда идет esp_init_data_default.bin
):
esptool -cd nodemcu -cb 115200 -cp "/dev/ttyUSB0" -ca 0x00000 -cf path/to/eagle.flash.bin -ca 0x20000 -cf path/to/eagle.irom0text.bin -ca 0x3fc000 -cf path/to/framework-esp8266-rtos-sdk/bin/esp_init_data_default.bin -ca 0x3fe000 -cf path/to/framework-esp8266-rtos-sdk/bin/blank.bin
Сама SoC не имеет встроенной флэш-памяти. С чего вы взяли, что у него 4 Мб? Флэш-память обеспечивается внешним чипом на плате или модуле — какая именно деталь или плата у вас есть?