This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Lei,
DSP280x_Headers_nonBIOS.cmd 里面包含了所有的外设寄存器的映射地址,应该跟DSP280x_GlobalVariableDefs.c搭配来看。就是工程中定义了一些寄存器,通过这两个文件映射到物理地址。
F2808_nonBIOS_flash. cmd 则是分配存储空间的,包括Flash, RAM,这里面就设计到memory block(存储块),section(段)的概念。memory block就是PAGE0, PAGE1定义的那些,将存储空间划分成一块一块,然后再section再跟这些块映射起来。而CCS编译会有许多默认的section,如.text段,即所有的代码都会编译在这个段,.ebss即所有的变量都会分配到这个段中,因此代码和变量就能分配到相应的存储空间。
Eric
非常感谢 Eric 的解答,对于CMD文件,我还想再请教您其他问题:
DSP280x_Headers_nonBIOS.cmd
MEMORY
{
PAGE 0: /* Program Memory */
PAGE 1: /* Data Memory */
DEV_EMU : origin = 0x000880, length = 0x000180 /* device emulation registers */
FLASH_REGS : origin = 0x000A80, length = 0x000060 /* FLASH registers */
CSM : origin = 0x000AE0, length = 0x000010 /* code security module registers */
ADC_MIRROR : origin = 0x000B00, length = 0x000010 /* ADC Results register mirror */
CPU_TIMER0 : origin = 0x000C00, length = 0x000008 /* CPU Timer0 registers */
CPU_TIMER1 : origin = 0x000C08, length = 0x000008 /* CPU Timer0 registers (CPU Timer1 & Timer2 reserved TI use)*/
CPU_TIMER2 : origin = 0x000C10, length = 0x000008
。。。。。
}
SECTIONS
{
。。。。。。
}
在这个文件中映射的硬件寄存器地址全部在page1 中,也就是说全部在数据存储器中。那为什么在F2808_nonBIOS_flash. cmd 文件中,却又对PAGE0和PAGE1做分配?还有在程序中我看到TI的文档也提到过,如果使用少些FLASH的话,需要将flash中的内容复制到ram中才能执行(不知道我是否理解的正确),这我实在不理解为什么要复制flash中的内容到ram ? 还有DSP280x_Headers_nonBIOS.cmd,硬件寄存器映射的地址为什么在PAGE1中? 总体来说,我感觉我现在都不知道DSP内部的程序是如何开始启动,如何工作?对外设寄存器的操作是在那里执行? 问题有点乱,还望您见谅,因为之前使用时都是在例程上修改,现在想深入的了解才有了这么多问题。再次谢谢您。。
memcpy( &secureRamFuncs_runstart,&secureRamFuncs_loadstart,&secureRamFuncs_loadend - &secureRamFuncs_loadstart);
MEMORY
{
PAGE 0: /* Program Memory */
BEGIN_M0 : origin = 0x000000, length = 0x000002 /* Part of M0SARAM. Used for "Boot to M0" bootloader mode. */
L0SARAM : origin = 0x008000, length = 0x001000 /* 4Kw L0 SARAM */
H0SARAM : origin = 0x00A002, length = 0x002000 /* 8Kw H0 SARAM */
OTP : origin = 0x3D7800, length = 0x000400 /* 1Kw OTP */
FLASH_ABCD : origin = 0x3E8000, length = 0x00FF80 /* 64kW FLASH, Sectors A, B, C, and D combined */
CSM_RSVD : origin = 0x3F7F80, length = 0x000076 /* Part of FLASH Sector A. Reserved when CSM is in use. */
BEGIN_FLASH : origin = 0x3F7FF6, length = 0x000002 /* Part of FLASH Sector A. Used for "boot to flash" bootloader mode. */
PASSWORDS : origin = 0x3F7FF8, length = 0x000008 /* Part of FLASH Sector A. CSM password locations. */
IQTABLES : origin = 0x3FF000, length = 0x000B50 /* Part of Boot ROM */
BOOTROM : origin = 0x3FFB50, length = 0x000470 /* 4Kw Boot ROM */
RESET : origin = 0x3FFFC0, length = 0x000002 /* part of Boot ROM */
PAGE 1 : /* Data Memory */
M0SARAM : origin = 0x000002, length = 0x0003FE /* 1Kw M0 SARAM */
M1SARAM : origin = 0x000400, length = 0x000400 /* 1Kw M1 SARAM */
L1SARAM : origin = 0x009000, length = 0x001000 /* 4Kw L1 SARAM */
}
SECTIONS
{
/*** Compiler Required Sections ***/
/* Program memory (PAGE 0) sections */
.text : > FLASH_ABCD, PAGE = 0
.cinit : > FLASH_ABCD, PAGE = 0
.const : > FLASH_ABCD, PAGE = 0
.econst : > FLASH_ABCD, PAGE = 0
.pinit : > FLASH_ABCD, PAGE = 0
.reset : > RESET, PAGE = 0, TYPE = DSECT /* We are not using the .reset section */
.switch : > FLASH_ABCD, PAGE = 0
/* Data Memory (PAGE 1) sections */
.bss : > L1SARAM, PAGE = 1
.ebss : > L1SARAM, PAGE = 1
.cio : > L1SARAM, PAGE = 1
.stack : > M1SARAM, PAGE = 1
.sysmem : > L1SARAM, PAGE = 1
.esysmem : > L1SARAM, PAGE = 1
/*** User Defined Sections ***/
codestart : > BEGIN_FLASH, PAGE = 0 /* Used by file CodeStartBranch.asm */
csm_rsvd : > CSM_RSVD, PAGE = 0 /* Used by file passwords.asm */
passwords : > PASSWORDS, PAGE = 0 /* Used by file passwords.asm */
secureRamFuncs : LOAD = FLASH_ABCD, PAGE = 0 /* Used by InitFlash() in SysCtrl.c */
RUN = L0SARAM, PAGE = 0
LOAD_START(_secureRamFuncs_loadstart),
LOAD_END(_secureRamFuncs_loadend),
RUN_START(_secureRamFuncs_runstart)
}
Lei,
其实两个CMD文件可以合成一个。TI把它分开了,一个对寄存器进行存储映射,因为同个系列的芯片寄存器都是一样的,另外一个是对Flash, Ram进行存储分配,同个系列不同芯片有不同存储,所以他们的CMD也不一样。
C2000的存储分成数据空间和程序空间,分别有数据总线和程序总线进行访问。寄存器属于数据空间,所以放在PAGE1. 另外关于为什么要把某些Flash的内容放在RAM上呢,原因并不是说Flash不够,是因为有些函数必须复制到RAM,想iniflash, 对flash操作的代码都必须运行在RAM中。另外某些控制环路复制到RAM,因为在RAM跑的比较快。
关于CMD,推荐下面链接中的第4课。
http://www.hellodsp.com/bbs/forum.php?mod=forumdisplay&fid=97
Eric