How to fix a function to an address

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

How to fix a function to an address

1,280 Views
liuweiwei
Contributor I

There is a requirement that make one function in a fix address in the flash, how to implement this? Does anyone have any ideas?

0 Kudos
Reply
4 Replies

1,125 Views
ZhangJennie
NXP TechSupport
NXP TechSupport

Hi,

It's not possible to define a function in an address with qualifier "@" like variable.

for function, we have to define a segment in the specific address and place a section into it in prm file. then use

#pragma CODE_SEG  section_name

to define a function to this section.

Is this clear to you?


Have a great day,
Jennie Zhang

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos
Reply

1,125 Views
Alice_Yang
NXP TechSupport
NXP TechSupport

Hello Liu Wei Wei ,

Which chip and which version of IDE ?

BR

Alice

0 Kudos
Reply

1,125 Views
liuweiwei
Contributor I

I want to put one function to address 0xF31B  TO   0xF32D.

The following is my project.prm file.

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            0x2000 TO   0x3FFF; 

/* non-banked FLASH */
//      ROM_4000      = READ_ONLY   DATA_NEAR IBCC_NEAR  0x4000 TO   0x7FFF;
      ROM_C000      = READ_ONLY   DATA_NEAR IBCC_NEAR  0xF000 TO   0xFEFF;
     // ROM_C000      = READ_ONLY   DATA_NEAR IBCC_NEAR  0xC000 TO   0xFEFF; 
/*    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 */

    GLOBAL_RAM = NO_INIT/*READ_WRITE*/  DATA_FAR           0xF8000'G TO 0xFDFFF'G;
/* paged RAM:                                          0x1000 TO   0x1FFF; addressed through RPAGE */
//      RAM_F8        = READ_WRITE  DATA_FAR           0xF81000 TO 0xF81FFF;
//      RAM_F9        = READ_WRITE  DATA_FAR           0xF91000 TO 0xF91FFF;
//      RAM_FA        = READ_WRITE  DATA_FAR           0xFA1000 TO 0xFA1FFF;
//      RAM_FB        = READ_WRITE  DATA_FAR           0xFB1000 TO 0xFB1FFF;
 //     RAM_FC        = READ_WRITE  DATA_FAR           0xFC1000 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 0xE0BFFF;
      PAGE_E1       = READ_ONLY   DATA_FAR IBCC_FAR  0xE18000 TO 0xE1BFFF;
      PAGE_E2       = READ_ONLY   DATA_FAR IBCC_FAR  0xE28000 TO 0xE2BFFF;
      PAGE_E3       = READ_ONLY   DATA_FAR IBCC_FAR  0xE38000 TO 0xE3BFFF;
      PAGE_E4       = READ_ONLY   DATA_FAR IBCC_FAR  0xE48000 TO 0xE4BFFF;
      PAGE_E5       = READ_ONLY   DATA_FAR IBCC_FAR  0xE58000 TO 0xE5BFFF;
      PAGE_E6       = READ_ONLY   DATA_FAR IBCC_FAR  0xE68000 TO 0xE6BFFF;
      PAGE_E7       = READ_ONLY   DATA_FAR IBCC_FAR  0xE78000 TO 0xE7BFFF;

      PAGE_E8       = READ_ONLY   DATA_FAR IBCC_FAR  0xE88000 TO 0xE8BFFF;
      PAGE_E9       = READ_ONLY   DATA_FAR IBCC_FAR  0xE98000 TO 0xE9BFFF;
      PAGE_EA       = READ_ONLY   DATA_FAR IBCC_FAR  0xEA8000 TO 0xEABFFF;
      PAGE_EB       = READ_ONLY   DATA_FAR IBCC_FAR  0xEB8000 TO 0xEBBFFF;
      PAGE_EC       = READ_ONLY   DATA_FAR IBCC_FAR  0xEC8000 TO 0xECBFFF;
      PAGE_ED       = READ_ONLY   DATA_FAR IBCC_FAR  0xED8000 TO 0xEDBFFF;
      PAGE_EE       = READ_ONLY   DATA_FAR IBCC_FAR  0xEE8000 TO 0xEEBFFF;
      PAGE_EF       = READ_ONLY   DATA_FAR IBCC_FAR  0xEF8000 TO 0xEFBFFF;

      PAGE_F0       = READ_ONLY   DATA_FAR IBCC_FAR  0xF08000 TO 0xF0BFFF;
      PAGE_F1       = READ_ONLY   DATA_FAR IBCC_FAR  0xF18000 TO 0xF1BFFF;
      PAGE_F2       = READ_ONLY   DATA_FAR IBCC_FAR  0xF28000 TO 0xF2BFFF;
      PAGE_F3       = READ_ONLY   DATA_FAR IBCC_FAR  0xF38000 TO 0xF3BFFF;
      PAGE_F4       = READ_ONLY   DATA_FAR IBCC_FAR  0xF48000 TO 0xF4BFFF;
      PAGE_F5       = READ_ONLY   DATA_FAR IBCC_FAR  0xF58000 TO 0xF5BFFF;
      PAGE_F6       = READ_ONLY   DATA_FAR IBCC_FAR  0xF68000 TO 0xF6BFFF;
      PAGE_F7       = READ_ONLY   DATA_FAR IBCC_FAR  0xF78000 TO 0xF7BFFF;        

      PAGE_F8       = READ_ONLY   DATA_FAR IBCC_FAR  0xF88000 TO 0xF8BFFF;
      PAGE_F9       = READ_ONLY   DATA_FAR IBCC_FAR  0xF98000 TO 0xF9BFFF;
      PAGE_FA       = READ_ONLY   DATA_FAR IBCC_FAR  0xFA8000 TO 0xFABFFF;
      PAGE_FB       = READ_ONLY   DATA_FAR IBCC_FAR  0xFB8000 TO 0xFBBFFF;
      PAGE_FC       = READ_ONLY   DATA_FAR IBCC_FAR  0xFC8000 TO 0xFCBFFF; */
/*    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         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;

//      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_F8, RAM_F9, RAM_FA, 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;
      G_RAM         INTO  GLOBAL_RAM;                       
                              //RAM_FD, RAM_FC, RAM_FB, RAM_FA, RAM_F9, RAM_F8;
    //.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 0x100   /* size of the stack (will be allocated in DEFAULT_RAM) */

0 Kudos
Reply

1,125 Views
liuweiwei
Contributor I

mc9s12xdp512 and codewarrior 5.9.0

0 Kudos
Reply