Hi All,
I am implementing a software upgrade mechanism (burning a new image into a flash memory area).
The problem: I don't know how to change the load region address at runtime.
Flash contains booter and application Additionally I allocated an area for new sw application on the same flash. After burning the new sw into the allocated area on the flash, I want to run the new sw instead of the old one.
Booter already knows how to jump to the new code in the flash. The problem is that new and old code are both compiled with the same scatter loading region mapping, so when i run the new code from the new address it still uses the "old" scatter loading region, i.e. it loads my old code.
Is there a way of setting the LR address to be relative and not absolute.
Of course i can compile the new SW with new scatter mapping, but this doesn't help me, because i don't know if it will run as a "new" or "old" image.
Thanks in advance
I understood the question, I don't think you liked or understood the answer.
Use "Position Independent" code settings when generating your code output.
The Keil linker "freezes" a specific address into the binary object by fixing up and removing all relocation information.
If you want to "fix" the address being used at run time, or the time when you write into a specific memory address, then you're going to have to have access to the relocation information in the object file. And not from one where it has been completely stripped.
In the most simplistic sense have the linker build two copies of your binary, one at say 0x00444444, and a second at 0x00222222, and then DIFF the binaries and observe what and how much is different. Then look at how much additional information you'll need to "fix" that in your loader implementation.
Review "relocatable object file formats"
Hi,
Sorry but not sure I understand the answer.
I’m trying to focus only at load region address during the load time of scatter loading stage.
The C library function of __scatterload carries out code and data copying/decompressing (unpackaged from the load region address) – my problem is how to set a “dynamic” load address to load the RAM areas.
To my best understanding this can’t be achieved because load address is hard-coded in map file.
Thanks, Ronen
The .MAP simply reflects what the Linker has created.
What you need to do is Get a better understanding of how processor executes code. What causes address dependencies. How Linkers and Loaders manage different tasks. The difference between a binary file and an object file.
I suggested a very simple method to see how different things are, perhaps start by doing that and learning some basic things about the build process and tool functionality.
With all due respect I suggest you try to soften your criticism and be more helpful. Modest people are not preoccupied with themselves. Arrogant people have an inflated view of themselves.
You asked something and got the answer:
"The .MAP simply reflects what the Linker has created."
That is a perfectly correct answer and was followed by good suggestions of what you should study further.
I saw no criticism in what was written there.
Modest people are prepared to take advice. Arrogant people have an inflated view of themselves. I will ask you a rhetorical question: Which are you Ronen Wino ?
Hi All
The guy asked how to manipulate load regions, and he gets an answer - "go read and learn". The whole idea of forum is to share information for your experience and help with ideas. I believe Ronen did his "googling" and therefore posted here.
I am also interested in similar subject, and could not find solution in keil/arm documentation, nor in other sources, so posting here to follow the discussion.
Can anybody share a link to PI example
Thanks,.