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

copying code to ram and executing it

Hello,

I am using Keil uVision 5.15 compiler. copying a routine to ram(FLASH_eraseOneBlock) and try to runit,
the code crashes (hardware Fault). I have looked at Keil's ram function example and it does not
work either. my code is:

typedef void (*FunctionPointer_t)(uint32_t );
FunctionPointer_t ramFunc;
uint32_t executableRam[100];

void TxfrToRam(void)
{
    uint32_t source,source_end;
    uint32_t *dest,addr;

    source = (uint32_t)&FLASH_eraseOneBlock;
    source_end = (uint32_t)source + 80;
    dest = (uint32_t *)executableRam;
    ramFunc = (FunctionPointer_t)dest;
    while (source < source_end)
    {
        *dest++ = *(uint32_t *)source++;
    }
    for (addr = 0x2000; addr < 0x20000; addr += FLASH_PAGE_SIZE)
    {
        ramFunc(addr);
    }
}

Any help will be highly appreciated.

Thanks

Yash

Parents
  • Thanks everybody. I had multiple problems. The thumb mode was one of them. I was not able to get the linker script to automatically copy the code to ram, but my simple copy worked fine. Also I had timer interrupt enabled (in FLASH) which was also causing crash. step by step debugging always worked. Any way now those problems are solved. Thanks
    Yash

Reply
  • Thanks everybody. I had multiple problems. The thumb mode was one of them. I was not able to get the linker script to automatically copy the code to ram, but my simple copy worked fine. Also I had timer interrupt enabled (in FLASH) which was also causing crash. step by step debugging always worked. Any way now those problems are solved. Thanks
    Yash

Children
  • Note that the scatter file specifies two addresses for al regions.

    One address range where to store the variables/code in flash.
    One address range where to run the variables/code.

    So the linker can link a function to store in flash, but with addresses adjusted for running in RAM. That's the officially sanctioned way of getting correct binary code for use in RAM.