AnsweredAssumed Answered

mc9s12xdt512 & paged - unpaged ram memory

Question asked by Eric_t d on Jan 27, 2016
Latest reply on Feb 4, 2016 by Edward Karpicz

Hi,

 

I have a project that works with CW5.1 and mc9s12dg256 controller.

Now I have to migrate to mc9s12xdt512.

I have faced the following problem:

mc9s12dg256 has the RAM memory at address 0x1000 to 0x3FFF while the mc9s12xdt512 has the unpaged RAM at address 0x2000 to 0x3FFF.

 

As far as I know, RAM_FD uses the RAM segment of 0x1000..0x1FFF.

I have modified the linker of mc9s12xdt512 as follow:

 

       RAM  = READ_WRITE  DATA_NEAR  0x1000 TO   0x3FFF;

       Undefined all paged ram memory

       //RAM_FB        = READ_WRITE  DATA_FAR           0xFB1000 TO 0xFB1FFF;

       //RAM_FC        = READ_WRITE  DATA_FAR           0xFC1800 TO 0xFC1FFF;

       //RAM_FD        = READ_WRITE  DATA_FAR           0xFD1000 TO 0xFD1FFF;

 

       //PAGED_RAM         INTO  /* when using banked addressing for variable data, make sure to specify

       //                             the option -D__FAR_DATA on the compiler command line */

       //                            RAM_FB, /*RAM_FC, RAM_FD*/;

 

The project has been successfully migrated to mc9s12xdt512. It works properly without problems.

 

Now I have to use the paged ram memory.

 

I have modify the linker as follow:

 

       RAM  = READ_WRITE  DATA_NEAR  0x1000 TO   0x3FFF;

 

      /* paged RAM:                                          0x1000 TO   0x1FFF; addressed through RPAGE */

      RAM_FB        = READ_WRITE  DATA_FAR           0xFB1000 TO 0xFB1FFF;

      RAM_FC        = READ_WRITE  DATA_FAR           0xFC1800 TO 0xFC1FFF;

    //RAM_FD        = READ_WRITE  DATA_FAR           0xFD1000 TO 0xFD1FFF;

 

      PAGED_RAM         INTO  /* when using banked addressing for variable data, make sure to specify

                                                the option -D__FAR_DATA on the compiler command line */

                                             RAM_FB, RAM_FC/*, RAM_FD*/;

 

 

Also I have add the option -D__FAR_DATA on the compiler command line.

Unfortunately the project does not run. Somewhere in Init.c of Start12.c the controller crashes.

 

Does anyone know if there is anything else on linker and on compiler that I should modify?

 

Thank you in advanced.

 

Below is the full linker:

 

/* This is a linker parameter file for the MC9S12XDT512 */

/*

This file is setup to use the HCS12X core only.

If you plan to also use the XGATE in your project, best create a new project with the

'New Project Wizard' (File|New... menu in the CodeWarrior IDE) and choose the appropriate

project parameters.

*/

 

NAMES

    /* CodeWarrior will pass all the needed files to the linker by command line. But here you may add your additional files */

END

 

SEGMENTS /* here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. All addresses are 'logical' */

/* Register space  */

/*    IO_SEG        = PAGED                            0x0000 TO   0x07FF; intentionally not defined */

 

 

/* non-paged EEPROM */                                                 

    //EEPROM        = READ_ONLY   DATA_NEAR IBCC_NEAR  0x0C00 TO   0x0FFB;

 

 

/* non-paged RAM */

  //RAM                = READ_WRITE DATA_NEAR          0x2000 TO   0x3FFF;

    RAM                = READ_WRITE DATA_NEAR          0x1000 TO   0x3E2D;//0x1000 TO   0x3E3E;

    NO_INIT_RAM        = NO_INIT    DATA_NEAR          0x3E2E TO   0x3FFD;//0x3E3F TO   0x3FFD;

    NO_INIT_COMMON_RAM = NO_INIT    DATA_NEAR          0x3FFE TO   0x3FFF;   

 

 

/* non-banked FLASH */

    //ROM_4000      = READ_ONLY   DATA_NEAR IBCC_NEAR  0x4000 TO   0x7FFF;

    //ROM_C000      = READ_ONLY   DATA_NEAR IBCC_NEAR  0xC000 TO   0xFEFF;

      ROM_C000      = READ_ONLY   DATA_NEAR IBCC_NEAR  0xC042 TO   0xF2FF;

/*    VECTORS       = READ_ONLY                        0xFF00 TO   0xFFFF; intentionally not defined: used for VECTOR commands below */

    //OSVECTORS     = READ_ONLY                        0xFF10 TO   0xFFFF;  /* OSEK interrupt vectors (use your vector.o) */

 

 

