Professional Documents
Culture Documents
MPLAB XC8 C Compiler User Guide
MPLAB XC8 C Compiler User Guide
DS50002053D
MPLAB
XC8 C Compiler
Users Guide
DS50002053D-page 2 2012-2013 Microchip Technology Inc.
Information contained in this publication regarding device
applications and the like is provided only for your convenience
and can be superseded by updates. It is your responsibility to
ensure that your application meets with your specifications.
MICROCHIP MAKES NO REPRESENTATIONS OR
WARRANTIES OF ANY KIND WHETHER EXPRESS OR
IMPLIED, WRITTEN OR ORAL, STATUTORY OR
OTHERWISE, RELATED TO THE INFORMATION,
INCLUDING BUT NOT LIMITED TO ITS CONDITION,
QUALITY, PERFORMANCE, MERCHANTABILITY OR
FITNESS FOR PURPOSE. Microchip disclaims all liability
arising from this information and its use. Use of Microchip
devices in life support and/or safety applications is entirely at
the buyers risk, and the buyer agrees to defend, indemnify and
hold harmless Microchip from any and all damages, claims,
suits, or expenses resulting from such use. No licenses are
conveyed, implicitly or otherwise, under any Microchip
intellectual property rights.
Note the following details of the code protection feature on Microchip devices:
Microchip products meet the specification contained in their particular Microchip Data Sheet.
Microchip believes that its family of products is one of the most secure families of its kind on the market today, when used in the
intended manner and under normal conditions.
There are dishonest and possibly illegal methods used to breach the code protection feature. All of these methods, to our
knowledge, require using the Microchip products in a manner outside the operating specifications contained in Microchips Data
Sheets. Most likely, the person doing so is engaged in theft of intellectual property.
Microchip is willing to work with the customer who is concerned about the integrity of their code.
Neither Microchip nor any other semiconductor manufacturer can guarantee the security of their code. Code protection does not
mean that we are guaranteeing the product as unbreakable.
Code protection is constantly evolving. We at Microchip are committed to continuously improving the code protection features of our
products. Attempts to break Microchips code protection feature can be a violation of the Digital Millennium Copyright Act. If such acts
allow unauthorized access to your software or other copyrighted work, you can have a right to sue for relief under that Act.
Microchip received ISO/TS-16949:2009 certification for its worldwide
headquarters, design and wafer fabrication facilities in Chandler and
Tempe, Arizona; Gresham, Oregon and design centers in California
and India. The Companys quality system processes and procedures
are for its PIC
MCUs and dsPIC
DSCs, KEELOQ
code hopping
devices, Serial EEPROMs, microperipherals, nonvolatile memory and
analog products. In addition, Microchips quality system for the design
and manufacture of development systems is ISO 9001:2000 certified.
QUALITY MANAGEMENT SYSTEM
CERTIFIED BY DNV
== ISO/TS 16949 ==
Trademarks
The Microchip name and logo, the Microchip logo, dsPIC,
FlashFlex, KEELOQ, KEELOQ logo, MPLAB, PIC, PICmicro,
PICSTART, PIC
32
logo, rfPIC, SST, SST Logo, SuperFlash
and UNI/O are registered trademarks of Microchip Technology
Incorporated in the U.S.A. and other countries.
FilterLab, Hampshire, HI-TECH C, Linear Active Thermistor,
MTP, SEEVAL and The Embedded Control Solutions
Company are registered trademarks of Microchip Technology
Incorporated in the U.S.A.
Silicon Storage Technology is a registered trademark of
Microchip Technology Inc. in other countries.
Analog-for-the-Digital Age, Application Maestro, BodyCom,
chipKIT, chipKIT logo, CodeGuard, dsPICDEM,
dsPICDEM.net, dsPICworks, dsSPEAK, ECAN,
ECONOMONITOR, FanSense, HI-TIDE, In-Circuit Serial
Programming, ICSP, Mindi, MiWi, MPASM, MPF, MPLAB
Certified logo, MPLIB, MPLINK, mTouch, Omniscient Code
Generation, PICC, PICC-18, PICDEM, PICDEM.net, PICkit,
PICtail, REAL ICE, rfLAB, Select Mode, SQI, Serial Quad I/O,
Total Endurance, TSHARC, UniWinDriver, WiperLock, ZENA
and Z-Scale are trademarks of Microchip Technology
Incorporated in the U.S.A. and other countries.
SQTP is a service mark of Microchip Technology Incorporated
in the U.S.A.
GestIC and ULPP are registered trademarks of Microchip
Technology Germany II GmbH & Co. KG, a subsidiary of
Microchip Technology Inc., in other countries.
All other trademarks mentioned herein are property of their
respective companies.
2012-2013, Microchip Technology Incorporated, Printed in
the U.S.A., All Rights Reserved.
Printed on recycled paper.
ISBN: 978-1-62077-723-7
2012-2013 Microchip Technology Inc. DS50002053D-page 3
MPLAB
XC8 C COMPILER
USERS GUIDE
Table of Contents
Preface ........................................................................................................................... 7
Chapter 1. Compiler Overview
1.1 Introduction ................................................................................................... 13
1.2 Compiler Description and Documentation .................................................... 13
1.3 Device Description ....................................................................................... 14
Chapter 2. Common C Interface
2.1 Introduction ................................................................................................... 15
2.2 Background The Desire for Portable Code ............................................... 15
2.3 Using the CCI ............................................................................................... 18
2.4 ANSI Standard Refinement .......................................................................... 19
2.5 ANSI Standard Extensions ........................................................................... 27
2.6 Compiler Features ........................................................................................ 41
Chapter 3. How Tos
3.1 Introduction ................................................................................................... 43
3.2 Installing and Activating the Compiler .......................................................... 43
3.3 Invoking the Compiler ................................................................................... 45
3.4 Writing Source Code .................................................................................... 48
3.5 Getting My Application to Do What I Want ................................................... 59
3.6 Understanding the Compilation Process ...................................................... 64
3.7 Fixing Code That Does Not Work ................................................................. 72
Chapter 4. XC8 Command-line Driver
4.1 Introduction ................................................................................................... 77
4.2 Invoking the Compiler ................................................................................... 78
4.3 The Compilation Sequence .......................................................................... 81
4.4 Runtime Files ............................................................................................... 87
4.5 Compiler Output ........................................................................................... 89
4.6 Compiler Messages ...................................................................................... 91
4.7 MPLAB XC8 Driver Options ......................................................................... 96
4.8 Option Descriptions ...................................................................................... 97
4.9 MPLAB X Option Equivalents ..................................................................... 127
Chapter 5. C Language Features
5.1 Introduction ................................................................................................. 135
5.2 ANSI C Standard Issues ............................................................................ 135
5.3 Device-Related Features ............................................................................ 137
5.4 Supported Data Types and Variables ........................................................ 147
5.5 Memory Allocation and Access .................................................................. 168
5.6 Operators and Statements ......................................................................... 186
MPLAB
XC8 C COMPILER
USERS GUIDE
2012-2013 Microchip Technology Inc. DS50002053D-page 7
Preface
INTRODUCTION
This chapter contains general information that will be useful to know before using the
MPLAB
Integrated Development Environment for development systems tools. This list is
focused on the MPLAB IDE, MPLAB IDE Project Manager, MPLAB Editor and
MPLAB SIM simulator, as well as general editing and debugging features.
Programmers The latest information on Microchip programmers. These include
production programmers such as MPLAB REAL ICE in-circuit emulator, MPLAB
ICD 3 in-circuit debugger and MPLAB PM3 device programmers. Also included
are nonproduction development programmers such as PICSTART
Plus and
PICkit 2 and 3.
CUSTOMER SUPPORT
Users of Microchip products can receive assistance through several channels:
Distributor or Representative
Local Sales Office
Field Application Engineer (FAE)
Technical Support
Customers should contact their distributor, representative or field application engineer
(FAE) for support. Local sales offices are also available to help customers. A listing of
sales offices and locations is included in the back of this document.
Technical support is available through the web site at:
http://www.microchip.com/support
Preface
2012-2013 Microchip Technology Inc. DS50002053D-page 11
DOCUMENT REVISION HISTORY
Revision D (Dec 2013)
Added new information relating to the software stack and function reentrancy.
Added information relating to code profiling features offered by the compiler.
Removed information pertaining to MPLAB IDE v8.
Added new How Tos
Removed sections on OBJTOHEX and CROMWELL.
Added additional information relating to assembly code formats and operators.
Corrected Fletcher algorithms used by HEXMATE.
Added new driver options and updated existing option descriptions.
Added and updated macros, built-ins and functions in Library Function chapter.
Updated compiler warning and error messages.
Revision C (May 2013)
Added Embedded Compiler Compatibility Mode chapter.
Added information relating to new ELF/DWARF debugging files.
Added new driver options and updated existing option descriptions.
Updated MPLAB X IDE option dialog descriptions relating to compiler options.
Expanded information relating to the available optimizations.
Added code to illustrate checksum algorithms used by HEXMATE.
Updated compiler warning and error messages.
Updated information relating to list and map file contents.
Added information about multiplication routines.
Expanded information about eeprom variables and bit objects.
Expanded information relating to the configuration pragma.
Added information and examples using the __section() specifier.
Expanded and extended information relating to assembly code deviations and
assembler directives.
Revision B (July 2012)
Added How Tos chapter.
Expanded section relating to PIC18 erratas.
Updated the section relating to compiler optimization settings.
Updated MPLAB v8 and MPLAB X IDE project option dialogs.
Added sections describing PIC18 far qualifier and in-line function qualifier.
Expanded section describing the operation of the main() function
Expanded information about equivalent assembly symbols for Baseline parts.
Updated the table of predefined macro symbols.
Added section on #pragma addrqual
Added sections to do with in-lining functions
Updated diagrams and text associated with call graphs in the list file
Updated library function section to be consistent with packaged libraries
Added new compiler warnings and errors.
Added new chapter describing the Common C Interface Standard (CCI)
Revision A (February 2012)
Initial release of this document.
MPLAB
XC8 C COMPILER
USERS GUIDE
2012-2013 Microchip Technology Inc. DS50002053D-page 13
Chapter 1. Compiler Overview
1.1 INTRODUCTION
This chapter is an overview of the MPLAB
and Mac OS
X.
The compiler is available in three operating modes: Free, Standard or PRO. The Stan-
dard and PRO operating modes are licensed modes and require a serial number to
enable them. Free mode is available for unlicensed customers. The basic compiler
operation, supported devices and available memory are identical across all modes.
The modes only differ in the level of optimization employed by the compiler.
1.2.1 Conventions
Throughout this manual, the term compiler is used. It can refer to all, or a subset of,
the collection of applications that comprise the MPLAB XC8 C Compiler. When it is not
important to identify which application performed an action, it will be attributed to the
compiler.
Likewise, compiler is often used to refer to the command-line driver. Although specif-
ically, the driver for the MPLAB XC8 C Compiler package is called xc8. The driver and
its options are discussed in Section 4.7 MPLAB XC8 Driver Options. Accordingly,
compiler options commonly relates to command-line driver options.
In a similar fashion, compilation refers to all or a selection of steps involved in
generating source code into an executable binary image.
MPLAB
XC8 C COMPILER
USERS GUIDE
2012-2013 Microchip Technology Inc. DS50002053D-page 15
Chapter 2. Common C Interface
2.1 INTRODUCTION
The Common C Interface (CCI) is available with all MPLAB XC C compilers and is
designed to enhance code portability between these compilers. For example,
CCI-conforming code would make it easier to port from a PIC18 MCU using the MPLAB
XC8 C compiler to a PIC24 MCU using the MPLAB XC16 C compiler.
The CCI assumes that your source code already conforms to the ANSI Standard. If you
intend to use the CCI, it is your responsibility to write code that conforms. Legacy proj-
ects will need to be migrated to achieve conformance. A compiler option must also be
set to ensure that the operation of the compiler is consistent with the interface when the
project is built.
The following topics are examined in this chapter of the MPLAB XC8 C Compiler Users
Guide:
Background The Desire for Portable Code
Using the CCI
ANSI Standard Refinement
ANSI Standard Extensions
Compiler Features
2.2 BACKGROUND THE DESIRE FOR PORTABLE CODE
All programmers want to write portable source code.
Portability means that the same source code can be compiled and run in a different
execution environment than that for which it was written. Rarely can code be one hun-
dred percent portable, but the more tolerant it is to change, the less time and effort it
takes to have it running in a new environment.
Embedded engineers typically think of code portability as being across target devices,
but this is only part of the situation. The same code could be compiled for the same
target but with a different compiler. Differences between those compilers might lead to
the code failing at compile time or runtime, so this must be considered as well.
You can only write code for one target device and only use one brand of compiler, but
if there is no regulation of the compilers operation, simply updating your compiler
version can change your codes behavior.
Code must be portable across targets, tools, and time to be truly flexible.
Clearly, this portability cannot be achieved by the programmer alone, since the com-
piler vendors can base their products on different technologies, implement different fea-
tures and code syntax, or improve the way their product works. Many a great compiler
optimization has broken many an unsuspecting project.
Standards for the C language have been developed to ensure that change is managed
and code is more portable. The American National Standards Institute (ANSI) pub-
lishes standards for many disciplines, including programming languages. The ANSI C
Standard is a universally adopted standard for the C programming language.
MPLAB
XC8 C COMPILER
USERS GUIDE
2012-2013 Microchip Technology Inc. DS50002053D-page 43
Chapter 3. How Tos
3.1 INTRODUCTION
This section contains help and references for situations that are frequently encountered
when building projects for Microchip 8-bit devices. Click the links at the beginning of
each section to assist in finding the topic relevant to your question. Some topics are
indexed in multiple sections.
Start here:
Installing and Activating the Compiler
Invoking the Compiler
Writing Source Code
Getting My Application to Do What I Want
Understanding the Compilation Process
Fixing Code That Does Not Work
3.2 INSTALLING AND ACTIVATING THE COMPILER
This section details questions that might arise when installing or activating the compiler.
How Do I Install and Activate My Compiler?
How Can I Tell if the Compiler has Activated Successfully?
Can I Install More Than One Version of the Same Compiler?
3.2.1 How Do I Install and Activate My Compiler?
Installation of the compiler and activation of the license are performed simultaneously
by the XC compiler installer. The guide Installing and Licensing MPLAB XC C Compil-
ers (DS52059) is available on www.microchip.com. It provides details on single-user
and network licenses, as well as how to activate a compiler for evaluation purposes.
3.2.2 How Can I Tell if the Compiler has Activated Successfully?
If you think the compiler cannot have installed correctly or is not working, it is best to
verify its operation outside of MPLAB IDE to isolate possible problems. Try running the
compiler from the command line to check for correct operation. You do not have to
actually compile code.
From your terminal or DOS-prompt, run the compiler driver xc8 (see
Section 4.2 Invoking the Compiler) with the option --VER. This option instructs the
compiler to print version information and exit. Under Windows, for example, type the
following line (replacing the path information with a path that is relevant to your instal-
lation).
"C:\Program Files\Microchip\xc8\v1.00\bin\xc8" --ver
The compiler should run, print an informative banner and quit.
The operating mode is printed by the compiler each time you build. Note that if it is not
activated properly, the compiler will continue to operate, but only in the Free mode. If
an error is displayed, or the compiler indicates Free mode, your activation was not
successful.
MPLAB
XC8 C COMPILER
USERS GUIDE
2012-2013 Microchip Technology Inc. DS50002053D-page 77
Chapter 4. XC8 Command-line Driver
4.1 INTRODUCTION
The name of the command-line driver is xc8. MPLAB XC8 can be invoked to perform
all aspects of compilation, including C code generation, assembly, and link steps. Even
if an IDE is used to assist with compilation, the IDE will ultimately call xc8.
Although the internal compiler applications can be called explicitly from the command
line, the xc8 driver is the recommended way to use the compiler as it hides the com-
plexity of all the internal applications used and provides a consistent interface for all
compilation steps.
This chapter describes the steps that the driver takes during compilation, the files that
the driver can accept and produce, as well as the command-line options that control
the compilers operation. The relationship between these command-line options and
the controls in the MPLAB IDE Build Options dialog is also described.
The following topics are examined in this chapter of the MPLAB XC8 C Compiler Users
Guide:
Invoking the Compiler
The Compilation Sequence
Runtime Files
Compiler Output
Compiler Messages
MPLAB XC8 Driver Options
MPLAB X Option Equivalents
MPLAB
and Mac OS
ICD 2
icd3 MPLAB ICD 3
pickit2 PICkit 2
pickit3 PICkit 3
realice MPLAB REAL ICE in-circuit emulator
XC8 Command-line Driver
2012-2013 Microchip Technology Inc. DS50002053D-page 109
4.8.25 --EMI: Select External Memory Interface Operating Mode
The external memory interface available on some PIC18 devices can be operated in
several modes. The interface can operate in 16-bit modes; Word-write and Byte-select
modes or in an 8-bit mode: Byte-write mode. These modes are represented by those
specified in Table 4-10.
The selected mode will affect the code generated when writing to the external data
interface. In word write mode, dummy reads and writes can be added to ensure that an
even number of bytes are always written. In Byte-select or Byte-write modes, dummy
reads and writes are not generated and can result in more efficient code.
Note that this option does not pre-configure the device for operation in the selected
mode. See your device data sheet for the registers and settings that are used to
configure the devices external interface mode.
See Section 4.9 MPLAB X Option Equivalents, for use of this option in MPLAB
IDE.
TABLE 4-10: EXTERNAL MEMORY INTERFACE MODES
Mode Operation
wordwrite 16-bit Word-write mode (default)
byteselect 16-bit Byte-select mode
bytewrite 8-bit Byte-write mode
MPLAB
XC8 C COMPILER
USERS GUIDE
2012-2013 Microchip Technology Inc. DS50002053D-page 135
Chapter 5. C Language Features
5.1 INTRODUCTION
MPLAB XC8 C Compiler supports a number of special features and extensions to the
C language which are designed to ease the task of producing ROM-based applications
for 8-bit PIC devices. This chapter documents the special language features which are
specific to these devices.
ANSI C Standard Issues
Device-Related Features
Supported Data Types and Variables
Memory Allocation and Access
Operators and Statements
Register Usage
Functions
Interrupts
Main, Runtime Startup and Reset
Library Routines
Mixing C and Assembly Code
Optimizations
Preprocessing
Linking Programs
5.2 ANSI C STANDARD ISSUES
This compiler conforms to the ISO/IEC 9899:1990 Standard for programming lan-
guages. This is commonly called the C90 Standard. It is referred to as the ANSI C
Standard in this manual.
Some violations to the ANSI C Standard are indicated below in
Section 5.2.1 Divergence from the ANSI C Standard. Some features from the
later standard C99 are also supported.
5.2.1 Divergence from the ANSI C Standard
The C language implemented on MPLAB XC8 C Compiler can diverge from the ANSI
C Standard in several areas.
Due to limited memory and no hardware implementation of a data stack, recursion is
not supported and functions are not reentrant on baseline and some mid-range
devices. Functions can be encoded reentrantly for enhanced mid-range and PIC18
devices. See Section 5.3.4 Stacks for more information on the stack models used
by the compiler for each device family.
For those devices that do not support reentrancy, the compiler can make functions
called from main-line and interrupt code appear to be reentrant via a duplication
feature. See Section 5.9.6 Function Duplication.
MPLAB
ICD or
MPLAB ICD 2/3 debugger
(where X is empty, 2 or 3
Assigned 1 to indicate that the code is generated for
use with the Microchip MPLAB ICD,ICD 2 or ICD 3.
__MPLAB_PICKITX__ if compiling for MPLAB
PICkit 2/3
Assigned 1 to indicate that the code is generated for
use with the Microchip MPLAB PICKIT 2 or PICKIT 3.
__MPLAB_REALICE__ if compiling for MPLAB REAL
ICE
Assigned 1 to indicate that the code is generated for
use with the Microchip MPLAB REAL ICE.
__PICCPRO__ and
__PICC__
if any non-PIC18 device to indicate the target device is any PIC10/12/14/16
__PICC18__ if not in C18 compatibility mode to indicate non-C18 compatibility mode operation
__RESETBITS_ADDR if --RUNTIME option request
STATUS register save
indicates the address at which the STATUS register
will be saved
__TIME__ always to indicate the current time, e.g., 08:06:31.
__XC always indicates MPLAB XC compiler for Microchip in use
__XC8 always indicates MPLAB XC compiler for Microchip 8-bit
devices in use
__XC8_VERSION always to indicate the compilers version number multiplied
by 1000, e.g., v1.00 will be represented by 1000
_CHIPNAME when chip selected to indicate the specific chip type selected, e.g.,
_16F877
_BANKBITS_ always assigned 0, 1 or 2 to indicate 1, 2 or 4 available banks
or RAM
_BANKCOUNT_ always to indicate the number of banks of data memory
implemented
_COMMON_ if common RAM present to indicate whether device has common RAM area
_EEPROMSIZE always to indicate how many bytes of EEPROM are available
_ERRATA_TYPES always indicates the errata workarounds being applied, see
--ERRATA option Section 4.8.26
_FAMILY_FAMILY_
(1)
if PIC18 device indicates PIC18 family
C Language Features
2012-2013 Microchip Technology Inc. DS50002053D-page 225
Note 1: To determine the family macro relevant to your device, look for the FAMILY field in the picc-18.ini file
in the compiler's DAT directory.
_FLASH_ERASE_SIZE always size of flash erase block
_FLASH_WRITE_SIZE Always size of flash write block
_GPRBITS_ always assigned 0, 1 or 2 to indicate 1, 2 or 4 available banks
or general purpose RAM.
_HAS_OSCVAL_ if the target device has an oscil-
lator calibration register
to indicate target device can require oscillator
calibration
_HTC_EDITION_ always indicates which of PRO, Standard or Free compiler is
in use
Values of 2, 1 or 0 are assigned, respectively.
_HTC_VER_MAJOR_
_HTC_VER_MINOR_
always to indicate the whole or decimal component,
respectively, of the compilers version number
_HTC_VER_PATCH_
_HTC_VER_PLVL_
always to indicate the patch level of the compilers version
number
_MPC_ always indicates compiling for Microchip PIC MCU family
_OMNI_CODE_ always indicates compiling using an OCG compiler
_PIC12 if baseline (12-bit instruction)
device
to indicate selected device is a baseline PIC devices
_PIC12E if enhanced baseline (12-bit
instruction) device
to indicate selected device is an enhanced baseline
PIC devices
_PIC14 if mid-range (14-bit instruction)
device
to indicate selected device is a mid-range PIC devices
_PIC14E if Enhanced mid-range (14-bit
instruction) device
to indicate selected device is an Enhanced mid-range
PIC devices
_PIC18 if PIC18 (16-bit instruction)
device
to indicate selected device is an PIC18 devices
_PROGMEM_ if compiling for mid-range
device with flash memory
to indicate the type of flash memory employed by the
target device
values 0xFF (unknown), 0xF0 (none), 0 (read-only), 1
(word write with auto erase), 2 (block write with auto
erase), 3 (block write with manual erase)
_RAMSIZE if PIC18 device to indicate how many bytes of data memory are
available
_ROMSIZE always to indicate how much program memory is available
(byte units for PIC18 devices; words for other devices)
EEPROMSIZE always to indicate how many bytes of EEPROM are available
ERRATA_4000_BOUNDARY if the ERRATA_4000 applies to indicate that the 4000 word boundary errata is
applied
HI_TECH_C always to indicate that the C language variety is HI-TECH C
compatible
__TRADITIONAL18__ if PIC18 device to indicate the non-extended instruction set is
selected
__STRICT if the --STRICT option is
enabled
to indicate that strict ANSI compliance of keywords is
in force
MPLAB_ICD if compiling for MPLAB ICD or
MPLAB ICD 2/3 debugger
Assigned 1 to indicate that the code is generated for
use with the Microchip MPLAB ICD 1.
Assigned 2 for MPLAB ICD 2; 3 for MPLAB ICD 3.
TABLE 5-15: PREDEFINED MACROS (CONTINUED)
Symbol When set Usage
MPLAB
if(in>4)
scale=0;
code
generator
intresult;
floatscale;
int
getDat(void){
...
ORDER 1
3 x TSC235
2 x RC123a
ORDER 2
1 x TSD87
2 x XAM99
10 x TD66
R P
linker
P
S
E
C
T
t
e
x
t
,
c
l
a
s
s
=
C
O
D
E
m
o
v
l
w
(
?
_
b
a
r
r
r
2
)
&
0
f
f
h
m
o
v
w
f
f
s
r
0
m
o
v
l
w
(
?
_
s
r
v
)
&
0
f
f
h
m
o
v
w
f
(
?
?
_
m
a
i
n
+
0
+
0
)
m
o
v
f
f
s
r
0
,
w
m
o
v
w
f
(
?
?
_
m
a
i
n
+
0
+
0
+
1
)
m
o
v
l
w
1
2
m
o
v
w
f
(
?
?
_
m
a
i
n
+
0
+
0
+
2
)
u
6
0
:
m
o
v
f
(
?
?
_
m
a
i
n
+
0
+
0
)
,
w
P
S
E
C
T
b
s
s
B
A
N
K
0
,
c
l
a
s
s
=
B
A
N
K
0
,
s
p
a
c
e
=
1
g
l
o
b
a
l
_
_
p
b
s
s
C
O
M
M
O
N
_
_
p
b
s
s
C
O
M
M
O
N
:
_
c
:
d
s
1
_
m
o
r
e
:
d
s
8
P
S
E
C
T
c
s
t
a
c
k
B
A
N
K
0
,
c
l
a
s
s
=
B
A
N
K
0
,
s
p
a
c
e
=
1
g
l
o
b
a
l
_
_
p
c
s
t
a
c
k
B
A
N
K
0
_
_
p
c
s
t
a
c
k
B
A
N
K
0
:
g
l
o
b
a
l
?
_
_
_
f
t
g
e
?
_
_
_
f
t
g
e
:
;
@
0
x
0
g
l
o
b
a
l
?
_
_
_
f
t
m
u
l
?
_
_
_
f
t
m
u
l
:
;
@
0
x
0
g
l
o
b
a
l
?
_
f
r
e
x
p
?
_
f
r
e
x
p
:
;
@
0
x
0
g
l
o
b
a
l
_
_
_
f
t
m
u
l
@
f
1
_
_
_
f
t
m
u
l
@
f
1
:
;
3
b
y
t
e
s
@
0
x
0
P
S
E
C
T
t
e
x
t
,
c
l
a
s
s
=
C
O
D
E
f
c
a
l
l
_
s
r
v
m
o
v
l
w
(
?
_
b
a
r
r
r
2
)
&
0
f
f
h
m
o
v
w
f
f
s
r
0
m
o
v
l
w
(
?
_
s
r
v
)
&
0
f
f
h
m
o
v
w
f
(
?
?
_
m
a
i
n
+
0
+
0
)
m
o
v
f
f
s
r
0
,
w
m
o
v
w
f
(
?
?
_
m
a
i
n
+
0
+
0
+
1
)
m
o
v
l
w
1
2
m
o
v
w
f
(
?
?
_
m
a
i
n
+
0
+
0
+
2
)
u
6
0
:
m
o
v
f
(
?
?
_
m
a
i
n
+
0
+
0
)
,
w
m
o
v
w
f
f
s
r
0
MPLAB
XC8 C COMPILER
USERS GUIDE
2012-2013 Microchip Technology Inc. DS50002053D-page 255
Chapter 6. Macro Assembler
6.1 INTRODUCTION
Two macro assemblers are included with the MPLAB XC8 C Compiler to assemble
source files for all 8-bit PIC devices. The operation and assembler directives are almost
identical for both assemblers. The appropriate assembler application is invoked when
you use the compiler driver to build projects.
This chapter describes the usage of the assembler and the directives (assembler
pseudo-ops and controls) accepted by the assembler in the source files.
Although the term assembler is almost universally used to describe the tool that con-
verts human-readable mnemonics into machine code, both assembler and assem-
bly are used to describe the source code which such a tool reads. The latter is more
common and is used in this manual to describe the language. Thus you will see the
terms assembly language (or just assembly), assembly listing and other assembly
terms, but also, assembler options, assembler directive and assembler optimizer.
The following topics are examined in this chapter of the users guide:
Assembler Usage
Options
MPLAB XC8 Assembly Language
Assembly-Level Optimizations
Assembly List Files
6.2 ASSEMBLER USAGE
The assembler is called ASPIC18 for PIC18 devices and ASPIC for all other 8-bit
devices. It is available to run on Windows, Linux and Mac OS X systems. Note that the
assembler will not produce any messages unless there are errors or warnings there
are no assembly completed messages.
Typically the command-line driver, xc8, is used to invoke the assembler as it can be
passed assembler source files as input; however, the options for the assembler are
supplied here for instances where the assembler is being called directly, or when they
are specified using the command-line driver option --SETOPTION, see
Section 4.8.54 --SETOPTION: Set the Command-line Options for Application.
The usage of the assembler is similar under all of available operating systems. All com-
mand-line options are recognized in either upper or lower case. The basic command
format is shown:
ASPIC [ options ] files
files is a space-separated list of one or more assembler source files. Where more
than one source file is specified, the assembler treats them as a single module; i.e., a
single assembly will be performed on the concatenation of all the source files specified.
The files must be specified in full, no default extensions or suffixes are assumed.
options is an optional space-separated list of assembler options, each with a dash
as the first character in the case of single letter options, or double dashes in the case
of multi-letter options. The assembler options must be specified on the command line
before any files.
MPLAB
XC8 C COMPILER
USERS GUIDE
2012-2013 Microchip Technology Inc. DS50002053D-page 297
Chapter 7. Linker
7.1 INTRODUCTION
This chapter describes the theory behind, and the usage of, the linker.
The application name of the linker is HLINK. In most instances it will not be necessary
to invoke the linker directly, as the compiler driver, xc8, will automatically execute the
linker with all the necessary arguments. Using the linker directly is not simple, and
should be attempted only by those with a sound knowledge of the compiler, and linking
in general. The compiler often makes assumptions about the way in which the program
will be linked. If the psects are not linked correctly, code failure can result.
If it is absolutely necessary to use the linker directly, the best way to start is to copy the
linker arguments constructed by the compiler driver, and modify them as is appropriate.
This ensures that the necessary startup module and arguments are present.
The following topics are examined in this chapter of the MPLAB XC8 C Compiler Users
Guide:
Operation
Relocation and Psects
Map Files
7.2 OPERATION
A command to the linker takes the following form:
hlink [options] files
The options are zero or more linker options, each of which modifies the behavior of
the linker in some way. The files is one or more object files, and zero or more object
code library names (.lib extension).
Note that P-code libraries (.lpp extension) are always passed to the code generator
application. They cannot be passed to the linker.
MPLAB
XC8 C COMPILER
USERS GUIDE
2012-2013 Microchip Technology Inc. DS50002053D-page 313
Chapter 8. Utilities
8.1 INTRODUCTION
This chapter discusses some of the utility applications that are bundled with the
compiler.
The applications discussed in this chapter are those more commonly used, but you do
not typically need to execute them directly. Most of their features are invoked indirectly
by the command line driver that is based on the command-line arguments or MPLAB
X IDE project property selections.
The following applications are described in this chapter of the MPLAB XC8 C Compiler
Users Guide:
Librarian
HEXMATE
MPLAB
XC8 C COMPILER
USERS GUIDE
2012-2013 Microchip Technology Inc. DS50002053D-page 327
Appendix A. Library Functions
A.1 INTRODUCTION
The functions and preprocessor macros within the standard compiler library are
alphabetically listed in this chapter.
The synopsis indicates the header file in which a declaration or definition for function
or macro is found. It also shows the function prototype for functions, or the equivalent
prototype for macros.
Note that where printf() is shown in example code, this assumes that the putch()
function has been defined to suit the peripheral that will act as the stdout stream.
Initialization of that peripheral must also be performed before you attempt to print.
__BUILTIN_SOFTWARE_BREAKPOINT
Synopsis
#include <xc.h>
void __builtin_software_breakpoint(void);
Description
This builtin unconditionally inserts code into the program output which triggers a
software breakpoint when the code is executed using a debugger.
The software breakpoint code is only generated for mid-range and PIC18 devices.
Baseline devices do not support software breakpoints in this way, and the builtin will be
ignored if used with these devices.
Example
#include <xc.h>
int
main (void)
{
__builtin_software_breakpoint(); // stop here to begin
...
See also
__debug_break()
MPLAB
XC8 C COMPILER
USERS GUIDE
2012-2013 Microchip Technology Inc. DS50002053D-page 421
Appendix B. Embedded Compiler Compatibility Mode
B.1 INTRODUCTION
All three MPLAB XC C compilers can be placed into a compatibility mode. In this mode,
they are syntactically compatible with the non-standard C language extensions used by
other non-Microchip embedded compiler vendors. This compatibility allows C source
code written for other compilers to be compiled with minimum modification when using
the MPLAB XC compilers.
Since very different device architectures can be targeted by other compilers, the
semantics of the non-standard extensions can be different to that in the MPLAB XC
compilers. This document indicates when the original C code can need to be reviewed.
The compatibility features offered by the MPLAB C compilers are discussed in the
following topics:
Compiling in Compatibility Mode
Syntax Compatibility
Data Type
Operator
Extended Keywords
All assembly code specified by this construct is device-specific and will need
review when porting to any Microchip device.
Pragmas
B.2 COMPILING IN COMPATIBILITY MODE
An option is used to enable vendor-specific syntax compatibility. When using MPLAB
XC8, this option is --ext=vendor; when using MPLAB XC16 or MPLAB XC32, the
option is -mext=vendor. The argument vendor is a key that is used to represent the
syntax. See Table B-1 for a list of all keys usable with the MPLAB XC compilers.
The Common C Interface (CCI) is a language standard that is common to all Microchip
MPLAB XC compilers. The non-standard extensions associated with this syntax are
already described in Chapter 2. Common C Interface and are not repeated here.
TABLE B-1: VENDOR KEYS
Vendor
key
Syntax
XC8
Support
XC16
Support
XC32
Support
cci Common C Interface Yes Yes Yes
iar IAR C/C++ Compiler
TM
for ARM Yes Yes Yes
MPLAB
devices.
The header file <xc.h> must be included for supported functions to operate correctly.
TABLE B-6: SUPPORT FOR NON-STANDARD INTRINSIC FUNCTIONS
IAR Compatibility Mode
Function MPLAB XC8 MPLAB XC16 MPLAB XC32
__disable_fiq
1
support ignore ignore
__disable_interrupt support support support
__disable_irq
1
support ignore ignore
__enable_fiq
1
support ignore ignore
__enable_interrupt support support support
__enable_irq
1
support ignore ignore
__get_interrupt_state ignore support support
__set_interrupt_state ignore support support
MPLAB
XC8 C COMPILER
USERS GUIDE
2012-2013 Microchip Technology Inc. DS50002053D-page 427
Appendix C. Error and Warning Messages
C.1 INTRODUCTION
This chapter lists the MPLAB XC8 C Compiler error, warning, and advisory messages
with an explanation of each message. This is the complete and historical message set
covering all former HI-TECH C compilers and all compiler versions. Not all messages
shown here will be relevant for the compiler version you are using.
Most messages have been assigned a unique number that appears in brackets before
each message description. It is also printed by the compiler when the message is
issued. The messages shown here are sorted by their number. Un-numbered
messages appear toward the end and are sorted alphabetically.
The name of the application(s) that could have produced the messages are listed in
brackets opposite the error message. In some cases examples of code or options that
could trigger the error are given. The use of * in the error message is used to represent
a string that the compiler will substitute that is specific to that particular error.
Note that one problem in your C or assembler source code can trigger more than one
error message. You should attempt to resolve errors or warnings in the order in which
they are produced.
MESSAGES 1-249
(1) too many errors (*) (all applications)
The executing compiler application has encountered too many errors and will exit
immediately. Other uncompiled source files will be processed, but the compiler appli-
cations that would normally be executed in due course will not be run. The number of
errors that can be accepted is controlled using the --ERRORS option, See
Section 4.8.28 --ERRORS: Maximum Number of Errors.
(2) error/warning (*) generated, but no description available (all
applications)
The executing compiler application has emitted a message (advisory/warning/error),
but there is no description available in the message description file (MDF) to print. This
could be because the MDF is out-of-date, or the message issue has not been
translated into the selected language.
(3) malformed error information on line *, in file * (all applications)
The compiler has attempted to load the messages for the selected language, but the
message description file (MDF) was corrupted and could not be read correctly.
(100) unterminated #if[n][def] block from line * (Preprocessor)
A #if or similar block was not terminated with a matching #endif, for example:
#if INPUT /* error flagged here */
void main(void)
{
run();
} /* no #endif was found in this module */
MPLAB
XC8 C COMPILER
USERS GUIDE
2012-2013 Microchip Technology Inc. DS50002053D-page 541
Appendix D. Implementation-Defined Behavior
D.1 INTRODUCTION
This section discusses implementation-defined behavior for this implementa-
tion of the MPLAB XC8 C Compiler. The exact behavior of some C code can
vary from compiler to compiler, and the ANSI standard for C requires that ven-
dors document the specifics of implementation-defined features of the
language.
The number in brackets after each item refers to the section number in the
Standard to which the item relates.
D.2 TRANSLATION (G.3.1)
D.2.1 How a diagnostic is identified (5.1.1.3)
The format of diagnostics is fully controllable by the user. By default, when
compiling on the command-line the following formats are used. Always indi-
cated in the display is a unique message ID number. The string (warning)
is only displayed if the message is a warning.
filename: function()
linenumber:source line
^ (ID) message (warning)
or
filename: linenumber: (ID) message (warning)
where filename is the name of the file that contains the code (or empty if no
particular file is relevant); linenumber is the line number of the code (or 0 if
no line number is relevant); ID is a unique number that identifies the message;
and message is the diagnostic message itself.
D.3 ENVIRONMENT (G.3.2)
D.3.1 The semantics of arguments to main (5.1.2.2.1)
The function main has no arguments, nor return value. It follows the prototype:
void main(void);
MPLAB
XC8 C COMPILER
USERS GUIDE
2012-2013 Microchip Technology Inc. DS50002053D-page 549
Glossary
A
Absolute Section
A GCC compiler section with a fixed (absolute) address that cannot be changed by the
linker.
Absolute Variable/Function
A variable or function placed at an absolute address using the OCG compilers @
address syntax.
Access Memory
PIC18 Only Special registers on PIC18 devices that allow access regardless of the
setting of the Bank Select Register (BSR).
Access Entry Points
Access entry points provide a way to transfer control across segments to a function
which cannot be defined at link time. They support the separate linking of boot and
secure application segments.
Address
Value that identifies a location in memory.
Alphabetic Character
Alphabetic characters are those characters that are letters of the Arabic alphabet
(a, b, , z, A, B, , Z).
Alphanumeric
Alphanumeric characters are comprised of alphabetic characters and decimal digits
(0,1, , 9).
ANDed Breakpoints
Set up an ANDed condition for breaking, i.e., breakpoint 1 AND breakpoint 2 must
occur at the same time before a program halt. This can only be accomplished if a data
breakpoint and a program memory breakpoint occur at the same time.
Anonymous Structure
16-bit C Compiler An unnamed structure.
PIC18 C Compiler An unnamed structure that is a member of a C union. The mem-
bers of an anonymous structure can be accessed as if they were members of the
enclosing union. For example, in the following code, hi and lo are members of an
anonymous structure inside the union caster.
union castaway {
int intval;
struct {
char lo; //accessible as caster.lo
char hi; //accessible as caster.hi
};
} caster;
MPLAB
XC8 C COMPILER
USERS GUIDE
2012-2013 Microchip Technology Inc. DS50002053D-page 569
Index
Symbols
_ assembly label character .............................214, 266
__align qualifier ........................................................ 32
__bank qualifier........................................................ 31
__Bool type............................................................ 149
__builtin_software_breakpoint builtin..................... 327
__Bxxxx type symbols ........................................... 254
__CONFIG macro...........................................328, 329
__DATABANK macro............................................. 224
__DATE__ macro .................................................. 224
__DEBUG macro ................................................... 304
__debug_break macro ........................................... 330
__delay_ms macro................................................. 330
__delay_us macro.................................................. 330
__deprecate qualifier ............................................... 37
__eeprom qualifier ................................................... 33
__EEPROM_DATA macro..............................183, 331
__far qualifier ........................................................... 28
__FILE__ macro .................................................... 224
__FLASHTYPE macro ........................................... 224
__Hxxxx type symbols ........................................... 254
__IDLOC macro..............................................143, 332
__IDLOC7 macro............................................143, 333
__interrupt qualifier .................................................. 34
__J_PART macro................................................... 224
__LINE__ macro.................................................... 224
__LOG macro (REAL ICE)..................................... 146
__Lxxxx type symbols............................................ 254
__MPLAB_ICD__ macro........................................ 225
__MPLAB_ICDx__ macro...................................... 224
__MPLAB_PICKITx__ macro................................. 224
__MPLAB_REALICE__ macro............................... 224
__near qualifier ........................................................ 29
__pack qualifier ........................................................ 36
__persisten qualifier ................................................. 30
__PICC__ macro ................................................... 224
__PICC18__ macro ............................................... 224
__PICCPRO__ macro............................................ 224
__powerdown variable ........................................... 207
__resetbits variable................................................ 207
__RESETBITS_ADDR macro................................ 224
__section qualifier .................................................... 37
__serial0 label ........................................................ 123
__TIME__ macro ................................................... 224
__timeout variable.................................................. 207
__TRACE macro (REAL ICE) ................................ 146
__TRADITIONAL18__ macro ................................ 225
__XC macro........................................................... 224
__XC8 macro......................................................... 224
__XC8_VERSION macro....................................... 224
__xdata qualifier....................................................... 31
__ydata qualifier....................................................... 31
_16Fxxx type macros ............................................. 224
_BANKBITS_ macro .............................................. 224
_BANKCOUNT macro............................................ 224
_COMMON_ macro ............................................... 224
_delay function.................................. 63, 227, 334, 336
_EEPROMSIZE macro............................184, 224, 225
_ERRATA_TYPES macro...................................... 224
_FLASH_ERASE_SIZE macro .............................. 225
_FLASH_WRITE_SIZE macro............................... 225
_GPRBITS_ macro ................................................ 225
_HAS_OSCVAL macro .......................................... 225
_HTC_EDITION_ macro ........................................ 225
_HTC_VER_MAJOR_ macro................................. 225
_HTC_VER_MINOR_ macro ................................. 225
_HTC_VER_PATCH_ macro ................................. 225
_HTC_VER_PLVL_ macro..................................... 225
_MPC_ macro ........................................................ 225
_OMNI_CODE_ macro .......................................... 225
_PIC12 macro ........................................................ 225
_PIC12E macro...................................................... 225
_PIC14 macro ........................................................ 225
_PIC14E macro...................................................... 225
_PIC18 macro ........................................................ 225
_PROGMEM_ macro ............................................. 225
_RAMSIZE macro .................................................. 225
_READ_OSCCAL_DATA macro............................ 145
_ROMSIZE macro.................................................. 225
;; macro comment suppress character................... 279
? assembly label character .................................... 266
??nnnn type symbols ..................................... 267, 280
. (dot) linker load address character....................... 302
.as files, see assembly files
.asm files, see assembly files
.cmd files, see command files
.cmf files, see symbol files
.cof files, see COFF files
.d files, see dependency files
.dep files, see dependency files
.elf files, see ELF files
.h files, see header files
.hxl files, see hexmate log files
.lib files, see libraries
.lpp files, see libraries, p-code
.lst files, see assembly list files
.map files, see map files
.p1 files, see p-code files
.pre files, see preprocessed files
.pro files, see prototype files
.sdb files, see debug information
.sym files, see symbol files
MPLAB