DSP28335CMD文件解读映射关系.docx
- 文档编号:24992552
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:32
- 大小:992.02KB
DSP28335CMD文件解读映射关系.docx
《DSP28335CMD文件解读映射关系.docx》由会员分享,可在线阅读,更多相关《DSP28335CMD文件解读映射关系.docx(32页珍藏版)》请在冰豆网上搜索。
DSP28335CMD文件解读映射关系
DSP28335—CMD解读〔1〕
在DSP28335工程文件里〔不用BIOS产生CMD文件〕,手写CMD文件一般有两个,在RAM里调试时用的两个CMD文件分别为DSP2833x_Headers_nonBIOSd和28335_RAM_lnkd,烧写到flash里时用的两个CMD文件分别为DSP2833x_Headers_nonBIOSd和F28335d,其中DSP2833x_Headers_nonBIOSd文件可以在所有工程文件用,主要作用是把外设存放器产生的数据段映射到对应的存储空间,可以跟DSP2833x_GlobalVariableDefs.c文件对照一下看看。
下面通过一个简单例子,比方向CpuTimer0Regs.TIM.all写数据,来解读一下CMD文件是如何把存放器里的值准确映射到所在存储器的位置的。
先在DSP2833x_GlobalVariableDefs.c文件里找到以下几行代码:
#ifdef__cplusplus
#pragmaDATA_SECTION("CpuTimer0RegsFile")
#else
#pragmaDATA_SECTION(CpuTimer0Regs,"CpuTimer0RegsFile");
#endif
volatilestructCPUTIMER_REGSCpuTimer0Regs;
由上可知CpuTimer0Regs是一个构造体变量名〔其定义在DSP2833x_CpuTimers.c文件里〕,通过预处理命令#pragma为这个构造体定义了一个名称为CpuTimer0RegsFile的数据段。
接着在DSP2833x_Headers_nonBIOSd文件里找到如下代码:
SECTIONS
{
PieVectTableFile:
>PIE_VECT, PAGE=1
DevEmuRegsFile :
>DEV_EMU, PAGE=1
FlashRegsFile :
>FLASH_REGS, PAGE=1
CsmRegsFile :
>CSM, PAGE=1
AdcMirrorFile :
>ADC_MIRROR, PAGE=1
XintfRegsFile :
>XINTF, PAGE=1
CpuTimer0RegsFile:
>CPU_TIMER0, PAGE=1
......
}
红字体代码的作用就是,通过SECTIONS伪指令把CpuTimer0RegsFile数据段装载到名称为CPU_TIMER0的存储空间。
同样在DSP2833x_Headers_nonBIOSd文件里找到如下代码:
MEMORY
{
PAGE0:
PAGE1:
DEV_EMU :
origin=0x000880,length=0x000180
FLASH_REGS :
origin=0x000A80,length=0x000060
CSM :
origin=0x000AE0,length=0x000010
ADC_MIRROR :
origin=0x000B00,length=0x000010
XINTF :
origin=0x000B20,length=0x000020
CPU_TIMER0 :
origin=0x000C00,length=0x000008
......
}
CPU_TIMER0存储空间通过MEMORY伪指令指示了其起始地址和长度,也就等于间接确定了构造体CpuTimer0Regs的具体位置,所以通过以上几层映射关系,当向CpuTimer0Regs.TIM.all写数据时就可以准确的写入DSP部存放器所在的存储器的位置。
由此看见,CMD的作用就是为程序代码和数据分配存储空间。
本节先针对DSP2833x_Headers_nonBIOSd文件做一下解读,后续再分别解读一下CMD用于调试和烧写时需要注意哪些问题。
另外有关volatile关键字的解读可参考blog.sina../s/blog_762cf5f80101aosq.html
本文原创,与同样在努力学习DSP的你共享~
如有错,请指出~O(∩_∩)O
在nonBIOS情况下,CMD文件不外乎就三个:
28335_RAM_lnkd(用于仿真调试) 、 DSP2833x_Headers_nonBIOSd 、 F28335d〔用于flash烧写〕。
仿真调试时只用前两个,用于flash烧写时只用后两个,且不管在何种方式下28335_RAM_lnkd和F28335d不能同时用,也不能代替用。
在DSP28335—CMD文件解读〔1〕中,已经介绍过DSP2833x_Headers_nonBIOSd 。
在用28335_RAM_lnkd时,一般情况下直接用TI给的,不需要做修改即可满足调试用,模式较固定,当然你也可以做相应的修改用到哪块RAM存储空间,在CMD文件里做相应的分配即可。
MEMORY
{
PAGE0:
BEGIN :
origin=0x000000,length=0x000002
BOOT_RSVD :
origin=0x000002,length=0x00004E
RAMM0 :
origin=0x000050,length=0x0003B0
RAML :
origin=0x008000,length=0x004000
ZONE7A :
origin=0x200000,length=0x00FC00
CSM_RSVD :
origin=0x33FF80,length=0x000076
CSM_PWL :
origin=0x33FFF8,length=0x000008
ADC_CAL :
origin=0x380080,length=0x000009
RESET :
origin=0x3FFFC0,length=0x000002
IQTABLES :
origin=0x3FE000,length=0x000b50
IQTABLES2 :
origin=0x3FEB50,length=0x00008c
FPUTABLES :
origin=0x3FEBDC,length=0x0006A0
BOOTROM :
origin=0x3FF27C,length=0x000D44
PAGE1:
RAMM :
origin=0x000400,length=0x000400
RAMH :
origin=0x00C000,length=0x004000
ZONE6B :
origin=0x13FC00,length=0x000400
ZONE7B :
origin=0x20FC00,length=0x000400
}
SECTIONS
{
codestart :
>BEGIN, PAGE=0
ramfuncs :
>RAML, PAGE=0
.text :
>RAML, PAGE=0
.cinit :
>RAML, PAGE=0
.pinit :
>RAML, PAGE=0
.switch :
>RAML, PAGE=0
.stack :
>RAMM, PAGE=1
.ebss :
>RAMH, PAGE=1
.econst :
>RAMH, PAGE=1
.esysmem :
>RAMM, PAGE=1
IQmath :
>RAML, PAGE=0
IQmathTables :
>IQTABLES, PAGE=0,TYPE=NOLOAD
IQmathTables2 :
>IQTABLES2,PAGE=0,TYPE=NOLOAD
FPUmathTables :
>FPUTABLES,PAGE=0,TYPE=NOLOAD
ZONE7DATA :
>ZONE7B, PAGE=1
ZONE6DATA :
>ZONE6B, PAGE=1
.reset :
>RESET, PAGE=0,TYPE=DSECT
csm_rsvd :
>CSM_RSVD PAGE=0,TYPE=DSECT
csmpasswds :
>CSM_PWL PAGE=0,TYPE=DSECT
.adc_cal :
load=ADC_CAL, PAGE=0,TYPE=NOLOAD
}
而编写用于flash烧写的F28335d文件时相对来说较复杂些,根据不同的情况需要做一些修改。
1不需要把局部代码copy到RAM里,一般情况不需要外扩RAM等时直接用TI的F28335d即可。
2需要把局部代码从flash复制到RAM里,如延时函数DSP2833x_usDelay.asm等,这时CMD文件需要做相应的修改,具体参考博文:
blog.sina../s/blog_762cf5f80101asmq.html
3从时间开销方面考虑,需要把整个程序从flash复制到RAM里,这时程序及CMD文件都要做相应的修改,具体参考博文blog.sina../s/blog_762cf5f80101apfx.html
翻译自TI应用手册SPRAAU8
摘要
这个应用报告和相关的代码提供了一种把编译后的程序段从TMS320F28xxx的flash复制到ram的功能,这样可以提高代码的运行速度。
这个解决方案在直接启动之后,进入c_int00——C语言代码运行之前实现此功能。
本应用报告中所讨论的工程容和源代码可以从以下网址下载:
-s.ti./sc/techlit/spraau8.zip
1.引言:
在许多应用中,代码的执行速度是至关重要的。
例如在医疗,监控,电机控制等等一些对时间有严格要求的终端设备。
许多应用使用TMS320F28xxxDSCs是因为它的置flash储存器。
置flash是TMS320F28xxx的一个优势,因为它使得设计者不需要外接flash来储存代码。
使用部flash缺点是访问Flash需要等待状态,这使得程序的运行变慢。
在大多数应用中,这不是一个问题。
其他一些应用中可能会为了获得最高的运行速度要求无等待状态。
部RAM存储器具有零等待状态,它是易失性存储器。
所以,引导的初始化代码段不可以存储在此存储器中。
现在提供的解决方案,使得设计者能够在运行时把被编译器初始化的代码段从flash复制到ram里,获得最大的运行速度。
这使代码执行从多达15个等待状态的提升到0等待状态。
另一种解决方案是只将某些函数从Flash复制到RAM。
详见:
?
RunninganApplicationfromInternalFlashMemoryontheTMS320F28xxDSP?
(SPRA958)。
这种方法应该使用在大多数使用C2000™DSC的应用上,其他要求严格的时序和连续的零等待状态的应用程序应采用这里提出的解决方案。
编写汇编程序来完成代码从Flash到RAM的复制。
该汇编代码在复位向量后调用c_int00之前执行。
这保证了在c_int00调用mian〔〕之前完成复制。
有一些工程比拟小,可以把所有初始化了的段都复制到ram。
然而,其他一些工程的初始化了的段比所有的部ram还要大。
这些工程可能不可以把所有的初始化了的段都复制到ram,但是用这种方法复制其中一局部段。
2.编译的代码段:
编译器生成的包含代码和数据的多个局部,称为段。
这下段被分为两个不同的组:
初始化了的和没被初始化的,初始化的局部是由所有的代码,常量和初始化表组成的。
下表列出了由编译器产生的初始化段。
初始化段
段名
容
限制
.cinit
显式初始化的全局变量和静态变量表
代码
.const
显式初始化的全局和静态的const变量和字符串常量
不超过64K长度
.econst
长调用的常量
数据中的任何地方
.pinit
全局对象的构造函数表
代码
.switch
switch语句产生的表
代码或者数据
.text
可执行代码和常数
代码
没初始化的段是由未初始化的变量,堆栈和malloc产生的存。
下表列出了由编译器产生的没初始化段。
没初始化段
段名
容
限制
.bss
全局和静态变量
不超过64K长度
.ebss
长调用的全局或静态变量
数据中的任何地方
.stack
堆栈空间
不超过64K长度
.sysmem
malloc函数产生的存
不超过64K长度
.esysmem
far_malloc函数产生的存
数据中的任何地方
一旦编译器生成的这些段,连接器会从各个源文件中取出这些段,并结合它们来创立一个输出文件。
连接器命令文件〔d〕就是用来告诉连接器去哪里找这些段的。
初始化段必须分配到非易失性存储器,如flash/ROM,当电源被撤除时,程序不会消失。
未初始化的段可以被分配到RAM中,因为它们是在代码执行期间被初始化的。
关于更多编译段和连接的信息,请参见:
?
TMS320C28xAssemblyLanguage
ToolsUser’sGuide?
(SPRU513)和?
theTMS320C28xOptimizingC/C++pilerUser’sGuide?
(SPRU514)。
仪器〔TI〕提供了多个例子显示如何使用器命令文件分配编译段。
其中一个就是?
RunninganApplicationfromInternalFlashMemoryontheTMS320F28xxDSP?
(SPRA958)。
此应用文档提供的例子,演示了使用基于RAM和Flash的工程的器命令文件。
3.软件:
本应用文档相关的代码文件,包括修改后的版本的CodeStartBranch.asm文件和非DSP/BIOS™工程用的文件DSP28xxx_SectionCopy_nonBIOS.asm,由theC/C++HeaderFilesandPeripheralExamples提供。
每个TMS320F28xxx处理器都提供了现成的连接器命令文件。
提供的例如工程演示了如何使用这些文件。
本应用文档以TMS320F2808为例。
该软件独立存放于F28xxx_Flash_to_Ram文件夹中。
代码使用的来自theC/C++HeaderFilesandPeripheralExamples的几个文件,经过了CodeposerStudio™3.3和F28xxx代码生成工具5.0.0B3版本的测试。
3.描述:
一般的程序流程是这样子的:
code_start->wd_disable->copy_sections->c_int00->mian〔〕
。
这个软件流程比标准的软件流程仅仅多了调用复制代码段函数。
标准的软件流程:
code_start->wd_disable->c_int00->mian〔〕。
程序开场和关闭看门狗:
code_start和wd_disable的运行代码由DSP28xxx_CodeStartBranch.asm文件提供。
上电后,code_start正常执行,因为它被分配给Flash的引导地址的0x3F7FF6。
详见:
?
RunninganApplicationfromInternalFlashMemoryontheTMS320F28xxDSP
?
(SPRA958)
1.WD_DISABLE.set1;setto1todisableWD,elsesetto0
2..refcopy_sections
3..globalcode_start
4.***********************************************************************
5.*Function:
codestartsection
6.*
7.*Description:
Branchtocodestartingpoint
8.***********************************************************************
9..sect"codestart"
10.
11.code_start:
12..ifWD_DISABLE==1
13.LBwd_disable;Branchtowatchdogdisablecode
14..else
15.LBcopy_sections;Branchtocopy_sections
16..endif
1.WD_DISABLE.set1;setto1todisableWD,elsesetto0
2..refcopy_sections
3..globalcode_start
4.***********************************************************************
5.*Function:
codestartsection
6.*
7.*Description:
Branchtocodestartingpoint
8.***********************************************************************
9..sect"codestart"
10.
11.code_start:
12..ifWD_DISABLE==1
13.LBwd_disable;Branchtowatchdogdisablecode
14..else
15.LBcopy_sections;Branchtocopy_sections
16..endif
WD_DISABLE.set1;setto1todisableWD,elsesetto0
.refcopy_sections
.globalcode_start
***********************************************************************
*Function:
codestartsection
*
*Description:
Branchtocodestartingpoint
***********************************************************************
.sect"codestart"
code_start:
.ifWD_DISABLE==1
LBwd_disable;Branchtowatchdogdisablecode
.else
LBcopy_sections;Branchtocopy_sections
.endif
这个函数从theC/C++HeaderFilesandPeripheralExamples提供的CodeStartBranch.asm文件修改而来,只是第二个调用用copy_sections代替了_c_int00。
这个调用仅仅在WD_DISABLE为0时执行。
上面的代码,WD_DISABLE被设置为1。
这使得wd_disable运行。
wd_disable的代码如下:
1.***********************************************************************
2.*Function:
wd_disable
3.*
4.*Description:
Disablesthewatchdogtimer
5.***********************************************************************
6..ifWD_DISABLE==1
7..sect"wddisable"
8.wd_disable:
9.SETCOBJMODE;SetOBJMODEfor28xobjectcode
10.EALLOW;EnableEALLOWprotectedregisteraccess
11.MOVZDP,#7029h>>6;SetdatapageforWDCRregister
12.MOV7029h,#0068h;SetWDDISbitinWDCRtodisableWD
13.EDIS;DisableEALLOWprotectedregisteraccess
14.LBcopy_sections;Branchtocopy_sections
15..endif
1.***********************************************************************
2.*Function:
wd_disable
3.*
4.*Description:
Disablesthewatchdogtimer
5.********************************************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP28335CMD 文件 解读 映射 关系
![提示](https://static.bdocx.com/images/bang_tan.gif)