/* paged EEPROM                                        0x0800 TO   0x0BFF; addressed through EPAGE */

    //EEPROM_FC     = READ_ONLY   DATA_FAR IBCC_FAR  0xFC0800 TO 0xFC0BFF;

    //EEPROM_FD     = READ_ONLY   DATA_FAR IBCC_FAR  0xFD0800 TO 0xFD0BFF;

    //EEPROM_FE     = READ_ONLY   DATA_FAR IBCC_FAR  0xFE0800 TO 0xFE0BFF;

/*    EEPROM_FF     = READ_ONLY                      0xFF0800 TO 0xFF0BFF; intentionally not defined: equivalent to EEPROM */

 

 

/* paged RAM:                                          0x1000 TO   0x1FFF; addressed through RPAGE */

      RAM_FB        = READ_WRITE  DATA_FAR           0xFB1000 TO 0xFB1FFF;

      RAM_FC        = READ_WRITE  DATA_FAR           0xFC1800 TO 0xFC1FFF;

    //RAM_FD        = READ_WRITE  DATA_FAR           0xFD1000 TO 0xFD1FFF;

/*    RAM_FE        = READ_WRITE                     0xFE1000 TO 0xFE1FFF; intentionally not defined: equivalent to RAM: 0x2000..0x2FFF */

/*    RAM_FF        = READ_WRITE                     0xFF1000 TO 0xFF1FFF; intentionally not defined: equivalent to RAM: 0x3000..0x3FFF */

 

 

/* paged FLASH:                                        0x8000 TO   0xBFFF; addressed through PPAGE */

      PAGE_E0       = READ_ONLY   DATA_FAR IBCC_FAR  0xE08000 TO 0xE0BFFD; //fonts

      PAGE_E1       = READ_ONLY   DATA_FAR IBCC_FAR  0xE18000 TO 0xE1BFFD;

      PAGE_E2       = READ_ONLY   DATA_FAR IBCC_FAR  0xE28000 TO 0xE2BFFD;

      PAGE_E3       = READ_ONLY   DATA_FAR IBCC_FAR  0xE38000 TO 0xE3BFFD;

      PAGE_E4       = READ_ONLY   DATA_FAR IBCC_FAR  0xE48000 TO 0xE4BFFD;

      PAGE_E5       = READ_ONLY   DATA_FAR IBCC_FAR  0xE58000 TO 0xE5BFFD;

      PAGE_E6       = READ_ONLY   DATA_FAR IBCC_FAR  0xE68000 TO 0xE6BFFD;

      PAGE_E7       = READ_ONLY   DATA_FAR IBCC_FAR  0xE78000 TO 0xE7BFFD;

 

 

      PAGE_E8       = READ_ONLY   DATA_FAR IBCC_FAR  0xE88000 TO 0xE8BFFD;

      PAGE_E9       = READ_ONLY   DATA_FAR IBCC_FAR  0xE98000 TO 0xE9BFFD;

      PAGE_EA       = READ_ONLY   DATA_FAR IBCC_FAR  0xEA8000 TO 0xEABFFD;

      PAGE_EB       = READ_ONLY   DATA_FAR IBCC_FAR  0xEB8000 TO 0xEBBFFD;

      PAGE_EC       = READ_ONLY   DATA_FAR IBCC_FAR  0xEC8000 TO 0xECBFFD;

      PAGE_ED       = READ_ONLY   DATA_FAR IBCC_FAR  0xED8000 TO 0xEDBFFD;

      PAGE_EE       = READ_ONLY   DATA_FAR IBCC_FAR  0xEE8000 TO 0xEEBFFD;

      PAGE_EF       = READ_ONLY   DATA_FAR IBCC_FAR  0xEF8000 TO 0xEFBFFD;

 

 

      PAGE_F0       = READ_ONLY   DATA_FAR IBCC_FAR  0xF08000 TO 0xF0BFFD;

      PAGE_F1       = READ_ONLY   DATA_FAR IBCC_FAR  0xF18000 TO 0xF1BFFD;

      PAGE_F2       = READ_ONLY   DATA_FAR IBCC_FAR  0xF28000 TO 0xF2BFFD;

      PAGE_F3       = READ_ONLY   DATA_FAR IBCC_FAR  0xF38000 TO 0xF3BFFD;

      PAGE_F4       = READ_ONLY   DATA_FAR IBCC_FAR  0xF48000 TO 0xF4BFFD;

      PAGE_F5       = READ_ONLY   DATA_FAR IBCC_FAR  0xF58000 TO 0xF5BFFD;

      PAGE_F6       = READ_ONLY   DATA_FAR IBCC_FAR  0xF68000 TO 0xF6BFFD;

      PAGE_F7       = READ_ONLY   DATA_FAR IBCC_FAR  0xF78000 TO 0xF7BFFD;

 

 

      PAGE_F8       = READ_ONLY   DATA_FAR IBCC_FAR  0xF88000 TO 0xF8BFFD;

      PAGE_F9       = READ_ONLY   DATA_FAR IBCC_FAR  0xF98000 TO 0xF9BFFD;

      PAGE_FA       = READ_ONLY   DATA_FAR IBCC_FAR  0xFA8000 TO 0xFABFFD;

      PAGE_FB       = READ_ONLY   DATA_FAR IBCC_FAR  0xFB8000 TO 0xFBBFFD;

      PAGE_FC       = READ_ONLY   DATA_FAR IBCC_FAR  0xFC8000 TO 0xFCBFFD;

