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.

关于基于TMS320F28335 flash搬移到RAM里运行实现出现的问题

我看了网上写的关于28335和2812 flash搬移到RAM里运行的方法以后,对照TI的说明,在项目中加入对应的文件,进行了试验,现在发现有下面这个问题。

我在仿真状态下使用了SCI端口,在其接收中断接收数据正常(我的程序有三个中断:定时器中断,SCI接收中断,I2c接收中断),然后按照将flash搬移到RAM里面的方法,替换CMD文件、.asm文件和.c文件,发现编译以后出现如下两个警告:
>> warning: load address of uninitialized section .const ignored
>> warning: load address of uninitialized section .switch ignored
我没有理睬,照样把程序烧到DSP里面,发现定时器中断正常,LED指示灯开关时间与仿真运行时间是一致的,但是SCI通讯无法成功,而I2C操作也是基于SCI控制的,因此无法测试出I2C是否正常。后来我在SCI中断里面加入了亮灯程序,只要DSP接收到数据就会点亮LED,仿真模式运行可行,烧写模式下flash中的程序搬运到RAM中,发现无论如何发送数据LED始终不亮,可以认为没有触发DSP的SCI中断(通讯口应该没问题)。请问各位大大这到底是什么问题,用什么方法可以解决,O(∩_∩)O谢谢。
PS:我的lib文件是TI专用的浮点库文件rts2800_fpu32_fast_supplement.lib和rts2800_fpu32.lib
下面是我的CMD文件:
MEMORY
{
PAGE 0:    /* Program Memory */
           /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */
 ZONE0       : origin = 0x004000, length = 0x001000     /* XINTF zone 0 */
 RAM_L0L1L2L3: origin = 0x008000, length = 0x004000    /* on-chip RAM */
    OTP         : origin = 0x380400, length = 0x000400     /* on-chip OTP */
    ZONE6       : origin = 0x100000, length = 0x100000     /* XINTF zone 6 */
    ZONE7A      : origin = 0x200000, length = 0x00FC00     /* XINTF zone 7 - program space */
    FLASHH      : origin = 0x300000, length = 0x008000     /* on-chip FLASH */
    FLASHG      : origin = 0x308000, length = 0x008000     /* on-chip FLASH */
    FLASHF      : origin = 0x310000, length = 0x008000     /* on-chip FLASH */
    FLASHE      : origin = 0x318000, length = 0x008000     /* on-chip FLASH */
    FLASHD      : origin = 0x320000, length = 0x008000     /* on-chip FLASH */
    FLASHC      : origin = 0x328000, length = 0x008000     /* on-chip FLASH */
    FLASHA      : origin = 0x338000, length = 0x007F80     /* on-chip FLASH */
    CSM_RSVD    : origin = 0x33FF80, length = 0x000076     /* Part of FLASHA.  Program with all 0x0000 when CSM is in use. */
    BEGIN_FLASH : origin = 0x33FFF6, length = 0x000002     /* Part of FLASHA.  Used for "boot to Flash" bootloader mode. */
    CSM_PWL     : origin = 0x33FFF8, length = 0x000008     /* Part of FLASHA.  CSM password locations in FLASHA */
    ADC_CAL     : origin = 0x380080, length = 0x000009    /* Part of TI OTP */
    IQTABLES    : origin = 0x3FE000, length = 0x000b50     /* IQ Math Tables in Boot ROM */
    IQTABLES2   : origin = 0x3FEB50, length = 0x00008c     /* IQ Math Tables in Boot ROM */ 
    FPUTABLES   : origin = 0x3FEBDC, length = 0x0006A0     /* FPU Tables in Boot ROM */
    ROM         : origin = 0x3FF27C, length = 0x000D44     /* Boot ROM */
    RESET       : origin = 0x3FFFC0, length = 0x000002     /* part of boot ROM  */
    VECTORS     : origin = 0x3FFFC2, length = 0x00003E     /* part of boot ROM  */

PAGE 1 :   /* Data Memory */
           /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */
           /* Registers remain on PAGE1                                                  */
    RAMM0       : origin = 0x000000, length = 0x000400     /* on-chip RAM block M0 */
    BOOT_RSVD   : origin = 0x000400, length = 0x000080     /* Part of M1, BOOT rom will use this for stack */
    RAMM1       : origin = 0x000480, length = 0x000380     /* on-chip RAM block M1 */
 RAML4       : origin = 0x00C000, length = 0x001000     /* on-chip RAM block L4 */
    RAML5       : origin = 0x00D000, length = 0x001000     /* on-chip RAM block L5 */
    RAML6       : origin = 0x00E000, length = 0x001000     /* on-chip RAM block L6 */
    RAML7       : origin = 0x00F000, length = 0x001000     /* on-chip RAM block L7 */
    ZONE7B      : origin = 0x20FC00, length = 0x000400     /* XINTF zone 7 - data space */
}
/**************************************************************/
/* Link all user defined sections                             */
/**************************************************************/
SECTIONS
{
/*** Code Security Password Locations ***/
    csmpasswds      : > CSM_PWL      PAGE = 0
    csm_rsvd        : > CSM_RSVD     PAGE = 0
/*** User Defined Sections ***/
    codestart       : > BEGIN_FLASH, PAGE = 0        /* Used by file CodeStartBranch.asm */
    wddisable  : > FLASHA,   PAGE = 0 
   copysections : > FLASHA,   PAGE = 0
  /* Allocate IQ math areas: */
   IQmath           : > FLASHC       PAGE = 0        /* Math Code */
   IQmathTables     : > IQTABLES,    PAGE = 0, TYPE = NOLOAD
   IQmathTables2    : > IQTABLES2,   PAGE = 0, TYPE = NOLOAD
   FPUmathTables    : > FPUTABLES,   PAGE = 0, TYPE = NOLOAD
        
   /* Allocate DMA-accessible RAM sections: */
   DMARAML4         : > RAML4,       PAGE = 1
   DMARAML5         : > RAML5,       PAGE = 1
   DMARAML6         : > RAML6,       PAGE = 1
   DMARAML7         : > RAML7,       PAGE = 1
  
   /* Allocate 0x400 of XINTF Zone 7 to storing data */
   ZONE7DATA        : > ZONE7B,      PAGE = 1
/* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */
   .adc_cal      : load = ADC_CAL,   PAGE = 0, TYPE = NOLOAD
/* .reset is a standard section used by the compiler.  It contains the */
/* the address of the start of _c_int00 for C Code.   /*
/* When using the boot ROM this section and the CPU vector */
/* table is not needed.  Thus the default type is set here to  */
/* DSECT  */
 .reset          : > RESET,       PAGE = 0, TYPE = DSECT
 vectors         : > VECTORS      PAGE = 0, TYPE = DSECT
/*** Uninitialized Sections ***/
    .stack          : > RAMM0        PAGE = 1
    .ebss           : > RAML4        PAGE = 1
    .esysmem        : > RAMM1        PAGE = 1
/*** Initialized Sections ***/                                         
   .cinit   : LOAD = FLASHA,  PAGE = 0        /* can be ROM */
                  RUN = RAM_L0L1L2L3, PAGE = 0     /* must be CSM secured RAM */
                  LOAD_START(_cinit_loadstart),
                  RUN_START(_cinit_runstart),
                  SIZE(_cinit_size)
 .const   :   LOAD = FLASHC,   PAGE = 0        /* can be ROM */
                  RUN = RAM_L0L1L2L3, PAGE = 0        /* must be CSM secured RAM */
                  LOAD_START(_const_loadstart),
                  RUN_START(_const_runstart),
                  SIZE(_const_size)
 .econst   :   LOAD = FLASHA,   PAGE = 0        /* can be ROM */
                  RUN = RAM_L0L1L2L3, PAGE = 0        /* must be CSM secured RAM */
                  LOAD_START(_econst_loadstart),
                  RUN_START(_econst_runstart),
                  SIZE(_econst_size)
 .pinit   :   LOAD = FLASHA,   PAGE = 0        /* can be ROM */
                  RUN = RAM_L0L1L2L3, PAGE = 0        /* must be CSM secured RAM */
                  LOAD_START(_pinit_loadstart),
                  RUN_START(_pinit_runstart),
                  SIZE(_pinit_size)
 .switch   :   LOAD = FLASHD,   PAGE = 0        /* can be ROM */
                  RUN = RAM_L0L1L2L3, PAGE = 0        /* must be CSM secured RAM */
                  LOAD_START(_switch_loadstart),
                  RUN_START(_switch_runstart),
                  SIZE(_switch_size)
 .text   :   LOAD = FLASHA,   PAGE = 0        /* can be ROM */
                  RUN = RAM_L0L1L2L3, PAGE = 0        /* must be CSM secured RAM */
                  LOAD_START(_text_loadstart),
                  RUN_START(_text_runstart),
                  SIZE(_text_size)
}
  • 这两个waring,您可以不理睬。因为可能您在程序中,没有用到这两个section,或者没有定义

    _const_loadstart 和 switch_loadstart

    >> warning: load address of uninitialized section .const ignored

    >> warning: load address of uninitialized section .switch ignored

    具体为什么没有进中断,还是需要您逐步调试,看看是否进入了什么非法中断,程序停在什么位置了。

    具体是哪条语句导致进入了非法中断。

    还是需要您单步调试。

  • 另外,这个例子是将所有Section都copy到Ram中执行,其实真正的程序没有必要。

    只需要对相应的重要的代码,也就是.text段copy到RAM中已经足够,而且可以只copy一段程序,也没有必要将整个text段copy,除非楼主的RAM实在太大了,不用浪费了,可以考虑。

    还有,此方法的copy是在程序启动前copy的,并不是用memcopy整个语句执行的,楼主也可以考虑尝试一下此语句,具体例子可以参考FlashInit()函数的copy.

  • 您好,我的程序里面用到了switch语句,而且_const_loadstart 和 switch_loadstart两个都有定义如下:

    .global _const_loadstart, _const_runstart, _const_size

    .global _switch_loadstart, _switch_runstart, _switch_size

    然后在asm文件里面写了如

    copy_sections:

    MOVL XAR5,#_const_size ; Store Section Size in XAR5

    MOVL ACC,@XAR5 ; Move Section Size to ACC

    MOVL XAR6,#_const_loadstart ; Store Load Starting Address in XAR6

    MOVL XAR7,#_const_runstart ; Store Run Address in XAR7

    LCR  copy ; Branch to Copy

    另外,我不清楚要怎么样在烧入DSP后,怎么样进行单步调试

  • 我的程序里面有很多部分对时间比较敏感,如果只是拷贝一部分出来,发现程序调用的那一部分还是没有拷贝到RAM中,而是在FLASH中运行,会导致中断服务程序跑不完。例如这样的程序:

    A()

    {

    B();

    C();

    D();

    ……

    }

    我用#pragma和memcopy配合,把A()拷贝到RAM里面,但是B(),C()的程序并未拷贝进去,同时我发现,即使我把A(),B(),C()……用memcopy全部拷贝到RAM,运行速度也会比仿真的时候慢。因此,我只能把整个.text拷贝到RAM中执行,这样程序运行速度和仿真没什么区别。

  • 我的程序里面有很多部分对时间比较敏感,如果只是拷贝一部分出来,发现程序调用的那一部分还是没有拷贝到RAM中,而是在FLASH中运行,会导致中断服务程序跑不完。例如这样的程序:

    A()

    {

    B();

    C();

    D();

    ……

    }

    我用#pragma和memcopy配合,把A()拷贝到RAM里面,但是B(),C()的程序并未拷贝进去,同时我发现,即使我把A(),B(),C()……用memcopy全部拷贝到RAM,运行速度也会比仿真的时候慢。因此,我只能把整个.text拷贝到RAM中执行,这样程序运行速度和仿真没什么区别。

  • 如果Ram大,就text段 全部copy吧。

    那2个warning,应该是你没有用switch 和  const 段,不用理会就好了。

  • 可是现在就是SCI中断进不去,接不到数据,这是怎么回事呢,我对照过仿真和烧写模式的map文件,发现基本上没什么差别

  • 您只能单步调试,看看程序具体做了些什么变化。注意观察PIE的允许,PIE的Flag等和SCI中断有关的寄存器的变化。

  • 我也遇到这个问题了,不知您解决了没