Hi, ALL:
Tools
Micro: MPC5604B
IDE: codeworrior IDE version 5.9.0
Question:
I have a question about using .lcf. I want to allocate my code into two flash blocks.
one is in Code Flash Sector 0(start addrees:0x00000000 end address:0x00007FFF), the other is in Code Flash Sector 6(start addrees:0x00040000 end address:0x0005FFFF). The first one is placed in text section, the second one is placed in internal_flash.
The updated .lcf file is shown below:
MEMORY
{
resetvector: org = 0x00000000, len = 0x00000008
init: org = 0x00000020, len = 0x00000FE0
interrupts_flash: org = 0x00041000, len = 0x00001000
internal_flash: org = 0x00042000, len = 0x0003E000
internal_ram: org = 0x40000000, len = 0x00006600
heap : org = 0x40006600, len = 0x00000900
stack : org = 0x40007000, len = 0x00001000
}
/* This will ensure the rchw and reset vector are not stripped by the linker */
FORCEACTIVE { "bam_rchw" "bam_resetvector"}
SECTIONS
{
.__bam_bootarea LOAD (0x00000000): {} > resetvector
GROUP : {
.init LOAD (0x00000020) : {}
.init_vle (VLECODE) LOAD (_e_init) : {
*(.init)
*(.init_vle)
}
} > init
GROUP : { /* Note: _e_ prefix enables load after END of that specified section */
.ivor_branch_table (VLECODE) LOAD (ADDR(interrupts_flash)) : {}
.intc_hw_branch_table (VLECODE) LOAD (_e_ivor_branch_table) ALIGN (0x800) : {}
.ivor_handlers (VLECODE) LOAD (_e_intc_hw_branch_table) : {} /* Each MPC555x handler require 16B alignmt */
} > interrupts_flash
GROUP : {
.intc_sw_isr_vector_table ALIGN (2048) : {} /* For INTC in SW Vector Mode */
.text : {}
.text_vle (VLECODE) ALIGN(0x08): {
*(.text)
*(.text_vle)
}
.rodata (CONST) : {
*(.rdata)
*(.rodata)
}
.ctors : {}
.dtors : {}
extab : {}
extabindex : {}
} > internal_flash
GROUP : {
.__uninitialized_intc_handlertable ALIGN(0x08) : {}
.data : {}
.sdata : {}
.sbss : {}
.sdata2 : {}
.sbss2 : {}
.bss : {}
} > internal_ram
}
/* Freescale CodeWarrior compiler address designations */
_stack_addr = ADDR(stack)+SIZEOF(stack);
_stack_end = ADDR(stack);
_heap_addr = ADDR(heap);
_heap_end = ADDR(heap)+SIZEOF(heap);
__IVPR_VALUE = ADDR(interrupts_flash);
/* L2 SRAM Location (used for L2 SRAM initialization) */
L2SRAM_LOCATION = 0x40000000;
Then modify the rom image address as below:


When I compile and link the code , warning message will be shown:


If I change the ROM image address to 0x00042000 (equal to internal_flash address). There are no warning message.
In my understanding, the objects stored in flash should be code or constant data, so their virtual address should be equal to ROM address. They needn't copy operation. but actually the address are not the same.

Why? what's the relationship between ROM image address and memory allocation?
Thanks for your reply.
Best Regards
Bryce