User manual

198
mikoC PRO for dsPIC
MikroElektronika
Duration
Duration, closely related to a storage class, denes a period during which the declared identiers have real, physical
objects allocated in memory. We also distinguish between compile-time and run-time objects. Variables, for instance,
unlike typedefs and types, have real memory allocated during run time. There are two kinds of duration: static and
local.
Static Duration
Memory is allocated to objects with static duration as soon as execution is underway; this storage allocation lasts until
the program terminates. Static duration objects usually reside in xed data segments allocated according to the memory
specier in force. All globals have static duration. All functions, wherever dened, are objects with static duration. Other
variables can be given static duration by using the explicit static or extern storage class speciers.
In the mikroC PRO for dsPIC30/33 and PIC24, static duration objects are not initialized to zero (or null) in the absence
of any explicit initializer.
Don’t mix static duration with le or global scope. An object can have static duration and local scope – see the example
below.
Local Duration
Local duration objects are also known as automatic objects. They are created on the stack (or in a register) when an
enclosing block or a function is entered. They are deallocated when the program exits that block or function. Local
duration objects must be explicitly initialized; otherwise, their contents are unpredictable.
The storage class specier auto can be used when declaring local duration variables, but it is usually redundant,
because auto is default for variables declared within a block.
An object with local duration also has local scope because it does not exist outside of its enclosing block. On the other
hand, a local scope object can have static duration. For example:
void f() {
/* local duration variable; init a upon every call to f */
int a = 1;
/* static duration variable; init b only upon rst call to f */
static int b = 1;
/* checkpoint! */
a++;
b++;
}
void main() {
/* At checkpoint, we will have: */
f(); // a=1, b=1, after rst call,
f(); // a=1, b=2, after second call,
f(); // a=1, b=3, after third call,
// etc.
}