The compiler looks for a special function named __STARTUP() when it compiles your source code. If it finds a function named '__STARTUP' (it is not required), the compiler causes it to be automatically called before global and static variables are initialized, and before main() is called. __STARTUP() is intended to initialize ports and data direction registers, and to make any other configuration before your program starts to run.
This example demonstrates the use of the __STARTUP() function. __STARTUP() modifies the default FUSE configuration, and sets the microcontroller's OPTION register.
Figure 3-1. source code init1.c
int i=5; void __STARTUP(void) { DDR(PORTL,OOOOOOOO); /* set all port L pins as output */ T2CNTRL=0x70; /* start timer 2 */ } void main(void) { while(1) /* loop forever */ PORTLD=TMR2LO; /* output low byte of timer T2 on port L */ }
Note: If an initial value is assigned to a global or static variable it may not be initialized as expected. Only variables located in bank 0 are initialized properly. To be sure the variable is initialized you must specify that the variable is to be located in bank 0. (i.e. int bank0 i = 0x55;). If one or more variables are initialized, the rest of RAM in bank 0 is cleared (set to zero).
Figure 3-2. compiler listing file output init1.lst
0008 05 int i=5; void __STARTUP(void) { DDR(PORTB,OOOOOOOO); /* set all port B pins as output */ 0200 BC A5 FF LD 0A5,#FF T2CNTRL=0x70; /* start timer 2 */ 0203 BC C6 70 LD 0C6,#70 } 0206 8E RET void main(void) { while(1) /* loop forever */ 0207 9D C0 LD A,0C0 PORTLD=TMR2LO; /* output low byte of timer T2 on port L */ 0209 9C D0 X A,0D0 020B FB JP 00207 } 0000 DD 6F LD SP,#06F 0002 AC 02 0C JMPL 0020C 020C AD 02 00 JSRL 00200 020F DF 00 LD S,#000 0211 DC 00 LD X,#000 0213 DE 6F LD B,#06F 0215 64 CLRA 0216 B2 X A,[X+] 0217 CE DRSZ B 0218 FC JP 00215 0219 BC 08 05 LD 008,#05 021C AC 02 07 JMPL 00207 ROM USAGE MAP 0000 to 0004 00FF to 0100 0200 to 021E Total ROM used 0026