您的位置:首页 > 编程语言

代码段(.text段)太长的解决办法

2013-09-30 11:10 483 查看


DSP2812 代码段(.text段)太长的解决办法——通过cmd文件拆分.text段

代码段(.text段)太长,导致无法在线仿真的解决办法——拆分.text段

(本人原创,转载请注明出处: http://hi.baidu.com/工程师笔记 , 谢谢)

DSP2812的代码被编译器放在.text段中,当代码越长时,.text段就越大。而一个段

只能放在一块连续的RAM空间中。2812较大的RAM空间有2块,一块是L0L1,长度8kw,

另一块是H0,长度也是8kw。如果代码非常长,以至于.text段大到超过8kw,超过了任

何一块连续RAM的大小,则无法在RAM中运行,也就无法在线仿真这个程序了。

这对调试是非常不方便的。

最近有个同事编写了一个2000多行的程序,所有代码都放在了一个文件中,.text段

长度为0x20a0,超过了8k,只好采取屏蔽掉一部分代码,调试剩下的那部分的方法。

但这样还是不够方便。

除了硬件上扩展片外RAM外,还有两个解决的办法,一个是用#pragma CODE_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

{

PAGE 0: /* Program Memory */

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

PAGE 1 : /* Data Memory */

RAMM0M1 : origin = 0x000000, length = 0x000800

}

SECTIONS

{

/*** Compiler Required Sections ***/

/* Program memory (PAGE 0) sections */

.text1 : {Main_nonBIOS.obj(.text)}> H0SARAM, PAGE = 0 /*主函数所在的.obj单独放在一个段,配置到H0*/

.text2 : {*(.text)}> RAML0L1, PAGE = 0 /*剩余的.obj放在另一个段,配置到L0L1*/

.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

/* Data Memory (PAGE 1) sections */

.bss : > RAMM0M1, PAGE = 1

.ebss : > RAMM0M1, PAGE = 1

.cio : > RAMM0M1, PAGE = 1

.stack : > RAMM0M1, PAGE = 1

.sysmem : > RAMM0M1, PAGE = 1

.esysmem : > RAMM0M1, PAGE = 1

/*** User Defined Sections ***/

codestart : > BEGIN_H0, PAGE = 0

internalMemFuncs : > H0SARAM, PAGE = 0

secureRamFuncs : > RAML0L1, PAGE = 0

}

/******************* end of file ************************/

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

实际上.text段是可以被自动拆分的。使用>>符号就可以达到这个目的。基本思想

和第一种方法一样,只是如何具体拆分交给编译器去完成。这种方法的.cmd文件如下:

MEMORY

{

PAGE 0: /* Program Memory */

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

PAGE 1 : /* Data Memory */

RAMM0M1 : origin = 0x000000, length = 0x000800

}

SECTIONS

{

/*** Compiler Required Sections ***/

/* Program memory (PAGE 0) sections */

.text : {*(.text)} >> H0SARAM | RAML0L1, PAGE = 0 /*.text段将在H0SARAM和RAML0L1中自动拆分*/



.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

/* Data Memory (PAGE 1) sections */

.bss : > RAMM0M1, PAGE = 1

.ebss : > RAMM0M1, PAGE = 1

.cio : > RAMM0M1, PAGE = 1

.stack : > RAMM0M1, PAGE = 1

.sysmem : > RAMM0M1, PAGE = 1

.esysmem : > RAMM0M1, PAGE = 1

/*** User Defined Sections ***/

codestart : > BEGIN_H0, PAGE = 0

internalMemFuncs : > H0SARAM, PAGE = 0

secureRamFuncs : > RAML0L1, PAGE = 0

}

/******************* end of file ************************/

最后要说的是,如果.text的总大小超过了片上RAM的总和,就无法通过拆分解决问题了,

这时要想把代码全部在RAM中运行,进行在线仿真,就只有硬件扩展RAM一种方法了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: