关于内存分页重叠的解决方法
操作方法
- 01
关于内存分页重叠的解决 在对MP3解码程序从16位定点C算法移植到FD216 16位定点DSP过程中,我发现代码和数据数量很大,无法放置在一页内存中,必须进行内存分页。 要正确进行内存分页,首先我们来了解FD216的内存结构。 FD216的整个内存由Program-Code Memory(CM)、Program-Data Memory( PM)、Data Memory (DM)和I/O存储空间四部分组成。 1、Program-Code Memory(CM):存储DSP程序代码。 24k*24片内CM内存,其中分为两部份: 1个8k字页(0x0000~0x1fff);4个4k字重叠页(0x2000~0x2fff),使用pmovlay寄存器的第3位~第0位来选择使用哪一CM重叠页。 2、Program-Data Memory( PM):存储数据变量。 8k*16片内PM内存,分为2页重叠页,另外4个4k*16片外PM字重叠页,地址空间均为0x3000~0x3fff,使用pmovlay寄存器的第7位~第4位来选择使用哪一PM重叠页。 3、Data Memory (DM):存储数据变量和内存映射寄存器。 片内有1个8k*16字页,片外有4个8k*16字重叠页,地址空间为0x0000~0x1fff。 4、IO存储空间:用于DSP和外围器件的连接,不涉及分页问题。本系统不使用I/O内存空间。 具体分页过程 使用fd2ln –groupgroupfile来进行分页,并生成可烧录到flash中的.EXE文件。 groupfile例子: main 需要链接的文件 -a fd216 指定系统结构文件名为fd216.sys -e page0 生成page0.exe可执行文件 -g 产生后缀.sym的符号表文件 -x 产生后缀.map的内存映射文件 -end file1 -a fd216 -e page1 -g -x -end file2 -a fd216 -e page2 -g -x -end table0 -a fd216 -e page3 -g -x -end table1 -a fd216 -e page4 -g -x -end 用fd2osplt -v-m page查看程序、数据在RAM中的分页放置情况。发现分出了多个DM、PM、CM重叠页,检查page*.map文件,各个模块的全局DM变量都从0x0地址开始分配,由于各个模块都有自己的全局变量,所以fd2ln –group groupfile时自动对DM分页。改进:把C程序中所有的全局变量都定义在同一个文件main.c中,需要调用它的文件用extern说明。重新make。修改后的groupfile如下。 但这样处理后,虽然DM只占了一页,但检查page0.map文件,发现有些外部变量没分配绝对地址