/*    PAGE_FD       = READ_ONLY                      0xFD8000 TO 0xFDBFFF; intentionally not defined: equivalent to ROM_4000 */

    //PAGE_FE       = READ_ONLY   DATA_FAR IBCC_FAR  0xFE8000 TO 0xFEBFFF;

/*    PAGE_FF       = READ_ONLY                      0xFF8000 TO 0xFFBFFF; intentionally not defined: equivalent to ROM_C000 */

END

 

 

PLACEMENT /* here all predefined and user segments are placed into the SEGMENTS defined above. */

      _PRESTART,              /* Used in HIWARE format: jump to _Startup at the code start */

      STARTUP,                /* startup data structures */

      ROM_VAR,                /* constant variables */

      STRINGS,                /* string literals */

      VIRTUAL_TABLE_SEGMENT,  /* C++ virtual table segment */

    //.ostext,                /* eventually OSEK code  */

      NON_BANKED,             /* runtime routines which must not be banked */

      COPY                    /* copy down information: how to initialize variables */

                              /* in case you want to use ROM_4000 here as well, make sure

                                 that all files (incl. library files) are compiled with the

                                 option: -OnB=b */

                        INTO  ROM_C000/*, ROM_4000*/;

 

 

      DEFAULT_ROM,

      CRC_ROM      

                        INTO  /*PAGE_FE,*/      PAGE_FC, PAGE_FB, PAGE_FA, PAGE_F9, PAGE_F8,

                              PAGE_F7, PAGE_F6, PAGE_F5, PAGE_F4, PAGE_F3, PAGE_F2, PAGE_F1, PAGE_F0,

                              PAGE_EF, PAGE_EE, PAGE_ED, PAGE_EC, PAGE_EB, PAGE_EA, PAGE_E9, PAGE_E8,

                              PAGE_E7, PAGE_E6, PAGE_E5, PAGE_E4, PAGE_E3, PAGE_E2, PAGE_E1, /*PAGE_E0*/;

 

    //.stackstart,            /* eventually used for OSEK kernel awareness: Main-Stack Start */

      SSTACK,                 /* allocate stack first to avoid overwriting variables on overflow */

    //.stackend,              /* eventually used for OSEK kernel awareness: Main-Stack End */

      DEFAULT_RAM             /* all variables, the default RAM location */

                        INTO  RAM;

      NO_INTIALIZE_RAM  INTO  NO_INIT_RAM;                 

                       

 

 

      PAGED_RAM         INTO  /* when using banked addressing for variable data, make sure to specify

                                 the option -D__FAR_DATA on the compiler command line */

                               RAM_FB, /*RAM_FC, RAM_FD*/;

 

 

    //DISTRIBUTE        DISTRIBUTE_INTO

    //                        /*ROM_4000, *//*PAGE_FE,*/ PAGE_FC, PAGE_FB, PAGE_FA, PAGE_F9, PAGE_F8, PAGE_F7,

    //                        PAGE_F6, PAGE_F5, PAGE_F4, PAGE_F3, PAGE_F2, PAGE_F1, PAGE_F0, PAGE_EF,

    //                        PAGE_EE, PAGE_ED, PAGE_EC, PAGE_EB, PAGE_EA, PAGE_E9, PAGE_E8, PAGE_E7,

    //                        PAGE_E6, PAGE_E5, PAGE_E4, PAGE_E3, PAGE_E2, PAGE_E1, PAGE_E0;

    //CONST_DISTRIBUTE  DISTRIBUTE_INTO

    //                        /*ROM_4000,*/ /*PAGE_FE,*/ PAGE_FC, PAGE_FB, PAGE_FA, PAGE_F9, PAGE_F8, PAGE_F7,

    //                        PAGE_F6, PAGE_F5, PAGE_F4, PAGE_F3, PAGE_F2, PAGE_F1, PAGE_F0, PAGE_EF,

    //                        PAGE_EE, PAGE_ED, PAGE_EC, PAGE_EB, PAGE_EA, PAGE_E9, PAGE_E8, PAGE_E7,

    //                        PAGE_E6, PAGE_E5, PAGE_E4, PAGE_E3, PAGE_E2, PAGE_E1, PAGE_E0;

    //DATA_DISTRIBUTE   DISTRIBUTE_INTO

    //                        RAM, RAM_FD, /*RAM_FC,*/ RAM_FB;

    //.vectors          INTO  OSVECTORS; /* OSEK vector table */

