zhanggan009 发表于 2019-6-24 15:34

有关F2812的cmd文件的疑惑

本帖最后由 zhanggan009 于 2019-6-24 15:51 编辑

各位大侠好!
      最近正在写一个通过USB口更新DSP的固件的程序。刚开始就碰到了问题。运行官方的例子是没问题的。但我自己稍微修正一下就可能出错,现在只能几句几句的增加。非常困惑,主要体现在以下几个方面。

基本的CMD文件的部分,这样是正常的:
PAGE 0:    /* Program Memory */
         /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */

   ZONE0       : origin = 0x002000, length = 0x002000   /* XINTF zone 0 */
   ZONE1       : origin = 0x004000, length = 0x002000   /* XINTF zone 1 */
   RAML0       : origin = 0x008000, length = 0x001000   /* on-chip RAM block L0 */
   RAML1       : origin = 0x009000, length = 0x001000   /* on-chip RAM block L1 */
   ZONE2       : origin = 0x080000, length = 0x080000   /* XINTF zone 2 */
   ZONE6       : origin = 0x100000, length = 0x080000   /* XINTF zone 6 */
   OTP         : origin = 0x3D7800, length = 0x000800   /* on-chip OTP */
   FLASHJ      : origin = 0x3D8000, length = 0x002000   /* on-chip FLASH */
   FLASHI      : origin = 0x3DA000, length = 0x002000   /* on-chip FLASH */
   FLASHH      : origin = 0x3DC000, length = 0x004000   /* on-chip FLASH */
   FLASHG      : origin = 0x3E0000, length = 0x004000   /* on-chip FLASH */
   FLASHF      : origin = 0x3E4000, length = 0x004000   /* on-chip FLASH */
   FLASHE      : origin = 0x3E8000, length = 0x004000   /* on-chip FLASH */
   FLASHD      : origin = 0x3EC000, length = 0x004000   /* on-chip FLASH */
   FLASHC      : origin = 0x3F0000, length = 0x004000   /* on-chip FLASH */
   FLASHB      : origin = 0x3F4000, length = 0x002000   /* on-chip FLASH */
   FLASHA      : origin = 0x3F6000, length = 0x001F80   /* on-chip FLASH */
   CSM_RSVD    : origin = 0x3F7F80, length = 0x000076   /* Part of FLASHA.Program with all 0x0000 when CSM is in use. */
   BEGIN       : origin = 0x3F7FF6, length = 0x000002   /* Part of FLASHA.Used for "boot to Flash" bootloader mode. */
   CSM_PWL   : origin = 0x3F7FF8, length = 0x000008   /* Part of FLASHA.CSM password locations in FLASHA */
......
Flash28_API:
   {
      -lFlash2812_API_V210.lib(.econst)
      -lFlash2812_API_V210.lib(.text)
   }                   LOAD = FLASHD,
                     RUN = RAML0,
                     LOAD_START(_Flash28_API_LoadStart),
                     LOAD_END(_Flash28_API_LoadEnd),
                     RUN_START(_Flash28_API_RunStart),
                     PAGE = 0

ramfuncs            : LOAD = FLASHD,
                         RUN = RAML1,
                         LOAD_START(_RamfuncsLoadStart),
                         LOAD_END(_RamfuncsLoadEnd),
                         RUN_START(_RamfuncsRunStart),
                         PAGE = 0

.cinit            : > FLASHA      PAGE = 0
   .pinit            : > FLASHA,   PAGE = 0
   .text               : > FLASHA      PAGE = 0
   .econst             : > FLASHA      PAGE = 0
   .switch             : > FLASHA      PAGE = 0
   IQmath            : > FLASHC      PAGE = 0                  /* Math Code */
   IQmathTables      : > ROM         PAGE = 0, TYPE = NOLOAD   /* Math Tables In ROM */

.........

