Hallo forum users,
I try to implement the RunningfromRAM_CCE example but this time using the MSP430F5510. I have made the adequate changes but after compiling I get the following warning:
"warning: creating output section ".flashcode" without a SECTIONS specification"
I have uploaded the "main.c" and the linker command file. Please could you tell me where is my mistake?
Thanks a lot in advance,
Stratos
//****************************************************************************** // MSP430F5510 Demo - Executing code from RAM // // Description: This program demonstrates how a parts of a program can be // executed from FLASH and RAM. First, the main program copies the function // from Flash to RAM during runtime. The main program executes from Flash and // it calls the RAM function and executes in RAM and finally jumps back to // Flash. The function first erases flash seg C, then it increments all values // in seg C, then it erases seg D, then copies seg C to seg D. // // Important Notes: // // 1. CCE automatically generates a new copy of linker file in the project // directory. The zip file has the attached required modified linker file. // See below on what was added to the linker file. // // MEMORY // { // ... // RAM_MEM : origin = 0x2400, length = 0x0200 // FLASH_MEM : origin = 0x8000, length = 0x01FF // ... // } // // SECTIONS // { // ... // .FLASHCODE : load = FLASH_MEM, run = RAM_MEM // /* CODE IN FLASH AND WILL BE COPIED // TO RAM AT EXECUTION HANDLED BY // USER */ // .RAMCODE : load = FLASH_MEM /* CODE WILL BE IN RAM */ // ... // } // // 2. Unlike IAR where it can calculate the code size through the segment // call functions, we have to define the allocated memory area that will // be copied from FLASH to RAM. In this case, user has to manually define // the start address of FLASH and RAM. These memory addresses has to be // the same as defined in the linker file origin address of FLASH_MEM and // RAM_MEM. The flash_code_size can be changed to however much the final // compiled code size is. // // #define flash_start_add 0x8000 // Flash code starting address // #define flash_code_size 0x01ff // Function segment size to be copied // #define RAM_start_add 0x2400 // RAM code starting address // // // 3. Erasing and Writing to flash running from RAM requires a few checks of // the BUSY flag. See the user guide for the flow diagram. // // while(FCTL3&BUSY); // // ACLK = n/a, MCLK = SMCLK = CALxxx_1MHZ = 1MHz // //* Set Breakpoint on NOP in the Mainloop to avoid Stressing Flash *// // // // W. Goh & M. Morales & A. Dannenberg // Texas Instruments Inc. // December 2008 // Built with CCE Version: 3.2.2.1.8 //****************************************************************************** #include "msp430f5510.h" #include "string.h" // Define where the code is located in both Flash and RAM #define flash_start_add 0x8000 // Flash code starting address #define flash_code_size 0x01ff // Function segment size to be copied #define RAM_start_add 0x2400 // RAM code starting address // Function prototypes void write_SegC (char value); void copy_C2D (void); char value; // 8-bit value to write to seg C // This function is in flash to be copied to RAM #pragma CODE_SECTION(write_SegC,".flashcode") void write_SegC (char value) { char *Flash_ptr; // Flash pointer unsigned int i; P1OUT ^= 0x02; Flash_ptr = (char *) 0x1040; // Initialize Flash pointer while(FCTL3&BUSY); // Check BUSY flag; Important if running this code from RAM FCTL1 = FWKEY + ERASE; // Set Erase bit FCTL3 = FWKEY; // Clear Lock bit *Flash_ptr = 0; // Dummy write to erase Flash segment while(FCTL3&BUSY); // Check BUSY flag; Important if running this code from RAM FCTL1 = FWKEY + WRT; // Set WRT bit for write operation for (i=0; i<64; i++) { while(FCTL3&BUSY); // Check BUSY flag; Important if running this code from RAM *Flash_ptr++ = value; // Write value to flash } while(FCTL3&BUSY); // Check BUSY flag; Important if running this code from RAM FCTL1 = FWKEY; // Clear WRT bit FCTL3 = FWKEY + LOCK; // Set LOCK bit } // This function is in flash to be copied to RAM #pragma CODE_SECTION(copy_C2D,".flashcode") void copy_C2D (void) { char *Flash_ptrC; // Segment C pointer char *Flash_ptrD; // Segment D pointer unsigned int i; Flash_ptrC = (char *) 0x1040; // Initialize Flash segment C pointer Flash_ptrD = (char *) 0x1000; // Initialize Flash segment D pointer while(FCTL3&BUSY); // Check BUSY flag; Important if running this code from RAM FCTL1 = FWKEY + ERASE; // Set Erase bit FCTL3 = FWKEY; // Clear Lock bit *Flash_ptrD = 0; // Dummy write to erase Flash segment D while(FCTL3&BUSY); // Check BUSY flag; Important if running this code from RAM FCTL1 = FWKEY + WRT; // Set WRT bit for write operation for (i=0; i<64; i++) { while(FCTL3&BUSY); // Check BUSY flag; Important if running this code from RAM *Flash_ptrD++ = *Flash_ptrC++; // copy value segment C to segment D } while(FCTL3&BUSY); // Check BUSY flag; Important if running this code from RAM FCTL1 = FWKEY; // Clear WRT bit FCTL3 = FWKEY + LOCK; // Set LOCK bit } //Copy function from Flash to RAM void copy_flash_to_RAM(void) { unsigned char *flash_start_ptr; // Initialize pointers unsigned char *RAM_start_ptr; flash_start_ptr = (unsigned char *)flash_start_add; RAM_start_ptr = (unsigned char *)RAM_start_add; // Copy flash function to RAM memcpy(RAM_start_ptr,flash_start_ptr,flash_code_size); } int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WatchDog timer //if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF) //{ // while(1); // If calibration constants erased // do not load, trap CPU!! //} //BCSCTL1 = CALBC1_1MHZ; // Set DCO to 1MHz //DCOCTL = CALDCO_1MHZ; //FCTL2 = FWKEY + FSSEL_1 + FN1; // MCLK/3 for Flash Timing Generator P1DIR |= 0x03; P1OUT |= 0x00; value = 0; copy_flash_to_RAM(); // call function to copy from flash to RAM // Parts of this while loop executes from Flash. The write_SegC and copy_C2D // is executed from RAM. The program basically will execute from FLASH until // it calls write_SegC function which will jump the program to RAM. // After executing write_SegC in RAM, it will jump back to flash to continue // executing. When copy_C2D is called, it jumps to RAM and back to Flash when // done. while(1) { int i; P1OUT ^= 0x01; for(i=0;i<20000;i++); // This portion executes from FLASH write_SegC(value++); // This portion of the code is executed from RAM copy_C2D(); // This portion of the code is executed from RAM __no_operation(); // Jumps back to FLASH here. Set breakpoint here } }
/******************************************************************************/
/* lnk_msp430f5510.cmd - LINKER COMMAND FILE FOR LINKING MSP430F5510 PROGRAMS */
/* */
/* Usage: lnk430 <obj files...> -o <out file> -m <map file> lnk.cmd */
/* cl430 <src files...> -z -o <out file> -m <map file> lnk.cmd */
/* */
/*----------------------------------------------------------------------------*/
/* These linker options are for command line linking only. For IDE linking, */
/* you should set your linker options in Project Properties */
/* -c LINK USING C CONVENTIONS */
/* -stack 0x0100 SOFTWARE STACK SIZE */
/* -heap 0x0100 HEAP AREA SIZE */
/* */
/*----------------------------------------------------------------------------*/
/****************************************************************************/
/* SPECIFY THE SYSTEM MEMORY MAP */
/****************************************************************************/
MEMORY
{
SFR : origin = 0x0000, length = 0x0010
PERIPHERALS_8BIT : origin = 0x0010, length = 0x00F0
PERIPHERALS_16BIT : origin = 0x0100, length = 0x0100
RAM : origin = 0x2600, length = 0x0E00
RAM_MEM : origin = 0x2400, length = 0x01FF
INFOA : origin = 0x1980, length = 0x0080
INFOB : origin = 0x1900, length = 0x0080
INFOC : origin = 0x1880, length = 0x0080
INFOD : origin = 0x1800, length = 0x0080
FLASH_MEM : origin = 0x8000, length = 0x01FF
FLASH : origin = 0x8200, length = 0x7D80
INT00 : origin = 0xFF80, length = 0x0002
INT01 : origin = 0xFF82, length = 0x0002
INT02 : origin = 0xFF84, length = 0x0002
INT03 : origin = 0xFF86, length = 0x0002
INT04 : origin = 0xFF88, length = 0x0002
INT05 : origin = 0xFF8A, length = 0x0002
INT06 : origin = 0xFF8C, length = 0x0002
INT07 : origin = 0xFF8E, length = 0x0002
INT08 : origin = 0xFF90, length = 0x0002
INT09 : origin = 0xFF92, length = 0x0002
INT10 : origin = 0xFF94, length = 0x0002
INT11 : origin = 0xFF96, length = 0x0002
INT12 : origin = 0xFF98, length = 0x0002
INT13 : origin = 0xFF9A, length = 0x0002
INT14 : origin = 0xFF9C, length = 0x0002
INT15 : origin = 0xFF9E, length = 0x0002
INT16 : origin = 0xFFA0, length = 0x0002
INT17 : origin = 0xFFA2, length = 0x0002
INT18 : origin = 0xFFA4, length = 0x0002
INT19 : origin = 0xFFA6, length = 0x0002
INT20 : origin = 0xFFA8, length = 0x0002
INT21 : origin = 0xFFAA, length = 0x0002
INT22 : origin = 0xFFAC, length = 0x0002
INT23 : origin = 0xFFAE, length = 0x0002
INT24 : origin = 0xFFB0, length = 0x0002
INT25 : origin = 0xFFB2, length = 0x0002
INT26 : origin = 0xFFB4, length = 0x0002
INT27 : origin = 0xFFB6, length = 0x0002
INT28 : origin = 0xFFB8, length = 0x0002
INT29 : origin = 0xFFBA, length = 0x0002
INT30 : origin = 0xFFBC, length = 0x0002
INT31 : origin = 0xFFBE, length = 0x0002
INT32 : origin = 0xFFC0, length = 0x0002
INT33 : origin = 0xFFC2, length = 0x0002
INT34 : origin = 0xFFC4, length = 0x0002
INT35 : origin = 0xFFC6, length = 0x0002
INT36 : origin = 0xFFC8, length = 0x0002
INT37 : origin = 0xFFCA, length = 0x0002
INT38 : origin = 0xFFCC, length = 0x0002
INT39 : origin = 0xFFCE, length = 0x0002
INT40 : origin = 0xFFD0, length = 0x0002
INT41 : origin = 0xFFD2, length = 0x0002
INT42 : origin = 0xFFD4, length = 0x0002
INT43 : origin = 0xFFD6, length = 0x0002
INT44 : origin = 0xFFD8, length = 0x0002
INT45 : origin = 0xFFDA, length = 0x0002
INT46 : origin = 0xFFDC, length = 0x0002
INT47 : origin = 0xFFDE, length = 0x0002
INT48 : origin = 0xFFE0, length = 0x0002
INT49 : origin = 0xFFE2, length = 0x0002
INT50 : origin = 0xFFE4, length = 0x0002
INT51 : origin = 0xFFE6, length = 0x0002
INT52 : origin = 0xFFE8, length = 0x0002
INT53 : origin = 0xFFEA, length = 0x0002
INT54 : origin = 0xFFEC, length = 0x0002
INT55 : origin = 0xFFEE, length = 0x0002
INT56 : origin = 0xFFF0, length = 0x0002
INT57 : origin = 0xFFF2, length = 0x0002
INT58 : origin = 0xFFF4, length = 0x0002
INT59 : origin = 0xFFF6, length = 0x0002
INT60 : origin = 0xFFF8, length = 0x0002
INT61 : origin = 0xFFFA, length = 0x0002
INT62 : origin = 0xFFFC, length = 0x0002
RESET : origin = 0xFFFE, length = 0x0002
}
/****************************************************************************/
/* SPECIFY THE SECTIONS ALLOCATION INTO MEMORY */
/****************************************************************************/
SECTIONS
{
.bss : {} > RAM /* GLOBAL & STATIC VARS */
.sysmem : {} > RAM /* DYNAMIC MEMORY ALLOCATION AREA */
.stack : {} > RAM (HIGH) /* SOFTWARE SYSTEM STACK */
.text : {} > FLASH /* CODE */
.flashcode : load = FLASH_MEM, run = RAM_MEM
.ramcode : load = FLASH_MEM /* CODE WILL BE IN RAM */
.cinit : {} > FLASH /* INITIALIZATION TABLES */
.const : {} > FLASH /* CONSTANT DATA */
.cio : {} > RAM /* C I/O BUFFER */
.pinit : {} > FLASH /* C++ CONSTRUCTOR TABLES */
.infoA : {} > INFOA /* MSP430 INFO FLASH MEMORY SEGMENTS */
.infoB : {} > INFOB
.infoC : {} > INFOC
.infoD : {} > INFOD
.int00 : {} > INT00 /* MSP430 INTERRUPT VECTORS */
.int01 : {} > INT01
.int02 : {} > INT02
.int03 : {} > INT03
.int04 : {} > INT04
.int05 : {} > INT05
.int06 : {} > INT06
.int07 : {} > INT07
.int08 : {} > INT08
.int09 : {} > INT09
.int10 : {} > INT10
.int11 : {} > INT11
.int12 : {} > INT12
.int13 : {} > INT13
.int14 : {} > INT14
.int15 : {} > INT15
.int16 : {} > INT16
.int17 : {} > INT17
.int18 : {} > INT18
.int19 : {} > INT19
.int20 : {} > INT20
.int21 : {} > INT21
.int22 : {} > INT22
.int23 : {} > INT23
.int24 : {} > INT24
.int25 : {} > INT25
.int26 : {} > INT26
.int27 : {} > INT27
.int28 : {} > INT28
.int29 : {} > INT29
.int30 : {} > INT30
.int31 : {} > INT31
.int32 : {} > INT32
.int33 : {} > INT33
.int34 : {} > INT34
.int35 : {} > INT35
.int36 : {} > INT36
.int37 : {} > INT37
.int38 : {} > INT38
.int39 : {} > INT39
.int40 : {} > INT40
.int41 : {} > INT41
.int42 : {} > INT42
.int43 : {} > INT43
.int44 : {} > INT44
.int45 : {} > INT45
.int46 : {} > INT46
.int47 : {} > INT47
.int48 : {} > INT48
.int49 : {} > INT49
.int50 : {} > INT50
.int51 : {} > INT51
.int52 : {} > INT52
.int53 : {} > INT53
.int54 : {} > INT54
.int55 : {} > INT55
.int56 : {} > INT56
.int57 : {} > INT57
.int58 : {} > INT58
.int59 : {} > INT59
.int60 : {} > INT60
.int61 : {} > INT61
.int62 : {} > INT62
.reset : {} > RESET /* MSP430 RESET VECTOR */
}
/****************************************************************************/
/* INCLUDE PERIPHERALS MEMORY MAP */
/****************************************************************************/
-l msp430f5510.cmd