杰理692X RAM内存管理overlay机制

先复习一下C工程文件编译产生机器可执行文件后变量和代码的存储方式:

IDE链接目标代码生成目标机器可执行文件(比如51单片机代码编译后产生的hex文件,692x的fw文件)后,通常包含几个段:

①text代码段

②bss段,即未初始化数据段

③data段,初始化数据段

当然如果包含字符串常量,还有rdata段等等

C代码中的不同变量,代码分配在哪一个段,是嵌入式开发必备知识之一。

用以上知识结合692X代码探讨内存分配,可以更好的理解692X的代码,内存管理方式。

 

首先要了解一颗芯片的ram内存分配情况,必须查看的就是内存分配链接脚本了。692X系列的链接脚本在flash文件夹里边的sdk.ld文件。打开这个文件:杰理692X RAM内存管理overlay机制_第1张图片

在以上MEMORY中:

一、有128K的ram,具体分为5部分空间:

1,保留区reserved_ram,大小0x00100

2,ram0,大小68K-0x200

3,overlay_task, 大小8K+128byte

4,overlay_ram0 ,大小29K-128byte

5,stack_ram  ,大小0x1b00

二、最后面的code0是flash空间,最大支持16M bytes的flash

bss段在哪?

看到脚本的56行,这里 .= ORIGIN(ram0) 把当前位置定位到ram0的开始地址,57行.bss就是以上所述未初始化数据段,59行意思是除了那些指定段的未初始化数据以外,所有的未初始化数据都放在这里,我们定义的凡是未初始化的静态变量,未初始化全局变量,未初始化的数组,未初始化的xxx全都会放在bss段所在的ram0中,,而不是在flash中(因为flash位置在code0),最后81行> ram0表示所有以上数据都需要放在ram0限定的空间里,如果里面的未初始化数据过大,则编译器可能报错。

杰理692X RAM内存管理overlay机制_第2张图片

再看data初始化了的数据段:

杰理692X RAM内存管理overlay机制_第3张图片

分析同以上bss段,初始化了的所有全局变量,数据都是放在ram0里边

再看代码段text:

杰理692X RAM内存管理overlay机制_第4张图片

 

在193行,当前地址已经定位到了code0,上面分析了code0并不是芯片本身的ram空间,而是cpu外挂的flash空间。再结合202行可以看出,所有未指定段的函数编译后生成的代码指令都放在了flash里面,这里之所以说未指定段的函数,是因为每一个函数我们都可以用attribute属性配置设置,放到ram或者flash的任意地址位置的,具体设置方法这里不再赘述。202行还注意到:.rodata*  没错! 这个就是只读数据段,在程序里定义的所有const修饰的变量,数组以及字符串常量都会放在flash里面,当然这里还包括我们熟悉的提示音数据,VM数据等等

 

接下来重点看overlay_task,大小为68k-0x200,

杰理692X RAM内存管理overlay机制_第5张图片> overlay_task,意思是把上面的这些段分配到这个overlay_task空间里,上面分析可知这个地址空间是属于RAM的,这里的段有蓝牙模式下的tws段,音乐模式下文件系统以及ui段,fm模式段等,他们都是同一个地址,分时复用,即在每个模式下都是相同地址,只是定义的段名称不同,这些地址里的所有数据在转换模式后会被强制清零。如果在蓝牙模式下没有开启tws功能,那么可以把定义的全局数组等放在tws段,总共8K空间,注意只能在蓝牙模式下使用,因为转换模式后所有overlay段都会清零,在非蓝牙模式下tws段将不复存在。非常重要一点就是一定不能在开机进入任何模式之前使用这个overlay ram,开机后就会死机,在使用(包括初始化)之前一定要先初始化。这个是某一个模式下挪出空间的一种。再看后面overlay ram0:杰理692X RAM内存管理overlay机制_第6张图片         这里同理每个overlay段都是同一个地址,大概有29K空间,这29K空间,只有MP3模式是用剩下几百个字节的,其他模式都剩下比较大的空间,这些空间在非MP3模式就可以拿来用,比如在蓝牙模式可以把代码放在.bt_sbc段,这个段有比较大空间没有使用,只要没有报错都可以放,试过放过8K多空间都是可以的。如果在LINEIN状态就更多了,29K+空间完全没有使用,可以定义overlay7放29K的代码空间。在非MP3状态最少都有7 8K的overlay空间使用,这个空间跟以上分析的BSS段,DATA段,TEXT段并不是同一个地址空间。如果一定要在MP3状态挪出空间来有没有办法?肯定有,把music_mem空间改小,原来SDK这个空间是MP3解码用的,使用的是7*1024的32bit空间,可以把空间压缩到5*1024,这个可以5*1024的32bit空间够播放mp3文件了,至于其他格式的,暂时还没有验证过。这样的话,各个模式下整个代码可以完全省出8K+的空间来了。

你可能感兴趣的:(蓝牙音频)