AnsweredAssumed Answered

2 Sections/Segments (one in RAM, one in ROM) containing the same data (CW 5.5.1272, 9S12DP256B)

Question asked by Mario Wohlwender on Dec 16, 2008
Latest reply on Dec 17, 2008 by Mario Wohlwender
Hi,
I am trying to set up a calibration protocol (XCP over CAN) on my controller (9S12DP256B).
 
To be able to modify parameter data online I need a section in RAM which contains all Parameters. At system startup this RAM section must be initialized with a Section in ROM containing the same data and the same mapping. The values in the ROM section are initialized either at compile time with the init-Values used in code or with the values from the last calibration session stored from the RAM to the ROM section after reception of a special XCP-Message.
 
My question: How can I tell the linker to map the parameters into RAM but having the same parameters (at a location with constant offset) stored in ROM?
 
I tried to map the parameters to RAM and use the automatic generated .copy section but there are some problems:
* the .copy section is optimized, e.g. parameters intialized to 0 in code are not member of the .copy section
* inside the copy section there are some other variables used to init RAM-Variables
  -> the whole mapping of the parameters inside the .copy section is different to the RAM section
 
sample Code to create/initialize parameter:
#pragma DATA_SEG CALIBRATION_CONST
const volatile unsigned char SWITCH_TEST = 1;
#pragma DATA_SEG DEFAULT
sample prm-file: 
...
SECTIONS
    /* internal RAM */
    CAL_RAM = READ_WRITE 0x3C00 TO 0x3CFF;  
    ...
    /* unbanked FLASH ROM */
    ROM_4000 = READ_ONLY  0x4000 TO 0x7FFF;
    ROM_C000 = READ_ONLY  0xC040 TO 0xEF6F;
    ...
END
   
PLACEMENT
    _PRESTART, STARTUP,
    ROM_VAR, STRINGS,
    VIRTUAL_TABLE_SEGMENT,
    NON_BANKED, COPY             INTO  ROM_C000, ROM_4000;
    DEFAULT_RAM                        INTO  RAM;
    CALIBRATION_CONST            INTO  CAL_RAM;
END
STACKSIZE 0x300
 
Thanks for your help!

Outcomes