DSP28335CMD文件资料解读汇报映射关系文档格式.docx

上传人:b****5 文档编号:18595697 上传时间:2022-12-29 格式:DOCX 页数:27 大小:992.41KB
下载 相关 举报
DSP28335CMD文件资料解读汇报映射关系文档格式.docx_第1页
第1页 / 共27页
DSP28335CMD文件资料解读汇报映射关系文档格式.docx_第2页
第2页 / 共27页
DSP28335CMD文件资料解读汇报映射关系文档格式.docx_第3页
第3页 / 共27页
DSP28335CMD文件资料解读汇报映射关系文档格式.docx_第4页
第4页 / 共27页
DSP28335CMD文件资料解读汇报映射关系文档格式.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

DSP28335CMD文件资料解读汇报映射关系文档格式.docx

《DSP28335CMD文件资料解读汇报映射关系文档格式.docx》由会员分享,可在线阅读,更多相关《DSP28335CMD文件资料解读汇报映射关系文档格式.docx(27页珍藏版)》请在冰豆网上搜索。

DSP28335CMD文件资料解读汇报映射关系文档格式.docx

XintfRegsFile 

XINTF, 

CpuTimer0RegsFile:

CPU_TIMER0, 

......

}

红字体代码的作用就是,通过SECTIONS伪指令把CpuTimer0RegsFile数据段装载到名称为CPU_TIMER0的存储空间。

同样在DSP2833x_Headers_nonBIOS.cmd文件里找到如下代码:

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_nonBIOS.cmd文件做一下解读,后续再分别解读一下CMD用于调试和烧写时需要注意哪些问题。

另外有关volatile关键字的解读可参考blog.sina../s/blog_762cf5f80101aosq.html

本文原创,与同样在努力学习DSP的你共享~

如有错,请指出~O(∩_∩)O谢谢

在nonBIOS情况下,CMD文件不外乎就三个:

28335_RAM_lnk.cmd(用于仿真调试) 

、 

DSP2833x_Headers_nonBIOS.cmd 

F28335.cmd(用于flash烧写)。

仿真调试时只用前两个,用于flash烧写时只用后两个,且不管在何种方式下28335_RAM_lnk.cmd和F28335.cmd不能同时用,也不能代替用。

在DSP28335—CMD文件解读

(1)中,已经介绍过DSP2833x_Headers_nonBIOS.cmd 

在用28335_RAM_lnk.cmd时,一般情况下直接用TI给的,不需要做修改即可满足调试用,模式较固定,当然你也可以做相应的修改用到哪块RAM存储空间,在CMD文件里做相应的分配即可。

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 

codestart 

BEGIN, 

PAGE=0

ramfuncs 

RAML, 

PAGE=0 

.text 

.cinit 

.pinit 

.switch 

.stack 

RAMM, 

.ebss 

RAMH, 

.econst 

PAGE=1 

.esysmem 

IQmath 

IQmathTables 

IQTABLES, 

PAGE=0,TYPE=NOLOAD

IQmathTables2 

IQTABLES2,PAGE=0,TYPE=NOLOAD

FPUmathTables 

FPUTABLES,PAGE=0,TYPE=NOLOAD

ZONE7DATA 

ZONE7B, 

ZONE6DATA 

ZONE6B, 

.reset 

RESET, 

PAGE=0,TYPE=DSECT

csm_rsvd 

CSM_RSVD 

csmpasswds 

CSM_PWL 

.adc_cal 

load=ADC_CAL, 

而编写用于flash烧写的F28335.cmd文件时相对来说较复杂些,根据不同的情况需要做一些修改。

1不需要把部分代码copy到RAM里,一般情况不需要外扩RAM等时直接用TI的F28335.cmd即可。

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

全局和静态变量

.ebss

长调用的全局或静态变量

.stack

堆栈空间

.sysmem

malloc函数产生的存

.esysmem

far_malloc函数产生的存

一旦编译器生成的这些段,连接器会从各个源文件中取出这些段,并结合它们来创建一个输出文件。

连接器命令文件(.cmd)就是用来告诉连接器去哪里找这些段的。

初始化段必须分配到非易失性存储器,如flash/ROM,当电源被撤除时,程序不会消失。

未初始化的段可以被分配到RAM中,因为它们是在代码执行期间被初始化的。

关于更多编译段和连接的信息,请参见:

《TMS320C28xAssemblyLanguage

ToolsUser’sGuide》(SPRU513)和《theTMS320C28xOptimizingC/C++CompilerUser’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的几个文件,经过了CodeComposerStudio™3.3和F28xxx代码生成工具5.0.0B3版本的测试。

3.描述:

一般的程序流程是这样子的:

code_start->

wd_disable->

copy_sections->

c_int00->

mian()

这个软件流程比标准的软件流程仅仅多了调用复制代码段函数。

标准的软件流程:

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

WD_DISABLE.set1;

setto1todisableWD,elsesetto0

.refcopy_sections

.globalcode_start

***********************************************************************

*Function:

codestartsection

*

*Description:

Branchtocodestartingpoint

.sect"

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;

15..endif

2.*Func

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1