我试图链接一个具有200 KB恒定数据的程序。
我使用__attribute__((section(".irom.text")))
属性试图将其放入Flash中,因为我相信ESP8266具有4MB的可用闪存。
A,链接器给出一个错误:
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 KB)可能不足以容纳我的代码,常量数组和SDK。
那么,承诺的4Mbytes在哪里?是否可以映射更多的FLASH?
答案 0 :(得分:0)
我认为我已经弄清楚了。
似乎4MB模块的系统参数应该位于0x3fb000
。
因此,可以将irom
段的大小增加到0x3fb000 - 0x20000 = 0x3DB000
个字节。
下面是一个示例,其中我在irom
结尾之后添加了0x1000备用字节(以防万一我错过了我不理解的内容):
irom0_0_seg : org = 0x40220000, len = 0x3DA000 /* 4MB FLASH: irom begin untill system params start is 0x3DB000 */
还需要告诉esp工具将每个部分放在Flash中的正确位置(注意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