There is a requirement that make one function in a fix address in the flash, how to implement this? Does anyone have any ideas?
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!
-----------------------------------------------------------------------------------------------------------------------
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) */
mc9s12xdp512 and codewarrior 5.9.0