程序内存空间不足导致编译报错
Overview
用户在移植第三方库或进行其他操作时,若遇到程序报内存不足,链接失败等错误,可以试着先改动sdk_ld.c文件,让程序先编译通过,再 查看使用细节,即每个函数、变量的大小,找出是哪个变量占存太大导致的。下面是一些具体的实例场景。
应用示例
首先进入 cpu/wl82/sdk_ld.c
查看相应内存配置
下面主要模拟了三种内存错误的场景,并分别分析错误原因以及对应的解决方案。分别是:在sdram段中定义一个超过段大小的数组;在sram中定义一个超过段大小的数组;在cache_ram中定义一个超过段大小的数组。
示例演示 1:
若遇到报错内容为:’.bss’ is not within region ‘.sdram’
解决方案:
在 sdk_ld.c
中,适当调整 sdram 的 LENGTH
值(比如不断增加100MB),让程序编译通过,再 查看使用细节,即每个函数、变量的大小,查看该错误是由哪个变量导致的。
由上图可知,该异常是由于在app_main()中定义了一个大小为32MB左右的test_array数组,占用了太大的 sdram
空间,导致内存不足,后续可对其进行相应的代码优化。
示例演示 2:
若遇到报错内容为:’.ram0_bss’ is not within region ‘ram0’;
section .boot_info LMA [xx,xx] overlaps section .ram0_bss LMA [xx,xx]。(注:xx是地址值)
解决方案:
1、第一个错误解决方法与示例1类似,即在 sdk_ld.c
中,适当调整 ram0 的 LENGTH
值(比如不断增加100MB),让程序编译通过,再 查看使用细节,即每个函数、变量的大小,查看该错误是由哪个变量导致的;
2、第二个错误,区域重叠覆盖,可能是在ram段中定义了一个超过ram剩余空间大小的变量,由于ram段与boot_info段相邻,因此超过部分可能会将boot_info重叠部分覆盖。
可以修改 sdk_ld.c
中 MEMORY
中各段 ORIGIN
字段 ,以避免重叠覆盖发生。下面给出修改示例。
MEMORY
{
rom(rx) : ORIGIN = 0x4000120, LENGTH = __FLASH_SIZE__
sdram(rwx) : ORIGIN = 0x6000120, LENGTH = SDRAM_SIZE
ram0(rwx) : ORIGIN = 0x1000000, LENGTH = RAM0_SIZE
boot_info(rwx) : ORIGIN = 0x2000000, LENGTH = BOOT_INFO_SIZE
cache_ram(rw) : ORIGIN = 0x3000000, LENGTH = CACHE_RAM_SIZE
}
再 查看使用细节,即每个函数、变量的大小,筛选出 ram0_bss
段的变量。
由上图可知,异常是由于在app_main()中定义了一个大小为4MB的test_array数组,占用了太多的 ram0_bss
空间,导致内存不足,后续可对其进行相应的代码优化。
示例演示 3:
若遇到报错内容为:’.cache_ram_bss’ is not within region ‘cache_ram’;
解决方案:
与示例1类似,在 sdk_ld.c
中,适当调整 cache_ram 的 LENGTH
值(比如不断增加100MB),让程序编译通过,再 查看使用细节,即每个函数、变量的大小,查看该错误是由哪个变量导致的。