linker - ESP8266:我该如何克服 "section ` .text' 不适合区域 `iram1_0_seg' 的问题?

标签 linker linker-scripts esp8266

使用基于 xtensa GCC 的工具链链接 ESP8266 时,针对 .text 区域不适合“iram1_0_seg”的一般措施有哪些?

我猜测 ESP8266 的 RAM 不够大,无法容纳某些功能。但是,我怎样才能将尽可能多的功能转移到闪存中呢?

以下是链接器返回内容的示例:

/home/user/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/1.20.0-26-gb404fb9-2/bin/xtensa-lx106-elf-gcc  -I/home/user/git/esp-open-sdk/sdk/include -I/home/user/git/esp-open-sdk/sdk/include/json -I/home/user/git/mart3/src/RTMain/ESP8266TargetGroup -Os -D__ESP8266__ -std=c99 -pedantic -Wall -Wpointer-arith -pipe -Wno-unused-parameter -Wno-unused-variable -Os -g -O2 -Wpointer-arith -Wundef -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals  -D__ets__ -DICACHE_FLASH -ffunction-sections -fdata-sections  -L/home/user/.arduino15/packages/esp8266/hardware/esp8266/2.0.0/tools/sdk/lib -L/home/user/.arduino15/packages/esp8266/hardware/esp8266/2.0.0/tools/sdk/ld -Teagle.flash.512k0.ld -nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static -Wl,--gc-sections src/code/CMakeFiles/FX6CodeObj.dir/FX6Generated/src-gen/fxfu___program1.c.obj src/code/CMakeFiles/FX6CodeObj.dir/FX6Generated/src/emptyHello/fxfu___helloart.c.obj src/code/CMakeFiles/FX6CodeObj.dir/FXStd/FXRTMain.c.obj src/code/CMakeFiles/FX6CodeObj.dir/FXStd/NamedList.c.obj  -o src/ARTApp/ARTApp.out  -Wl,--start-group src/ART/libART.a -lm -lgcc -lhal -lphy -lnet80211 -llwip -lwpa -lmain -lpp -lsmartconfig -lwps -lcrypto -laxtls -Wl,--end-group
/home/user/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/1.20.0-26-gb404fb9-2/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld: src/ARTApp/ARTApp.out section `.text' will not fit in region `iram1_0_seg'
collect2: error: ld returned 1 exit status

最佳答案

我不了解 Arduino,但如果您要使用此处找到的 Espressif 库进行编程 https://github.com/esp8266/esp8266-wiki/raw/master/sdk/然后他们有很多宏用于诸如此类的事情。

作为示例,使用以下行将 ESP 的“main”放入闪存中。

void ICACHE_FLASH_ATTR user_init(){

如果你跟踪 ICACHE... 命令,你会发现这个定义

#define ICACHE_FLASH_ATTR __attribute__((section(".irom0.text")))

如果您随后查看 espressif 如何设置内存部分 https://github.com/esp8266/esp8266-wiki/wiki/Memory-Map .irom0.text 被标记为闪存。基本上任何带有 ICACHE... 命令的东西都会加载到闪存中,任何没有的东西都不会。

再次不确定如何将其转换为 Arduino 代码,但如果您的闪存空间不足,可能是时候放弃 Arduino 库了。您没有指定您正在使用哪个 ESP 分线器,我的大脑可能在欺骗我,但我相信 ESP12-e 使用了更新的芯片,该芯片具有更多的闪存,然后说 ESP01,只是另一种选择。

关于linker - ESP8266:我该如何克服 "section ` .text' 不适合区域 `iram1_0_seg' 的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54420016/

相关文章:

assembly - 什么是数据段初始值设定项?

arduino - ESP8266 上的链表出现 StoreProhibitedCause 异常

c++ - ESP8266 尝试从字节数组读取 float 时出现异常

C,静态库,链接器: How to give preference to strong symbol over weak symbol

c - 是否可以将命令行参数传递给 GNU LD 以创建一个部分、定义大小并将其放置在特定内存中?

ld - 如何获取输入节的大小(将其放在内存末尾)

arduino - 无法浏览在esp8266中创建的Mdns服务

linux - 创建一个包含其链接时库依赖项的共享库

c++ - shobjidl.h 中的第二个 C 链接

dynamic - 动态加载和动态链接之间的区别?