jumping to code in RAM in a MPC55xx

2 messages, 1 author, 2008-07-20 · open the first message on its own page

jumping to code in RAM in a MPC55xx

From: Tehn Yit Chin <hidden>
Date: 2008-07-18 06:29:36

Hi,

This question is not directly related to linux, but a question on how to
execute code from.

My test code is as follows..

void ram(unsigned int cat) __attribute__ ((section(".ram_code")));
void ram1(void) __attribute__ ((section(".ram_code")));
void flash(void) __attribute__ ((section(".text")));
void flash1(unsigned int y) __attribute__ ((section(".text")));

void ram(unsigned int cat)
{
    unsigned int abc;

    abc += 12;
    abc += cat;
}

void ram1(void)
{
    ram(123);
}


void flash1(unsigned int y)
{
    unsigned int x;

    x = x + y;

}

void flash(void)
{
    unsigned int def;

    def += 12;

    asm (" bel ram1\n\t");
}

I have the section .ram_code mapped into the internal SRAM of the MPC55xx,
which starts at 0x40000000. Code in .text are mapped into MPC55xx's internal
FLASH, starting at 0x00000000.

When I attempt to link the code together,  I get the error

U:\src\applications\comms/fatdog.c(35,1): relocation truncated to fit:
R_PPC_REL24 against symbol `ram1' defined in .ram_code section in
U:\src\applications\comms\fatdog.o

I googled the error and I think it means that the ram1() is too far away and
the branch address has been truncated to fit into the binary.

Other than assembler bel instruction, I have also tried bl, b and bea and
all of them gave the same link error.

I was wondering if anyone can give some insight on how I can get the MPC55xx
to branch between FLASH and SRAM?

Many thanks,
Tehn Yit Chin

Re: jumping to code in RAM in a MPC55xx

From: Tehn Yit Chin <hidden>
Date: 2008-07-20 23:22:20

I am just going to answer my own questions for future reference.

I did some searching on the internet and came across this note on the
the usenet comp.sys.powerpc.tech

http://newsgroups.derkeiler.com/Archive/Comp/comp.sys.powerpc.tech/2005-11/msg00015.html

In summary, it performs a indirect jump to code via the CTR register.
The following code snippet show how it is done.

	lis	9,0xFC00 /* Function is at 0xFC000000 */
	mtctr	9
	bctrl


On Fri, Jul 18, 2008 at 4:29 PM, Tehn Yit Chin [off-list ref] wrote:
Hi,

This question is not directly related to linux, but a question on how to execute code from.

My test code is as follows..

void ram(unsigned int cat) __attribute__ ((section(".ram_code")));
void ram1(void) __attribute__ ((section(".ram_code")));
void flash(void) __attribute__ ((section(".text")));
void flash1(unsigned int y) __attribute__ ((section(".text")));

void ram(unsigned int cat)
{
    unsigned int abc;

    abc += 12;
    abc += cat;
}

void ram1(void)
{
    ram(123);
}


void flash1(unsigned int y)
{
    unsigned int x;

    x = x + y;

}

void flash(void)
{
    unsigned int def;

    def += 12;

    asm (" bel ram1\n\t");
}

I have the section .ram_code mapped into the internal SRAM of the MPC55xx, which starts at 0x40000000. Code in .text are mapped into MPC55xx's internal FLASH, starting at 0x00000000.

When I attempt to link the code together,  I get the error

U:\src\applications\comms/fatdog.c(35,1): relocation truncated to fit: R_PPC_REL24 against symbol `ram1' defined in .ram_code section in U:\src\applications\comms\fatdog.o

I googled the error and I think it means that the ram1() is too far away and the branch address has been truncated to fit into the binary.

Other than assembler bel instruction, I have also tried bl, b and bea and all of them gave the same link error.

I was wondering if anyone can give some insight on how I can get the MPC55xx to branch between FLASH and SRAM?

Many thanks,
Tehn Yit Chin
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help