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 all,
I want to assign 50KB FRAM for RAM usage. If the FRAM address located below 0xFFFF, it's fine. However, I need 50KB contiguous space, so the space have to chose above 0xFFFF,and once I modify the .xcl file , build the project , it tells error in the windows. (IDE : IAR for MSP430)
Need some help from you.
Thanks.
Hi Sean,
Thanks for your response and sorry for my vague description.
It has nothing to do with the code. It's about how to modify the .XCL file(IAR for MSP430) to make a FRAM space above 0xFFFF for RAM usage.
Here I paste the screenshot of the error /code and the XCL file.
#include "msp430fr6989.h" unsigned int xx[100]; void main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; xx[0] =1; while(1); }
Because of the forum 's requiment, I neet to changing the filename extension from .xcl to .txt , then I can post the file.
// ************************************************ // // XLINK configuration file for MSP430FR6989 // // Copyright 1996-2015 IAR Systems AB. // // See the file 430/doc/licenses/IARSourceLicense.txt for detailed // license information. // // $Revision: 13028 $ // // ************************************************ // --------------------------------------------------------- // Description // // // Usage: // // xlink [file file ...] -f lnk430fr6989.xcl // // ----------------------------------------------- // Device summary // // // Core: MSP430Xv2 // // Interrupt vectors: 56 // // Signature memory: 16 Bytes // // JTAG Signature memory: 4 Bytes // // BSL Signature memory: 4 Bytes // // IPE Signature memory: 8 Bytes // // Peripheral units: 00100-00FFF // // Information memory (FRAM): 01800-019FF // // Read/write memory (RAM): 01C00-023FF // // Read/write memory (TINYRAM): 00006-0001F // // Persistent memory (FRAM): 04400-0FFFF // 10000-23FFF // // ----------------------------------------------- // Segments // // ------------------------------------- // Data read/write segments // // // The following segments are available for both // the DATA16 and DATA20 segment groups. // // segment Usage // ------- -------------------------- // DATA<nn>_Z Data initialized to zero // DATA<nn>_I Data initialized by copying from DATA<nn>_ID // DATA<nn>_N Data defined using __no_init // DATA<nn>_P Data defined using __persistent // DATA<nn>_HEAP The heap used by 'malloc' and 'free' // // segment Usage // ------- -------------------------- // CSTACK Runtime stack // TLS16_I Thread-local storage for main thread // // ------------------------------------- // Program and data read-only segments // // // The following segments are available for both // the DATA16 and DATA20 segment groups. // // segment Usage // ------- -------------------------- // DATA<nn>_C Constant data, including string literals // DATA<nn>_ID Initializers for DATA<nn>_I // // segment Usage // ------- -------------------------- // INFO Information memory // INFOA Information memory, bank A // INFOB Information memory, bank B // INFOC Information memory, bank C // INFOD Information memory, bank D // CSTART Program startup code // CODE Program code // ISR_CODE Program code for interrupt service routines // DIFUNCT Dynamic initialization vector used by C++ // CHECKSUM Checksum byte(s) generated by the -J option // SIGNATURE Signature memory // JTAGSIGNATURE JTAG Signature memory // BSLSIGNATURE BSL Signature memory // IPESIGNATURE IPE Signature memory // INTVEC Interrupt vectors // RESET The reset vector // TLS16_ID Thread-local initializers for main thread // MPU_B<N> Memory Protection Unit border // IPE_B<N> Intellectual Property Encapsulation border // IPECODE16 IPE code // IPEDATA16_C IPE constant data // // Notes: // // * The segments CSTART, ISR_CODE, and DIFUNCT, as well as the segments in // the DATA16 and TLS16 segment groups must be placed in in the range // 0000-FFFD. // // * The INFOx and INFO segments overlap, this allows data either to be // placed in a specific bank or anywhere in the info memory. // // * The INTVEC and RESET segments overlap. This allows an application to // either use the reset vector provided by the runtime library, or // provide a reset function by defining an interrupt function associated // with the reset vector. // // * To use the Memory Protection Unit, the symbol ?mpu2_init should be // included in the application. The symbol '__iar_430_MPU_base' should be // defined to the location of the MPU peripheral registers, and the // registers '__iar_430_MPUSAM_value' and '__iar_430_MPUCTL0_value' to // the value the registers MPUSAM and MPUCTL0 should be initialized to, // respectively. // // * To include Intellectual Property Encapsulation (IPE), the library // label '__iar_430_ipe_signature' must be included in the application. // (One way to do this is to use the -g XLINK command-line option.) The // symbol '__iar_430_MPUIPC0_value' must be defined to the value the // MPUIPC0 register should be initialized to. // // * To include custom segments in the Intellectual Property Encapsulation // (IPE) area, place them between the segments IPE_B1 and IPE_B2. // // --------------------------------------------------------- // Configuation // // ----------------------------------------------- // Stack and heap sizes // // Uncomment for command line use //-D_STACK_SIZE=160 //-D_DATA16_HEAP_SIZE=160 //-D_DATA20_HEAP_SIZE=160 //-g?mpu2_init //-g__iar_430_ipe_signature // ----------------------------------------------- // Define cpu // -cmsp430 // ----------------------------------------------- // Support for placing functions in read/write memory // -QCODE_I=CODE_ID // ----------------------------------------------- // Support for thread local storage // -QTLS16_I=TLS16_ID // ----------------------------------------------- // Hardware multiplier location // -D__iar_HWMUL=4C0 // --------------------------------------------------------- // Placement directives // // ----------------------------------------------- // Information memory // -Z(CONST)INFO=1800-19FF -Z(CONST)INFOA=1980-19FF -Z(CONST)INFOB=1900-197F -Z(CONST)INFOC=1880-18FF -Z(CONST)INFOD=1800-187F // ----------------------------------------------- // RAM memory // -Z(DATA)TINYRAM=0006-001F -Z(DATA)DATA16_I,DATA16_Z,DATA16_N,TLS16_I=1C00-23FF,10040-23FFF -Z(DATA)CODE_I -Z(DATA)DATA20_I,DATA20_Z,DATA20_N -Z(DATA)CSTACK+_STACK_SIZE# // ----------------------------------------------- // FRAM memory // // ------------------------------------- // Low memory 0-0FFFF // // --------------------------- // Read/write data in FRAM // -Z(CONST)DATA16_P,DATA20_P=4400-FF7F -Z(DATA)DATA16_HEAP+_DATA16_HEAP_SIZE -Z(DATA)DATA20_HEAP+_DATA20_HEAP_SIZE // --------------------------- // Memory Protection Unit (MPU) border // -Z(CONST)MPU_B1 // --------------------------- // Intellectual Property Encapsulation (IPE) // -Z(CONST)IPE_B1=4400-FF7F -Z(DATA)IPEDATA16_N -Z(CODE)IPECODE16 -Z(CONST)IPEDATA16_C,IPE_B2 // --------------------------- // Memory Protection Unit (MPU) border // -Z(CONST)MPU_B2 // --------------------------- // Constant data // -Z(CONST)DATA16_C,DATA16_ID,TLS16_ID,DIFUNCT,CHECKSUM=4400-FF7F // --------------------------- // Code // -Z(CODE)CSTART,ISR_CODE,CODE16=4400-FF7F // ------------------------------------- // All memory 0-FFFFF // // --------------------------- // Code // -P(CODE)CODE=4400-FF7F -Z(CODE)CODE_PAD // --------------------------- // Constant data // -Z(CONST)DATA20_C,DATA20_ID,CODE_ID=4400-FF7F // ------------------------------------- // Signature memory and interrupt vectors // -Z(CONST)SIGNATURE=FF80-FF8F -Z(CONST)JTAGSIGNATURE=FF80-FF83 -Z(CONST)BSLSIGNATURE=FF84-FF87 -Z(CONST)IPESIGNATURE=FF88-FF8F -Z(CODE)INTVEC=FF90-FFFF -Z(CODE)RESET=FFFE-FFFF
Hi,
I highly recommend you to review this App Report MSP430™ FRAM Technology – How To and Best Practices (Start with section 3.4.2 IAR Embedded Workbench for MSP430).
And just for testing purposes, I changed my linker file to:
// --------------------------- // Read/write data in FRAM // -Z(CONST)DATA16_P,DATA20_P=10000-13FFF // -Z(CONST)DATA16_P,DATA20_P=4400-FF7F
And created a variable like this:
__root __persistent uint16_t variableInFRAM;
And my map file looked like this:
------------------------------------------------------------------------- DATA20_P Relative segment, address: 00010000 - 00010001 (0x2 bytes), align: 1 Segment part 5. ROOT ENTRY ADDRESS REF BY ===== ======= ====== variableInFRAM 00010000
Hopefully this helps.
Best regards,
David
Hello David,
Yes, put a variable locate@ address > 0xFFFF is OK . But if I want to use a space for example 0x10040~ 0x23FFF as stack, the IDE will tell error.
I changed the linker file:
// ----------------------------------------------- // RAM memory // -Z(DATA)TINYRAM=0006-001F -Z(DATA)DATA16_I,DATA16_Z,DATA16_N,TLS16_I=10040-23FFF //-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,TLS16_I=1C00-23FF -Z(DATA)CODE_I -Z(DATA)DATA20_I,DATA20_Z,DATA20_N -Z(DATA)CSTACK+_STACK_SIZE#
It seems like STACK must located @SRAM or FRAM smaller than 0xFFFF or IAR will think it is illegal.
Hi SeaFesse,
I do not think it is possible to put the stack above 64KB (even that the SP register is 20bit wide).
I tried changing the cstart without any luck, it builds but the SP does not reflect the correct address
MOVA #SFE(CSTACK), SP
or
MOVA #0x14000, SP
So I looked in the IAR C/C++ Compiler User Guide for MSP430 and:
Anyway I'm looping in the MSP430 Compiler Team as they would have the most expertise regarding this question
Best regards,
David
init: MOV #SFE(CSTACK), SP ; set up stack main: NOP ; main program MOV.W #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer MOVA #0x10040,SP
Please also add the address space to xcl file for Read/write data in FRAM space.
// --------------------------- // Read/write data in FRAM // -Z(CONST)DATA16_P,DATA20_P=4400-FF7F,10040-23FFF -Z(DATA)DATA16_HEAP+_DATA16_HEAP_SIZE -Z(DATA)DATA20_HEAP+_DATA20_HEAP_SIZE
Hi Wei.Jetim,
Yes! I modfied the Cstarup.s43, it works. And IDE tells no error when I add "10040-23FFF" . Thank you all...:)
-Z(DATA)TINYRAM=0006-001F
-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,TLS16_I=1C00-23FF,10040-23FFF
-Z(DATA)CODE_I
-Z(DATA)DATA20_I,DATA20_Z,DATA20_N
-Z(DATA)CSTACK+_STACK_SIZE#
// -------------------- // Initialize SP to point to the top of the stack. // //MOV #SFE(CSTACK), SP MOVA #010040h, SP // // Ensure that main is called. // REQUIRE ?cstart_call_main
**Attention** This is a public forum