加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2013-12-27 16:15:49)
标签:

dsp

分类: 学习交流

文章来自: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:    
   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   
   RAMM0M1          origin 0x000000, length 0x000800    
}


SECTIONS
{


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

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


   .cinit     RAML0L1,        PAGE 0
   .const     RAML0L1,        PAGE 0
   .econst    RAML0L1,        PAGE      
   .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               
   internalMemFuncs H0SARAM,        PAGE               
   secureRamFuncs    RAML0L1,        PAGE                
}

 


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

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


MEMORY
{
PAGE 0:    
   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   
   RAMM0M1          origin 0x000000, length 0x000800   

}


SECTIONS
{


.text            {*(.text)} >> H0SARAM RAML0L1,   PAGE 
   
   .cinit            RAML0L1,        PAGE 0
   .const            RAML0L1,        PAGE 0
   .econst           RAML0L1,        PAGE      
   .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                
   internalMemFuncs H0SARAM,        PAGE               
   secureRamFuncs    RAML0L1,        PAGE                 
}

 


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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有