打印

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

[复制链接]
2674|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangmangui|  楼主 | 2014-8-18 23:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码段(.text段)太长,导致无法在线仿真的解决办法——拆分.text段
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 1 :  
   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
{
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 1 :  
   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               
   internalMemFuncs : > H0SARAM,        PAGE = 0              
   secureRamFuncs    : > RAML0L1,        PAGE = 0               
}

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


资料来自网络收集,供大家学习使用!

相关帖子

沙发
fgdzypf| | 2014-8-20 07:52 | 只看该作者
非常不错,学习一下,现在也遇到到了,但用其他方式解决了。但还得感谢呀

使用特权

评论回复
板凳
zhangmangui|  楼主 | 2014-8-20 12:44 | 只看该作者
fgdzypf 发表于 2014-8-20 07:52
非常不错,学习一下,现在也遇到到了,但用其他方式解决了。但还得感谢呀 ...

你必须将解决方法分享出来啊

使用特权

评论回复
地板
小木欧尼| | 2014-9-21 14:40 | 只看该作者
也遇到这样的问题了呢 正好学习啦

使用特权

评论回复
5
long009| | 2014-11-30 13:53 | 只看该作者
:handshake

使用特权

评论回复
6
zhangmangui|  楼主 | 2014-11-30 21:11 | 只看该作者
代码段(.text段)太长导致无法在线仿真的解决办法

使用特权

评论回复
7
U201015703| | 2015-9-11 15:18 | 只看该作者
很不错,多谢分享,每天进步一点点

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入【TI DSP 论坛】 & 【DSP 技术】           TI忠诚粉丝!

935

主题

26376

帖子

589

粉丝