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

access to function using absolute addr

Hi,everyone ,I'm trying to access my function using its absolute address.It works when I debug it in KEIL step by step,but it jump to hard fault when runs.
my code is as below:

ptr=(int(*)(int))0x240; //0x240 is the address my function locates.
c=ptr(2);

And I've also met a very similar problem.The program jumps to hard fault when I have function(placed in a single file)placed in a special section .And the placement is fulfilled by sct file like this(fsk_tx.c):

; *************************************************************

LR_IROM1 0x00000000 0x00008000 { ; load region size_region ER_IROM1 0x00000000 0x00007000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO)

} ER_ROM 0x00007000 0X1000 { fsk_tx.o } ER_RAM 0x1FFFFB00 0X100 {

} RW_IRAM1 0x1FFFFD00 0x00000300 { ; RW data .ANY (+RW +ZI) } RW_IRAM2 0x20000000 0x00000C00 { .ANY (+RW +ZI) *(runinram) }
}

And the program works if I comment the fsk_tx.o in the sct file.

I'm really puzzled about it ,and I have to make it work soon.
Thanks !

Parents Reply Children
  • I don't know what else should I copy from.The assembly code in flash is almost the same besides address.
    Maybe I can transfer the question as:I want to have the function load in flash but execute in ram,meanwhile I want to know where is it loaded.Can I change the scatter file or should I get to know how does the keil do when execute __main? Thanks!

  • Hi,Westonsupermare Pier. Thanks! You maybe right.I tried to make KEIL fulfill the copy procedure itself by its __main.(through sct file,though I don't know the detail).
    And when I trace the code loaded in flash I find there are something else after :
    BX lr

    I guess it maybe some procedures restoring. So I think it should be the reason that I failed to copy the entirely function to the RAM.But what's the real length I should copy,I'm still confusing.I will think it more.

  • If you want to copy the function yourself, you should bracket the function by having it in a region that you can get the size of. Or maybe adding an extra function below so you can see the start address of the second function.

    It really is best to have the startup code copy the function into RAM.

  • Thank you very much,Per Westermark. So it's a question about how to get the right size of a function.I will try both.