Linker Directives
mikroBasic PRO for ARM uses internal algorithm to distribute objects within memory. If you need to have a variable or routine at the specific predefined address, use the linker directives absolute
and org
.
When using these directives, be sure to use them in proper memory segments, i.e. for functions it is the KSEG0 and for variables it is the KSEG1. Linker directives are used with the virtual addresses.
Directive absolute
Directive absolute
specifies the starting address in RAM for a variable. If the variable is multi-byte, higher bytes will be stored at the consecutive locations.
Directive absolute
is appended to declaration of a variable:
' Variable x will occupy 1 word (16 bits) at address 0x20000000 dim x as word absolute 0x20000000 ' Variable y will occupy 2 words at addresses 0x20000000 and 0x20000002 dim y as longint absolute 0x20000000
Be careful when using the absolute
directive, as you may overlap two variables by accident. For example:
dim i as word absolute 0x20000002 ' Variable i will occupy 1 word at address 0x200000002 dim jj as longint absolute 0x20000000 ' Variable will occupy 2 words at 0x20000000 and 0x20000002; thus, ' changing i changes jj at the same time and vice versa
Directive org
Directive org
specifies the starting address of a constant or a routine in ROM. It is appended to the constant or a routine declaration.
To place a constant array in Flash memory, write the following :
' Constant array MONTHS will be placed starting from the address 0x70000 const MONTHS as byte[12] = (31,28,31,30,31,30,31,31,30,31,30,31) org 0x70000
If you want to place simple type constant into Flash memory, instead of following declaration:
const SimpleConstant as byte = 0x2A org 0x70000
use an array consisting of single element :
const SimpleConstant as byte[1] = (0xAA) org 0x70000
In first case, compiler will recognize your attempt, but in order to save Flash space, and boost performance, it will automatically replace all instances of this constant in code with it's literal value.
In the second case your constant will be placed in Flash in the exact location specified.
To place a routine on a specific address in Flash memory you should write the following :
sub procedure proc(dim par as word) org 0x70000 ' Procedure will start at the address 0x70000; ... end sub
org
directive can be used with main
routine too. For example:
program Led_Blinking main: org 0x70000 ' main procedure starts at 0x70000 ... end
Directive orgall
Use the orgall
directive to specify the address above which all routines and constants will be placed. Example:
main: orgall(0x70000) ' All the routines, constants in main program will be above the address 0x70000 ... end.
What do you think about this topic ? Send us feedback!