编译相关¶
请参考 Butterfli FAQ。
FAQ1 如何解决分配空间不够导致链接时报错?¶
参见Butterfli工具 -> 分配空间不够导致链接时报错。
原因: 此种情况针对存放编译BIN的分区,出现此种报错的原因是该分区分配的空间不够。
解决方案:
减少代码或资源,从而使编译后的Size小于对应分区
调整工程的flash_map_xxx.xls第二个页签
FLASH_Map中对应分区的Size
FAQ2 如何解决分配空间不够导致文件系统打包报错?¶
参见Butterfli工具 -> 分配空间不够导致文件系统打包报错。
原因: 此种情况针对存放文件系统的分区,出现此种报错的原因是该分区分配的空间不够。
解决方案:
确认是否勾选了Butterfli工具
图片过滤调整工程的flash_map_xxx.xls第二个页签
FLASH_Map中对应分区的Size。注意,文件系统可使用的空间并不等于实际分区大小, partitsize * ((15/16)*(gc_ratio/(gc_ratio+1))
FAQ3 如何SRAM内存不够导致链接时报错?¶
报错现象:
keil: Error: L6388E: ScatterAssert expression (ImageLength(RW_IRAM_RET) + ImageLength(RW_IRAM1) + ImageLength(RW_IRAM0) < (((0x80 * 0x400) + (0x80 * 0x400) + (0x100 * 0x400)) - 0x0 - (0x2 * 0x200) - (0x100))) failed on line 393 : (0xa73e4 < 0x7fb00)
gcc: D:/env/tools/gnu_gcc/arm_gcc_14.2.1/bin/…/lib/gcc/arm-none-eabi/14.2.1/…/…/…/…/arm-none-eabi/bin/ld.exe: build\bf0_ap.elf section
.RW_IRAM0' will not fit in regionRAM’;D:/env/tools/gnu_gcc/arm_gcc_14.2.1/bin/…/lib/gcc/arm-none-eabi/14.2.1/…/…/…/…/arm-none-eabi/bin/ld.exe: region `RAM’ overflowed by 84748 bytes
原因: SRAM内存超出了SRAM总的空间大小。
解决方案:
先看报错中相差多少空间,如上面的报错中
(0xa73e4 < 0x7fb00),也就是说HCPU_RAM_DATA_SIZE = 0x7fb00,目前代码编译出来实际占用0xa73e4,两者相差0x278E4 = 162,000检查menuconfig中`(Top) → Memory Config → Cache in sram size(bytes)是否配置过大。如果过大,可做调整
检查
(Top) → SiFli SDK configuration → Third party packages → LittlevGL2RTT: The LittlevGl gui lib adapter RT-Thread → LVGL configuration → SiFli extend → LVGL&LCD framebuffer configuration → LVGL Frame Buffer Line Number(The part size)配置是否正常如果上面两项都不能解决问题,则:
keil: 临时屏蔽掉引用的
link_flash_xxx.sct中的对应行的ScatterAssert语句,gcc:临时修改引用的
link_flash_xxx.lds->__RAM_SIZE = HCPU_RAM_DATA_SIZE-> 直接修改HCPU_RAM_DATA_SIZE为一个很大Size
重新编译,找到生成的hcpu.map文件,统计文件里面的
0x2-------打头的地址中各个变量占用的内存情况,找出放置位置异常的变量,如本来应该放置在PSRAM;
占用空间异常的变量,进行size调整;
确认是否某些feature不应该包括在这个工程中
FAQ4 如何PSRAM内存不够导致链接时报错?¶
报错现象:
keil: Error: L6388E: ScatterAssert expression ((ImageLength(RW_PSRAM_NON_RET) + ImageLength(RW_PSRAM_NAND) + ImageLength(RW_PSRAM_RET) + ImageLength(RW_PSRAM_RET2) + ImageLength(RW_PSRAM_CACHE_RET) + ImageLength(RW_PSRAM_SAVE_DATA)) < 0x400000) failed on line 251 : (0x4a2038 < 0x400000)
gcc: D:/env/tools/gnu_gcc/arm_gcc_14.2.1/bin/…/lib/gcc/arm-none-eabi/14.2.1/…/…/…/…/arm-none-eabi/bin/ld.exe: build\bf0_ap.elf section
.RW_PSRAM_NON_RET' will not fit in regionPSRAM’; D:/env/tools/gnu_gcc/arm_gcc_14.2.1/bin/…/lib/gcc/arm-none-eabi/14.2.1/…/…/…/…/arm-none-eabi/bin/ld.exe: region `PSRAM’ overflowed by 662624 bytes
原因: PSRAM内存超出了PSRAM总的空间大小。
解决方案:
先看报错中相差多少空间,如上面的报错中
(0x4a2038 < 0x400000),也就是说RW_PSRAM_SAVE_DATA = 0x400000,目前代码编译出来实际占用0x4a2038,两者相差0xA2038 = 663,608检查menuconfig中
(Top) → Memory Config→ PSRAM相关的是否配置过大。如果过大,可做调整。注意, 用于
app_cache_xxx的PSRAM_HEAP_SIZE是自动算出来的。 如果这里都超出了,那留给app_cache_xxx的heap size就是0了。因此在解决该编译问题的同时,还需要考虑PSRAM_HEAP_SIZE至少大于1MB以上的空间
如果上面两项都不能解决问题,则:
keil: 临时屏蔽掉引用的
link_flash_xxx.sct中的对应行的ScatterAssert语句,gcc:临时修改引用的
link_flash_xxx.lds->__PSRAM_SIZE = xxx-> 直接修改__PSRAM_SIZE =一个很大Size
重新编译,找到生成的hcpu.map文件,统计文件里面的
0x6-------打头(注意0x64打头的是FLASH的地址空间)的地址中各个变量占用的内存情况,找出占用空间异常的变量,进行size调整;
确认是否某些feature不应该包括在这个工程中