Specifications

CAVR-4
Part 1. Using the compiler
Placing code and data
47
In the linker command file it can look like this:
-Z(CODE)CODE=0-1FFF
USER-DEFINED SEGMENTS
If you create your own segments—see Controlling data and function placement, page
47—these must also be defined in the linker command file using the -Z or -P segment
control directives. In the linker command file it can look like this:
-Z(CODE)MYSEGMENT=100-2FF
Compiler-generated segments
The compiler uses a set of internally generated segments, which are used for storing
information that is vital to the operation of the program.
The SWITCH segment which contains data statements used in the switch library
routines. These tables are encoded in such a way as to use as little space as possible.
The INITTAB segment contains the segment initialization description blocks that
are used by the
__segment_init function which is called by CSTARTUP. This table
consist of a number of SegmentInitBlock_Type objects. This type is declared in
the segment_init.h file which is located in the avr\src\lib directory.
The DIFUNCT segment is only used when a source file has been compiled in C++
mode and the file contains global objects (class instances). The segment will then
contain a number of function pointers that point to constructor code that should be
performed for each object.
In the linker command file it can look like this:
-Z(CODE)SWITCH,INITTAB,DIFUNCT=0-1FFF
Efficient usage of segments and memory
This section lists several features and methods to help you manage memory and
segments.
CONTROLLING DATA AND FUNCTION PLACEMENT
The @ operator, alternatively the #pragma location directive, can be used for placing
global and static variables at absolute addresses. The syntax can also be used for placing
variables or functions in named segments. The variables must be declared either
__no_init or const. If declared const, it is legal for them to have initializers. The
named segment can either be a predefined segment, or a user-defined segment.