DSP—2812代码段.text段 太长,导致无法在线仿真的解决办法— dsp2812例程

文章来自:http://hi.baidu.com/工程师笔记

DSP2812的代码被编译器放在.text段中,当代码越长时,.text段就越大。而一个段只能放在一块连续的RAM空间中。2812较大的RAM空间有2块,一块是L0L1,长度8kw,另一块是H0,长度也是8kw。如果代码非常长,以至于.text段大到超过8kw,超过了任何一块连续RAM的大小,则无法在RAM中运行,也就无法在线仿真这个程序了,这对调试是非常不方便的。
最近有个同事编写了一个2000多行的程序,所有代码都放在了一个文件中,.text段长度为0x20a0,超过了8k,只好采取屏蔽掉一部分代码,调试剩下的那部分的方法,但这样还是不够方便。

除了硬件上扩展片外RAM外,还有两个解决的办法,一个是用#pragmaCODE_SECTION把一些函数定位到text以外的段,来达到削减text段长度的目的。另外一个方法就是拆分.text段。而拆分又分为两种方式:手动拆分和自动拆分,两种拆分均可通过配置.cmd文件来实现。
.text段由许多.obj组成,每个.obj来自一个c源文件。拆分.text段只能以.obj为最小单位,
也就是说.obj是不能再拆分的。.text段中最大的一个obj是Main_nonBIOS.obj(与主函数所在文件同名),是主函数所在的文件Main_nonBIOS.c编译而来。把它单独放在一个段.text1里,余下的.obj放在另一个段.text2中。然后把.text1段和.text2段分别定位到H0和L0L1中。这就是拆分的基本思路。
当然了,如果Main_nonBIOS.obj的大小超过了8k,这样还是解决不了问题,这时就需要把Main_nonBIOS.c中的一部分代码转移到别的c文件中,为主函数所在的c文件瘦身。推荐的做法是主函数所在的文件中只有主函数,别的函数都按照功能分别放在不同的c文件中,这样就不会出现某个.obj特别大的情况了。

第一种拆分方法:手动拆分.text段

修改后的.cmd文件如下:请注意加深字体颜色部分。

MEMORY
{
PAGE0:
RAML0L1:origin=0x008000,length=0x002000
OTP:origin=0x3D7800,length=0x000400
FLASH_ABCDEFGHIJ:origin=0x3D8000,length=0x01FF80
CSM_RSVD:origin=0x3F7F80,length=0x000076
BEGIN_FLASH:origin=0x3F7FF6,length=0x000002
PASSWORDS:origin=0x3F7FF8,length=0x000008
BEGIN_H0:origin=0x3F8000,length=0x000002
H0SARAM:origin=0x3F8002,length=0x001FFE
IQTABLES:origin=0x3FF000,length=0x000B50
BOOTROM:origin=0x3FFB50,length=0x000470
RESET:origin=0x3FFFC0,length=0x000002
VECTORS:origin=0x3FFFC2,length=0x00003E

PAGE1:
RAMM0M1:origin=0x000000,length=0x000800
}


SECTIONS
{


.text1:{Main_nonBIOS.obj(.text)}>H0SARAM,PAGE=0

.text2:{*(.text)}>RAML0L1,PAGE=0


.cinit:>RAML0L1,PAGE=0
.const:>RAML0L1,PAGE=0
.econst:>RAML0L1,PAGE=0
.pinit:>RAML0L1,PAGE=0
.reset:>RESET,PAGE=0,TYPE=DSECT
.switch:>RAML0L1,PAGE=0


.bss:>RAMM0M1,PAGE=1
.ebss:>RAMM0M1,PAGE=1
.cio:>RAMM0M1,PAGE=1
.stack:>RAMM0M1,PAGE=1
.sysmem:>RAMM0M1,PAGE=1
.esysmem:>RAMM0M1,PAGE=1


codestart:>BEGIN_H0,PAGE=0
internalMemFuncs:>H0SARAM,PAGE=0
secureRamFuncs:>RAML0L1,PAGE=0
}


第二种拆分方法:自动拆分.text段

实际上.text段是可以被自动拆分的。使用>>符号就可以达到这个目的。基本思想和第一种方法一样,只是如何具体拆分交给编译器去完成。这种方法的.cmd文件如下:


