LPC1768 copy function code for flash to RAM

I use the LPC1768 board and I want to copy a function from flash to RAM in runtime. I use the following code

void f()
{ int x=0; printf("%d\n",x);
} void g()
{ int x=5; printf("Hello: g"); printf("%d\n",x);
} int main(void)
{ char c; static void (*fnRAM_code)(void) = &f; int offset= (int)((long)g-(long)f); int i=0; int z=0; int *x; extern void uart0_init(void); unsigned char *pCodeStart = (unsigned char *)f;

uart0_init();

//(*fnRAM_code)();

//thump2 addresss /* Thumb 2 address */ pCodeStart = (unsigned char *)(((unsigned int)pCodeStart) & ~0x1); while (i < PROG_SIZE) { ProgRamSpace[i] = pCodeStart[i]; i++;

} (*fnRAM_code)(); fnRAM_code = (void(*)(void))(ProgRamSpace); (*fnRAM_code)();
}


But when I access the new address of the function I get the following error access violation at 0x100000018: no execute /read permision. Can anyone provide a solution for this issue

Best regards,
George

The scatter file is the following
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x00000000 0x00080000 { ; load region size_region ER_IROM1 0x00000000 0x00080000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x10000000 0x00008000 { ; RW data .ANY (+RW +ZI) } }

Parents
  • It's real hard to determine the size of a compiled function and it's literal pool, or the relative position to branch to external subroutines, etc.

    Thumb code needs to be copied to 16-bit half-word address, but execution will be at an ODD address, nominally the base address you copied to plus one.

    The RAM may, or may not, permit execution, don't know about NXP/LPC, but others fault at 0x10000000, but work at 0x20000000

    Try a little assembler code fragment that sets R0 with a value and returns, and print the result from that.

Reply
  • It's real hard to determine the size of a compiled function and it's literal pool, or the relative position to branch to external subroutines, etc.

    Thumb code needs to be copied to 16-bit half-word address, but execution will be at an ODD address, nominally the base address you copied to plus one.

    The RAM may, or may not, permit execution, don't know about NXP/LPC, but others fault at 0x10000000, but work at 0x20000000

    Try a little assembler code fragment that sets R0 with a value and returns, and print the result from that.

Children
More questions in this forum