[转]DSP2812 代码段(.text段)太长的解决办法——通过cmd文件拆分.text段
[转自]http://hi.baidu.com/servo_tech/item/173f875df268323b33e0a9da
代码段(.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一种方法了
[转]DSP2812 代码段(.text段)太长的解决办法——通过cmd文件拆分.text段相关推荐
- “CreateProcess error=206, 文件名或扩展名太长” 错误解决办法
"CreateProcess error=206, 文件名或扩展名太长" 错误解决办法 博主导入项目公司项目到IDEA启动的时候,编译阶段报错如下 "CreatePr ...
- 笔记本高分屏字体模糊_4k/1080p屏幕字体模糊怎么办?win10高分屏笔记本字体模糊太小的解决办法...
使用台式电脑的朋友应该还好,显示器尺寸本来就大,主要是针对一些使用笔记本的朋友.笔记本发展到现在的程度,基本上都是1080P或者4K的分辨率,但笔记本的屏幕尺寸往往只有14寸.15.6寸等.这么高的分 ...
- validating project时间过长,解决办法
validating project时间过长,解决办法 另外,可能有时项目怎么clean也还是原来的样子,可以在浏览器利用快捷键ctrl+shift+delete,清除缓存之后再试试.
- DSP芯片CMD文件中各段的实验验证(上)
上篇文章详细讲解了DSP中的CMD文件,请看:http://blog.csdn.net/qq_29545231/article/details/78175977<超详细的CMD文件讲解(DSP2 ...
- 加载MNIST报错:[WinError 10060] 由于连接方在一段时间后没有正确答复解决办法(亲测)
转载:https://blog.csdn.net/landcruiser007/article/details/79346982 tensorflow加载mnist数据集,一些书上和博客中的代码如下: ...
- spark SQL读取ORC文件从Driver启动到开始执行Task(或stage)间隔时间太长(计算Partition时间太长)且产出orc单个文件中stripe个数太多问题解决方案...
1.背景: 控制上游文件个数每天7000个,每个文件大小小于256M,50亿条+,orc格式.查看每个文件的stripe个数,500个左右,查询命令:hdfs fsck viewfs://hadoop ...
- php waiting ttfb,浅谈我们个人博客网站加载过程中Waiting(TTFB)时间过长的解决办法...
最近,我发现博客访问速度已经放缓.我检查了控制台,发现所有静态资源都在200ms内加载.只有第一份文件达到了6.65s.它被称为等待(TTFB). )占用主要加载时间的东西.具体的控制台显示内容如下: ...
- python数据量太大如何解决_Python 如何处理大文件
Python作为一门程序设计语言,在易读.易维护方面有独特优势,越来越多的人使用 Python 进行数据分析和处理,而 Pandas 正是为了解决数据分析任务而创建的,其包含大量能便捷处理数据的函数和 ...
- linux qq 提示错误,linux QQ使用实践兼wine QQ2013版本太低无法使用解决办法
摘要一部分:+-----------------------------------------------------------------------+ 安装说明: +------------- ...
- Keil MDK5中(1)汉字注释显示转向,字体显示朝左旋转90°(2)汉字注释显示为问号(3)按回车后光标缩进距离太大的解决办法
这是目录0.0 前言 第一个问题:汉字注释显示转向,字体显示朝左旋转90°解决办法: 第二个问题:注释中的汉字变成了问号,显示不出来,如下图所示: 第三个问题:按回车后光标缩进距离太大,如下图所示: ...
最新文章
- Mac插件分享——AE插件、PS插件、FCPX插件【持续更新中】
- vue element dialog 对话框
- 大数据心得体会_20年备受关注的6款数据工具!谁最好用?毫无争议的答案来了...
- 【面试题总结】2、反转字符串的几种形式
- storage theory
- [转载] python学习-基础教程、深度学习
- 如何在工作中如鱼得水?有三点很重要
- thinkphp 一个文件怎么调用另一个文件中的define()_ThinkPHP 简易开发思路 amp;amp; MVC和URL跳转...
- Windows 8 系统安装
- edius隐藏快捷键_Eduis快捷键,大家参考一下!【EDIUS】史上最全的EDIUS快捷键资料分享!...
- b2c京东流程图_京东商城的商业模式及其运作流程(精)
- 降采样 matlab,改进型64倍降采样数字抽取滤波器的设计与仿真分析
- XXXX大学课程设计说明书格式规范
- 解决mysql1336
- 正态分布是离散分布还是连续分布_连续性随机变量与正态分布——投资分析必备知识...
- ZBrush中的法线贴图你知道吗?
- android 带箭头提示框,三种带箭头提示框总结实例
- recover database
- 工作中可能会使用到的数据结构和算法
- Word文档在前台页面展示
热门文章
- 关于STM8S003F3P6TR
- 解决方案 | 为什么要配置mysql环境变量以及如何配置
- FastDFS的安装及上传下载(二)
- 阿特拉斯atlas扭矩枪 USB通讯教程基于MTCOM
- UGUI内核大探究(十)Layout与Fitter
- 用c语言双向循环链表,C语言实现双向循环链表
- 在vue中简单使用Luckysheet
- java修改jpg图片、mp3音频文件的后缀名
- 易语言版{大智慧/分析家/飞狐交易师}DLL插件接口开发模块(beta),自定义股票软件公式扩展函数...
- 华为linux版本wifi驱动,华为随身wifi驱动