User manual
198
mikoC PRO for dsPIC
MikroElektronika
Duration
Duration, closely related to a storage class, denes a period during which the declared identiers 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
specier in force. All globals have static duration. All functions, wherever dened, are objects with static duration. Other
variables can be given static duration by using the explicit static or extern storage class speciers.
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 specier 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.
}