This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

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
  • Hello,
    Regarding the Hard Fault exception. This took place because of the LSP of PC was 0. I fixed this . And now the only issue that I have is with the permision writes.
    I went throught the datasheet of LPC1768 and I noticed that the region 0x10004000 has exec rights.
    The program counter has LSB 1.
    I attached the scatter file again
    LR_IROM1 0x00000000 0x00080000 { ; load region size_region ER_IROM1 0x00000000 0x00080000 { ; load address = execution address *.o(RESET, +First) *(InRoot$$Sections) *.o(+RO) } RW_IRAM1 0x10000000 0x00004000 { ; RW data .ANY (+RW +ZI) } RW_IRAM2 0x10004000 0x00002000 { ; RW data *(section)

    }

    Regarding the scatter file the following memory mapping is generated for the variable ProgramRamToSpace

    Execution Region RW_IRAM2 (Base: 0x10004000, Size: 0x00000040, Max: 0x00002000, ABSOLUTE)

    Base Addr Size Type Attr Idx E Section Name Object

    0x10004000 0x00000040 Data RW 137 section copytoram.o.

    This variable includes function instructions. But its type is Data. Can i mark in someway this variable as thumb code type as the functions that are allocated in ROM. I read carefully your previous post and I think that the corrects instructions are saved in the buffer and the initial address of the function in the RAM is correct.

    Thank you for your time

    Best regards
    George

Reply
  • Hello,
    Regarding the Hard Fault exception. This took place because of the LSP of PC was 0. I fixed this . And now the only issue that I have is with the permision writes.
    I went throught the datasheet of LPC1768 and I noticed that the region 0x10004000 has exec rights.
    The program counter has LSB 1.
    I attached the scatter file again
    LR_IROM1 0x00000000 0x00080000 { ; load region size_region ER_IROM1 0x00000000 0x00080000 { ; load address = execution address *.o(RESET, +First) *(InRoot$$Sections) *.o(+RO) } RW_IRAM1 0x10000000 0x00004000 { ; RW data .ANY (+RW +ZI) } RW_IRAM2 0x10004000 0x00002000 { ; RW data *(section)

    }

    Regarding the scatter file the following memory mapping is generated for the variable ProgramRamToSpace

    Execution Region RW_IRAM2 (Base: 0x10004000, Size: 0x00000040, Max: 0x00002000, ABSOLUTE)

    Base Addr Size Type Attr Idx E Section Name Object

    0x10004000 0x00000040 Data RW 137 section copytoram.o.

    This variable includes function instructions. But its type is Data. Can i mark in someway this variable as thumb code type as the functions that are allocated in ROM. I read carefully your previous post and I think that the corrects instructions are saved in the buffer and the initial address of the function in the RAM is correct.

    Thank you for your time

    Best regards
    George

Children
No data