编译相关

请参考 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 region RAM’;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 region PSRAM’; 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_xxxPSRAM_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不应该包括在这个工程中