END

 

 

 

 

ENTRIES /* keep the following unreferenced variables */

    /* OSEK: always allocate the vector table and all dependent objects */

  //_vectab OsBuildNumber _OsOrtiStackStart _OsOrtiStart

END

 

 

STACKSIZE 0x500   /* size of the stack (will be allocated in DEFAULT_RAM) */

 

 

/* use these definitions in plane of the vector table ('vectors') above */

//VECTOR 0 _Startup /* reset vector: this is the default entry point for a C/C++ application. */

//VECTOR 0 Entry  /* reset vector: this is the default entry point for an Assembly application. */

//INIT Entry      /* for assembly applications: that this is as well the initialization entry point */

 

 

 

 

CHECKSUM

   CHECKSUM_ENTRY METHOD_CRC16 OF READ_ONLY 0xC000   TO 0xFCBFFF INTO READ_ONLY 0xC020   SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xC042   TO 0xF3FF   INTO READ_ONLY 0xC040   SIZE 2 UNDEFINED 0xFF END

  

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xE08000 TO 0xE0BFFD INTO READ_ONLY 0xE0BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xE18000 TO 0xE1BFFD INTO READ_ONLY 0xE1BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xE28000 TO 0xE2BFFD INTO READ_ONLY 0xE2BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xE38000 TO 0xE3BFFD INTO READ_ONLY 0xE3BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xE48000 TO 0xE4BFFD INTO READ_ONLY 0xE4BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xE58000 TO 0xE5BFFD INTO READ_ONLY 0xE5BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xE68000 TO 0xE6BFFD INTO READ_ONLY 0xE6BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xE78000 TO 0xE7BFFD INTO READ_ONLY 0xE7BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xE88000 TO 0xE8BFFD INTO READ_ONLY 0xE8BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xE98000 TO 0xE9BFFD INTO READ_ONLY 0xE9BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xEA8000 TO 0xEABFFD INTO READ_ONLY 0xEABFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xEB8000 TO 0xEBBFFD INTO READ_ONLY 0xEBBFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xEC8000 TO 0xECBFFD INTO READ_ONLY 0xECBFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xED8000 TO 0xEDBFFD INTO READ_ONLY 0xEDBFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xEE8000 TO 0xEEBFFD INTO READ_ONLY 0xEEBFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xEF8000 TO 0xEFBFFD INTO READ_ONLY 0xEFBFFE SIZE 2 UNDEFINED 0xFF END  

  

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xF08000 TO 0xF0BFFD INTO READ_ONLY 0xF0BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xF18000 TO 0xF1BFFD INTO READ_ONLY 0xF1BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xF28000 TO 0xF2BFFD INTO READ_ONLY 0xF2BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xF38000 TO 0xF3BFFD INTO READ_ONLY 0xF3BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xF48000 TO 0xF4BFFD INTO READ_ONLY 0xF4BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xF58000 TO 0xF5BFFD INTO READ_ONLY 0xF5BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xF68000 TO 0xF6BFFD INTO READ_ONLY 0xF6BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xF78000 TO 0xF7BFFD INTO READ_ONLY 0xF7BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xF88000 TO 0xF8BFFD INTO READ_ONLY 0xF8BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xF98000 TO 0xF9BFFD INTO READ_ONLY 0xF9BFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xFA8000 TO 0xFABFFD INTO READ_ONLY 0xFABFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xFB8000 TO 0xFBBFFD INTO READ_ONLY 0xFBBFFE SIZE 2 UNDEFINED 0xFF END

   CHECKSUM_ENTRY METHOD_ADD   OF READ_ONLY 0xFC8000 TO 0xFCBFFD INTO READ_ONLY 0xFCBFFE SIZE 2 UNDEFINED 0xFF END      

END

 

 

HEXFILE BootloaderA_213_CRYSTAL_14745600_XDT512.s19

Outcomes