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.
Hello,
I am wanting to move codestart to another flash sector in my linker file to make space for data that will be compiled with the project. Currently the codestart is placed in FLASHD of my linker. My code begins in FLASHF, and I would like to place codestart at the beginning of FLASHF. When I move codestart from FLASHD->FLASHF in my .cmd linker file, it builds without any error or warning, but when I flash the DSP using a Blackhawk USB200 JTAG Emulator, the program will not boot. I am assuming it will not boot to the beginning of the program because the software is trying to jump to a location that no longer contains a valid address for the start of software? If this is the case, how can I move codestart from one FLASH sector to another? Below is the linker .cmd file. The .map file does place codestart at location 0x00314a79, while FLASHF has data before that location.
Linker F28335.cmd file:
MEMORY
{
PAGE 0: /* Program Memory */
/* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */
RAML0 : origin = 0x008000, length = 0x001000 /* 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 = 0x100000, length = 0x100000 /* XINTF zone 6 */
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 */
ZONE0A : origin = 0x004000, length = 0x000010 /* External ADC */
RAML4 : origin = 0x00C000, length = 0x003000 /* on-chip RAM block L1 */
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */
ZONE7A : origin = 0x200000, length = 0x03FC00 /* XINTF zone 7 - program space */
ZONE7B : origin = 0x23FC00, length = 0x0003C0 /* XINTF zone 7 - program space */
ZONE7C : origin = 0x23FFC0, length = 0x000040 /* XINTF zone 7 - program space */
FLASHB : origin = 0x330000, length = 0x008000 /* on-chip FLASH */
}
/* 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: */
/* The Flash API functions can be grouped together as shown below.
The defined symbols _Flash28_API_LoadStart, _Flash28_API_LoadEnd
and _Flash28_API_RunStart are used to copy the API functions out
of flash memory and into SARAM */
Flash28_API:
{
-lFlash28335_API_V210.lib(.econst)
-lFlash28335_API_V210.lib(.text)
} LOAD = FLASHG,
RUN = RAML0,
LOAD_START(_Flash28_API_LoadStart),
LOAD_END(_Flash28_API_LoadEnd),
RUN_START(_Flash28_API_RunStart),
PAGE = 0
.cinit : > FLASHH PAGE = 0
.pinit : > FLASHH, PAGE = 0
/* .text1 : > ZONE7A, PAGE = 0*/
.text1 : > FLASHF, PAGE = 0
.text : > FLASHG PAGE = 0
.text2 : > FLASHF PAGE = 0
.text3 : > FLASHH PAGE = 0
codestart : > FLASHF PAGE = 0
/*ramfuncs : > RAML0 PAGE = 0*/
ramfuncs : LOAD = FLASHG,
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 : > FLASHH PAGE = 0
.switch : > FLASHH 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 : > RAML4, PAGE = 1
DMARAML6 : > RAML4, PAGE = 1
DMARAML7 : > RAML7, PAGE = 1
/* Allocate 0x400 of XINTF Zone 7 to storing data */
ZONE7DATA : > ZONE7A, PAGE = 1
ZONE7DATA_B : > ZONE7B, PAGE = 1
ZONE7DATA_C : > ZONE7C, PAGE = 1
EADCDATA : > ZONE0A, 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
swmarker : > FLASHB, PAGE = 1
DSP2833x_CodeStartBranch.asm:
}
Thank you,
Ariel
I am assuming it will not boot to the beginning of the program because the software is trying to jump to a location that no longer contains a valid address for the start of software?
The Boot ROM is documented in the device TRM. Refer to the section "Jump to branch instruction in flash memory" on page 177 of the TRM. The boot ROM will exit to address 0x33FFF6 which corresponds to the BEGIN section in TI supplied linker command files. This address cannot be changed. This address must have a branch instruction (codestart) which will redirect the c28x to the start of your application.
One way to get around this, but I doubt worth the hassle, is to load a piece of code via one of the communication loaders (SCI/SPI/CAN...) into RAM. This small piece of code can then redirect the C28x to a location different than the "jump to flash" address. Refer to the data stream on page 180. Word #11 is the PC entry point.
Regards
Lori