I've spent the last weeks debugging a strange problem in MikroC, and to do that I had to absolute position every function and variable to make sure the program did not change in RAM and ROM.
Here is how to do that:
Global and local variables
Add absolute 0xXXXX to place at address 0xXXXX. If you have an initialiser it must be placed BEFORE the absolute. E.g.:
unsigned short a absolute 0x0123;
unsigned short a = 1 absolute 0x0123;
unsigned short a[32] absolute 0x0123;
Variables need to be used somewhere to prevent the compiler from removing them. Also, the compiled code is different if the assignment is done on a separate line vs if it is done inline, which changes the size of functions.
For global variables they may be used in main simply by assigning to them. For arrays it's enough to assign something to the first position. E.g.:
a = 1;
a[0] = 1;
Function parameters
I have not been able to place these at absolute addresses
Internal library variables and function parameters
I have not been able to place these at absolute addresses
Functions
These are postfixed with org 0xXXXX:
void myFunc() org 0x0123 { ... }
You may also put the address after an extern declaration in an h file:
extern void myFunc() org 0x0123;
Library functions
These may also be positioned, just skip the function body:
void libraryFunction() org 0x0123;
Collisions
Variable collisions are common, in cases where the compiler has decided that they won't conflict. In those cases, it is not possible to absolute only one of the colliding variables, as the compiler won't place anything else on an address occupied by an absolute'd variable.
That means that you have to set all variables to absolute for that particular address - and if one of them is a function parameter you're out of luck it seems as those cannot be absolutely placed (or at least I don't know how)
No comments:
Post a Comment