MEMORY
{
PAGE0:
RAML0L1:origin=0x008000,length=0x002000
OTP:origin=0x3D7800,length=0x000400
FLASH_ABCDEFGHIJ:origin=0x3D8000,length=0x01FF80
CSM_RSVD:origin=0x3F7F80,length=0x000076
BEGIN_FLASH:origin=0x3F7FF6,length=0x000002
PASSWORDS:origin=0x3F7FF8,length=0x000008
BEGIN_H0:origin=0x3F8000,length=0x000002
H0SARAM:origin=0x3F8002,length=0x001FFE
IQTABLES:origin=0x3FF000,length=0x000B50
BOOTROM:origin=0x3FFB50,length=0x000470
RESET:origin=0x3FFFC0,length=0x000002
VECTORS:origin=0x3FFFC2,length=0x00003E

PAGE1:
RAMM0M1:origin=0x000000,length=0x000800

}


SECTIONS
{


.text:{*(.text)}>>H0SARAM|RAML0L1,PAGE=0

.cinit:>RAML0L1,PAGE=0
.const:>RAML0L1,PAGE=0
.econst:>RAML0L1,PAGE=0
.pinit:>RAML0L1,PAGE=0
.reset:>RESET,PAGE=0,TYPE=DSECT
.switch:>RAML0L1,PAGE=0


.bss:>RAMM0M1,PAGE=1
.ebss:>RAMM0M1,PAGE=1
.cio:>RAMM0M1,PAGE=1
.stack:>RAMM0M1,PAGE=1
.sysmem:>RAMM0M1,PAGE=1
.esysmem:>RAMM0M1,PAGE=1


codestart:>BEGIN_H0,PAGE=0
DSP—2812代码段(.text段)太长,导致无法在线仿真的解决办法— dsp2812例程
internalMemFuncs:>H0SARAM,PAGE=0
secureRamFuncs:>RAML0L1,PAGE=0
}


注意:最后要说的是,如果.text的总大小超过了片上RAM的总和,就无法通过拆分解决问题了,这时要想把代码全部在RAM中运行,进行在线仿真,就只有硬件扩展RAM一种方法了。

  

爱华网本文地址 » http://www.413yy.cn/a/25101010/42556.html

更多阅读

腿毛太长怎么办 女生去腿毛的小妙招

腿毛太长怎么办——简介在青春期的时候,无论你是男生还是女生都是会长腿毛的。但是有些人的腿毛却格外长,如果是男生的话就还好。但是如果是一个女生腿毛过长的话,就显得不那么美丽了。 腿毛太长怎么办——方法/步骤腿

魔兽争霸地图太大的解决方法 魔兽争霸3地图包

魔兽争霸地图太大的解决方法——简介魔兽地图太大该怎么办!!!???我们在玩魔兽争霸时,在局域网创建地图的时候,经常会碰到地图太大,无法创建的情况(提示:该图太大了,请选择另外一张地图),导致无法建立地图。该如何处理这种情况?下面简单说明一下。

蓝屏代码0X0000007B的解决办法 0x0000007b解决方案

蓝屏代码0X0000007B的解决办法——简介拿到一台华硕的笔记本电脑,在安装系统的时候不管你怎么搞都是蓝屏,开始还以为是硬盘坏了呢?最后了解是因为硬盘接口设置问题。下面来演示下怎么解决这一问题。蓝屏代码0X0

Word2003发送错误报告的解决办法 678错误代码解决办法

Word2003发送错误报告的解决办法——简介?Microsoft Office Word 2003老是发送这样的错误报告怎么办?如何去解决?Word2003发送错误报告的解决办法——工具/原料计算机一台 安装了Microsoft Office Word 2003 软件Word2003发送错误

Windows7 C盘太大,如何拆分成多个分区? win7拆分分区

我们购买的品牌机,很多是预装好了操作系统的,预装的操作系统常常只给分1个区,所有文件全部放在C盘!这样很不方面我们对资料文件进行管理,怎么办呢,重装太麻烦,作为一个小菜鸟的我,特别专业的分区软件也不太懂得如何使用。经过研究我发现不需

声明:《DSP—2812代码段.text段 太长,导致无法在线仿真的解决办法— dsp2812例程》为网友芒种男神分享!如侵犯到您的合法权益请联系我们删除