乐鑫技术交流
直播中

王斌

7年用户 1287经验值
私信 关注
[问答]

使用Arduino IDE编译器指令的疑问求解

我正在使用 Ardiono IDE 直接交叉编译
代码到 ESP8266。
由于内存不足,我遇到了麻烦。我正在查看错误并认为
我编写的代码已过度填充
xtensa CPU 的内部指令 ram。
  我收到错误“.text”将不适合区域“iram1_0_seg”
(在我添加导致此错误的代码之前的成功编译中,
我被告知草图使用了
可用程序空间的 34% - 很明显
这个不是闪存问题)
现在,据我了解,ESP 的 32 位 CPU 可以
从其内部 ram(并行且快速)运行代码

或者它可以被告知从板上运行速度更慢但更大的串行闪存芯片中运行代码- 对吗?我在人们编写的使用 GCC 命令行路径的
示例代码中看到了很多编译器指令。LOCAL void ICACHE_FLASH_ATTR some_function(int a, char*c)之类的指令我假设这些指令告诉链接器将代码放在运行串行闪存的地方,而不是珍贵且快速的片上 ram?是否有编译器指令及其相关用途的列表?这些编译器指令在 Arduino IDE 中有效吗?   

回帖(1)

北上北京

2024-6-6 18:33:28
编译 ESP8266 代码的文章中看到了一些有趣的东西,其中一些可以帮助你解决你的问题。根据这些文章,你可能需要做以下一些事情:

1.尝试将代码缩小为合理的大小,以适合 CPU 的可用内部 RAM。有几种方法可以提高代码效率和大小,例如使用函数而不是宏来减少代码重复,尽可能使用 C++ 标准库中的函数。

2.将代码拆分为多个代码库,每个代码库都针对 CPU 的不同部分进行优化,并使用选择性链接器将它们合并为一个可执行文件。这样,每个代码库都可以针对可用的内部 RAM 进行优化,并且可以使用必要时链接到外部闪存。

3.尝试使用独立的编译器和链接器,而不是使用 Arduino IDE。这些工具可能会更好地优化代码,并可以与选择性链接器一起使用。你可以查找名为 esp-open-sdk 的开源 SDK,其中包括 GNU 工具链,以及许多其他有用的工具和库。

4.如果你仍然想使用 Arduino IDE,可以尝试使用 F() 宏,将字符串常量放在程序存储器中而不是内部 RAM 中,这样可以减少 SRAM 的使用。还可以尝试优化模板声明和 STL 库,如果你使用了它们的话。

希望这些提示能够帮助你解决你的编译问题!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分