对应的map文件的部分内容如下:
PAGE 0:ZONE0               00002000   00002000 0000000000002000RWIXZONE1               00004000   00002000 0000000000002000RWIXRAML0               00008000   00001000 0000057500000a8bRWIXRAML1               00009000   00001000 000001ab00000e55RWIXZONE2               00080000   00080000 0000000000080000RWIXZONE6               00100000   00080000 0000000000080000RWIXOTP                   003d7800   00000800 0000000000000800RWIXFLASHJ                003d8000   00002000 0000000000002000RWIXFLASHI                003da000   00002000 0000000000002000RWIXFLASHH                003dc000   00004000 0000000000004000RWIXFLASHG                003e0000   00004000 0000000000004000RWIXFLASHF                003e4000   00004000 0000000000004000RWIXFLASHE                003e8000   00004000 0000000000004000RWIXFLASHD                003ec000   00004000 00000720000038e0RWIXFLASHC                003f0000   00004000 0000000000004000RWIXFLASHB                003f4000   00002000 0000000000002000RWIXFLASHA                003f6000   00001f80 0000136500000c1bRWIXCSM_RSVD            003f7f80   00000076 0000000000000076RWIXBEGIN               003f7ff6   00000002 0000000200000000RWIXCSM_PWL               003f7ff8   00000008 0000000000000008RWIXROM                   003ff000   00000fc0 0000000000000fc0RWIXRESET               003fffc0   00000002 0000000000000002RWIXVECTORS               003fffc2   0000003e 000000000000003eRWIX
PAGE 1:RAMM0               00000000   00000400 0000040000000000RWIXRAMM1               00000400   00000400 0000040000000000RWIXDEV_EMU               00000880   00000180 000000d6000000aaRWIX FLASH_REGS         00000a80   0000006000000008 00000058RWIXCSM                   00000ae0   00000010 0000001000000000RWIXXINTF               00000b20   00000020 0000002000000000RWIX CPU_TIMER0         00000c00   0000000800000008 00000000RWIX CPU_TIMER1         00000c08   0000000800000008 00000000RWIX CPU_TIMER2         00000c10   0000000800000008 00000000RWIXPIE_CTRL            00000ce0   00000020 0000001a00000006RWIXPIE_VECT            00000d00   00000100 0000010000000000RWIXECAN_A                00006000   00000100 00000034000000ccRWIX ECAN_AMBOX            00006100   00000100 0000010000000000RWIXSYSTEM                00007010   00000020 0000002000000000RWIXSPI_A               00007040   00000010 0000001000000000RWIXSCI_A               00007050   00000010 0000001000000000RWIXXINTRUPT            00007070   00000010 0000001000000000RWIXGPIOMUX               000070c0   00000020 0000002000000000RWIXGPIODAT               000070e0   00000020 0000002000000000RWIXADC                   00007100   00000020 0000001a00000006RWIXEV_A                  00007400   00000040 000000320000000eRWIXEV_B                  00007500   00000040 000000320000000eRWIXSCI_B               00007750   00000010 0000001000000000RWIXMCBSP_A               00007800   00000040 000000250000001bRWIXCSM_PWL               003f7ff8   00000008 0000000800000000RWIXRAMH0               003f8000   00002000 00000e7d00001183RWIX

随着代码的增加,flashA不够用了。我稍微一修改就错了,程序就会停在0x003FFC00这个地址附近,不再动作,可是这个区域从map文件中看是没有使用的。
修改比如:
1.扩大FLASHA

/*   FLASHB      : origin = 0x3F4000, length = 0x002000 */    /* on-chip FLASH */
   FLASHA      : origin = 0x3F4000, length = 0x003F80   /* on-chip FLASH */
2.或将上述5个使用FLASHA的段,部分定义到其他段
3.或只将.text指向其他FLASH区,哪怕根本没有占用多少字节,理解就运行不下去了。
以上三种修改立即就要出错,程序就会停在0x003FFC00这个地址附近,不再动作,实在是让人无法理解。

后来又发觉,当擦除SECTORA的时候会出错,我只能躲开FLASHA,擦除SECTORC又能成功了。

还请各位高手,指点一下小弟。

zhangmangui 发表于 2019-6-24 23:31

首先对应CMD和手册中memory映射对应看    不同的其实地址 不同的大小等
看看你新加的是否超了或者重复等
页: [1]
查看完整版本: 有关F2812的cmd文件的疑惑