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.

关于CCS中加载的两个CMD文件的功能的问题

如题:  现在项目倒是很稳定,但是我想深入的了解和应用DSP ,型号是2808,在工程中加载了两个CMD文件,到现在位置还不明白是什么功能,意思是什么?而且里面的内容也不一样,为什么?

   DSP280x_Headers_nonBIOS.cmd  和 F2808_nonBIOS_flash. cmd  

  谢谢。

  • 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

  • 非常感谢eric的细心解答。我现在对我现在的问题基本有些了解了。 再次感谢

  • 飘过,学习了

  • Eric 您好,

           看到此贴,有个问题请教您,在CCS中,配置选项里边,有一个Linker comand file ,这个选项,只能指定一个链接文件,即cmd文件,请问如果工程中有两个cmd文件,是如何在工程中进行指定呢?