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.

Adding more variables lead to wrong running results for 28335 DSp

Hello, 

I am using 28335 DSP and CCS3.3. Now when I am trying to add more float variables to current code, then I found the whole program just get different/unexpected results. Even I just defined these variables, but didn't use them in the main program. It still cause problem.

Once I deleted these new variables, the code just became correct. And there is no any warning or error message, I can successfully build the code without any warning/error. I also checked the space for .ebss, which is linked to RAML4 and it's big enough, still have a lot of unused space.

If I use DATA_SECTION to locate the new added variable to some other place, e.g. RAML5, looks the code becomes correct. Could anyone give me some idea about what's the possible problem? 

It really drive me craze. Below is my .cmd file. Thanks

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 */
RAML0 : origin = 0x008000, length = 0x004000 /* on-chip RAM block L0 */
//RAML1 : origin = 0x009000, length = 0x001000 /* on-chip RAM block L1 */
//RAML2 : origin = 0x00A000, length = 0x001000 /* on-chip RAM block L2 */
//RAML3 : origin = 0x00B000, length = 0x001000 /* on-chip RAM block L3 */
ZONE6 : origin = 0x0100000, length = 0x100000 /* XINTF zone 6 */
ZONE7A : origin = 0x0200000, 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 : 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 */
OTP : origin = 0x380400, length = 0x000400 /* on-chip OTP */
ADC_CAL : origin = 0x380080, length = 0x000009 /* ADC_cal function in Reserved memory */

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 */

BOOT_RSVD : origin = 0x000000, length = 0x000050 /* Part of M0, BOOT rom will use this for stack */
RAMM0 : origin = 0x000050, length = 0x0003B0 /* on-chip RAM block M0 */
RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
RAML4 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L1 */
RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */
RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */
ZONE7B : origin = 0x20FC00, length = 0x000400 /* XINTF zone 7 - data space */
FLASHB : origin = 0x330000, length = 0x008000 /* on-chip FLASH */
//ST: 28335 has 32k*16 embedded flash memory, segregated to total 8 32k*16 secotrs, address from 0x300000 to 0x33FFF8
// here FlashB is used as Data memory, other parts are used as program memory
}

/* Allocate sections to memory blocks.
Note:
codestart user defined section in DSP28_CodeStartBranch.asm used to redirect code
execution when booting to flash
ramfuncs user defined section to store functions that will be copied from Flash into RAM
*/

SECTIONS
{

/* Allocate program areas: */
.cinit : > FLASHA PAGE = 0
.pinit : > FLASHA, PAGE = 0
.text : > FLASHA PAGE = 0
codestart : > BEGIN PAGE = 0
ramfuncs : LOAD = FLASHD,
RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0

csmpasswds : > CSM_PWL PAGE = 0
csm_rsvd : > CSM_RSVD PAGE = 0

/* Allocate uninitalized data sections: */
.stack : > RAMM1 PAGE = 1
.ebss : > RAML4 PAGE = 1
.esysmem : > RAMM1 PAGE = 1

/* Initalized sections go in Flash */
/* For SDFlash to program these, they must be allocated to page 0 */
.econst : > FLASHA PAGE = 0
.switch : > FLASHA PAGE = 0

/* Allocate IQ math areas: */
IQmath : > FLASHC PAGE = 0 /* Math Code */
IQmathTables : > IQTABLES, PAGE = 0, TYPE = NOLOAD

/* Uncomment the section below if calling the IQNexp() or IQexp()
functions from the IQMath.lib library in order to utilize the
relevant IQ Math table in Boot ROM (This saves space and Boot ROM
is 1 wait-state). If this section is not uncommented, IQmathTables2
will be loaded into other memory (SARAM, Flash, etc.) and will take
up space, but 0 wait-state is possible.
*/
/*
IQmathTables2 : > IQTABLES2, PAGE = 0, TYPE = NOLOAD
{

IQmath.lib<IQNexpTable.obj> (IQmathTablesRam)

}
*/

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

/* .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

/* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */
.adc_cal : load = ADC_CAL, PAGE = 0, TYPE = NOLOAD
.angles_ffm1 : load = FLASHC, PAGE = 0, ALIGN(2)
.angles_ffm2 : load = FLASHD, PAGE = 0, ALIGN(2)
}

/*
//===========================================================================
// End of file.
//===========================================================================
*/

  • Suggestion: Build the project so that it will run incorrectly as you described. Save the .map file.
    Then build it with the problem variables placed in RAML5. Save the .map file.

    Compare the two .map files. This may give a clue.

    Play attention to the map file where the code runs wrong. Look at things allocated around the address of the problem variables. See if that rings a bell.
  • I also noticed that your DMA RAM includes RAML4 as well. Are you using DMA? Maybe some conflict between DMA use of RAM and your variables use of RAM?
  • Hello Quark, thanks for your reply. DMA RAM did include RAML4, but I didn't use DMA at all. I didn't initialize DMA, so I suppose the DMA should be inactive.

    Also I have tried to assign both DMARAML4 and DMARAML5 to RAML5, therefore, reserve RAML4 only for .ebss as shown below
    DMARAML4 : > RAML5, PAGE = 1
    DMARAML5 : > RAML5, PAGE = 1
    still doesn't work.
  • I have tried to compare the .map file, unfortunately, it's hard to tell which variable/code run incorrectly. Right now, the DSP controller is running for high voltage/high power equipment, the whole control system is kind of complicated. Even we know the system is running incorrectly, but it's hard to find which variable or code has problem. Thanks
  • One thing I forgot to mention is that the interrupt adc_isr is copied from Flash to RAM for faster running speed:

    #pragma CODE_SECTION(adc_isr,  "ramfuncs");             

    ramfuncs is located at  RAML0

    RAML0 : origin = 0x008000, length = 0x004000 /* on-chip RAM block L0 */
    //RAML1 : origin = 0x009000, length = 0x001000 /* on-chip RAM block L1 */
    //RAML2 : origin = 0x00A000, length = 0x001000 /* on-chip RAM block L2 */
    //RAML3 : origin = 0x00B000, length = 0x001000 /* on-chip RAM block L3 */

     

  • Shuitao Yang said:
    I am using 28335 DSP and CCS3.3. Now when I am trying to add more float variables to current code, then I found the whole program just get different/unexpected results.

    I would check for a newer compiler version.  I recall a compiler bug that sounds like what you describe.

  • I finally found the problem yesterday. The problem was caused by two variables (float type) without initializing. 

    A stupid mistake I made.....take two days to struggle with it.

    Thank you all for your reply.