// oops -- ’base’ is a token which has specific meaning
void __interrupt(irq(base)) isr(void)
void __interrupt(irq((TMR0)) isr(void) // oops -- one too many ’(’s
//oops -- is it meant to be low or high priority?
void __interrupt(irq(TMR0), high_priority, low_priority) tc0Int(void)
//oops -- using high_priority twice has no special meaning
void __interrupt(irq(TMR0), high_priority, high_priority) tc0Int(void)
irq()
argument to the
__interrupt()
specifier takes a comma-separated list of
interrupt vector numbers or symbols. At least one value or symbol must be present to
link this function to the interrupt source.
//oops -- irq() does not indicate the interrupt source
void __interrupt(irq(),high_priority) tc0Int(void)
base()
argument to the
__interrupt()
specifier is optional, but when used it must take
a comma-separated list of interrupt vector table addresses. At least one address
must be present to position the vector table. If you do not specify the base address
with an ISR, its vector will be located in an interrupt vector table located at an
address equal to the reset value of the IVTBASE register.
//oops -- base() was used but did not indicate a vector table address
void __interrupt(irq(TMR0), base()) tc0Int(void)
irq()
argument to the __interrupt()
specifier has been used more than once.
//oops -- is one of those sources wrong?
void __interrupt(irq(TMR0,TMR0)) tc0Int(void)
base()
argument to the
__interrupt()
specifier has been used more than once.
//oops -- is one of those base addresses wrong?
void __interrupt(irq(TMR0), base(0x100,0x100)) tc0Int(void)
irq()
argument to the __interrupt()
specifier does not correspond with an
interrupt source on this device.
//oops -- what interrupt source is TODO?
void __interrupt(irq(TODO),high_priority) tc0Int(void)
//oops -- this specifier requires specific argument, not a number
void __interrupt(0) isr(void)
irq()
.//oops -- base() needs a vector table address
void __interrupt(irq(TMR0), base(TMR0)) tc0Int(void)
base()
argument to the
__interrupt()
specifier is not valid for the target device. It
cannot, for example, be lower than the reset value of the IVTBASE register.
//oops -- the base() address is too low
void __interrupt(irq(TMR0), base(0x00)) tc0Int(void)
__interrupt()
specifier has been used with
something that is not a function.
// oops -- foobar is an int, not an ISR
__interrupt(irq(TMR0)) int foobar;
// oops -- base() can’t be used with a device that does not
// support vectored interrupts
void __interrupt(base(0x100)) myMidrangeISR(void)
base()
address for
each default.
void __interrupt(irq(default), base(0x100)) tc0Int(void) { ...
void __interrupt(irq(default), base(0x100)) tc1Int(void) { ...
// oops -- did you mean to use different different base() addresses?
void __interrupt(irq(TMR0), base(0x100)) tc0Int(void) { ...
void __interrupt(irq(TMR0), base(0x100)) tc1Int(void) { ...
// oops -- did you mean to use different different base() addresses?
irq()
argument to indicate the source or sources.
//oops -- what interrupt does this service?
void __interrupt(low_priority, base(0x100)) tc0Int(void)
irq()
argument to
specify an interrupt source, but the vector table has been disabled via the
configuration bits. Either re-enable vectored interrupts or use the priority keyword
in the __interrupt()
specifier to indicate the interrupt source.
#pragma config MVECEN=0
void __interrupt(irq(TMR0), base(0x100)) tc0Int(void)
// oops -- you cannot disable the vector table then allocate interrupt
// functions a vector source using irq()
#pragma config MVECEN=0
void __interrupt(high_priority) tc0Int(void) {...
void __interrupt(high_priority) tc1Int(void) {...
In a program for a device operating in legacy mode, an interrupt vector
in the indicated vector table has not been programmed with an address. The compiler
will program this vector with an address as specified by the
-mundefints
option.
The interrupt vector in the indicated vector table has not been
programmed with an address. The compiler will program this vector with an address as
specified by the -mundefints
option.
--RUNTIME
option is not valid.
--RUNTIME=default,+ivt:reset
Oops, the ivt
suboption requires a numeric address
as its argument.
The address specified with the ivt
sub-option is not
valid for the selected target device. It cannot, for example, be lower than the
reset value of the IVTBASE register.
The source code defines more than one IVT and no address was specified
with the ivt
sub-option to the --RUNTIME
option to
indicate which table should be selected at startup. The IVT with the lowest address
will be selected by the compiler. It is recommended that you always specify the
table address when using this option.
--RUNTIME
option was used to
specify a IVT address, but this address has not been specified in the source code
with any ISR. Check that the address in the option is correct, or check that the
base()
arguments to the __interrupt()
specifier are specified and are correct.
--RUNTIME=+ivt:0x100
Oops -- is this the right address? Nothing in the source code uses this base address.
near int foobar; // oops -- auto variables cannot use near
eeprom int serialNo; // oops -- can’t use eeprom with PIC18 devices
eeprom char foobar __at(0x40) = 99; // oops - absolute can’t be eeprom
const
or a bank specifier as
required.extern int tapCounter; // oops - how does the compiler access this?
int (*fp)(int);
int foobar;
fp = &foobar; // oops - a variable’s address cannot be assigned
void *
pointer) cannot
be used to hold the address of a function.
void *gp;
int myFunc(int);
gp = foobar; // oops - a function’s address cannot be assigned
unsigned long fib_rec(unsigned long n)
{
// the temporary result of the LHS call to fib_rec() might
// store the result in a temp that is clobbered during the RHS
// call to the same function
return ((n > 1) ? (fib_rec(n-1) + fib_rec(n-2)) : n);
}
The CCI does not permit the use of 24-bit floating point types. If you
require compliance, use the -no-short-float
and
-no-short-double
options, which will ensure the IEEE standard
32-bit floating-point type is used for float
and
double
types.
sizeof()
in expressions that must be
evaluated by the preprocess are no longer supported. Preprocessor macros defined by
the compiler, such as __SIZEOF_INT__
, can be used instead. This
does not affect the C operator sizeof()
which can be used in the
usual way.
#if (sizeof(int) > 2) // oops -- use (__SIZEOF_INT__ > 2) instead
@ address
construct. Instead, place
__at(address)
after the identifier in the
definition.
int foobar @ 0x100; // oops -- use __at(0x100) instead
short long
type. Instead consider an equivalent long int
type.
short long input; // oops -- consider input to be long when using CCI
short long
type specifiers has been replaced with
the more portable __int24
(replacing short long
)
and __uint24
(replacing unsigned short long
)
types.
short long input; // oops -- use __int24 as the type for input
__int24
type.
Instead the long int
type.
__int24 input; // oops -- use a long type when using CCI
__uint24
type.
Instead unsigned long int
type.
__uint24 input; // oops -- use an unsigned long type when using CCI
xc8-cc -mcpu=18f4520 -Wl,-Map main.c
Oops, the -Map
option requires a map filename, e.g.
-Wl,-Map=proj.map
.
-mprint-devices
option will display a list of
all chips that could be selected to build
for.xc8 -cc main.c
Oops, use the -mcpu
option to specify the device to
build for.
-mcpu
option.
xc8-cc -mcpu=pic io.c
Oops, the device name must be exactly one of those shown by
-mprint-devices
.
The option specified was not recognized by the top-level driver. The option in question will be passed further down the compiler tool chain, but this may cause errors or unexpected behavior.
The top-level driver was unable to locate the specified compiler tool in the usual locations. Ensure you have not moved files or directories inside the compiler install directory.
-N=16
Oops, the identifier length must be between 32 and 255.
xc8-cc -mcpu=18f4520 -fshort-double main.c
Oops, you cannot use 24-bit double
types with
C99.
xc8-cc -mcpu=16f1937 -mext=iar main.c
Oops, that language extension is not supported.
At present, C99-compliant libraries are not available for all devices. The C90-compliant libraries can be used with these device while still building your source code to the C99 standard. Alternatively, you may choose to build to the C90 standard.
Always use the -mext=cci
option to select the Common C
Interface.
xc8-cc -mcpu=18f4520 -Os main.c
Oops, you cannot select level 's' optimizations if this compiler is unlicensed.
This compiler’s license does not allow the requested compiler operating
mode. Since the --nofallback
option is enabled, the compiler has
produced this error and will not fall back to a lower optimization level. If you
believe that you are entitled to use the requested optimizations, this error might
indicate that your compiler is not be activated correctly.
The specified inline function has never been called and will not generate code. This message differs to (520) in that the function specified is marked as inline. You may choose to disable this message for all inline functions, but allow message (520) to be issued for all other unused functions.
-std
option is
not supported by the compiler. The compiler will use the C99 standard instead.
xc8-cc -mcpu=12f510 -std=c11 main.c
Oops, you cannot select the C11 standard.
The compiler no longer uses both the mode and optimization selection to
fully specify which optimizations are performed. All optimizations are now
controllable via the optimization level, which is selectable using the compiler’s
-O
option. Unlicensed compilers, however, cannot use all
levels.
The compiler has detected that something about the installation is not valid. This is most like due to compiler applications being deleted or moved.
With the code coverage feature enabled, functions cannot be inlined. This advisary is just reminding you that the indicated function will not be inlined while code coverage is still in effect.
Hexmate will pass through any type 3 records in the Hex files being processed, but if there is any conflict in the values specified for the CS or IP registers in these records, it will flag this error.
If you are calculating a CRC hash value using Hexmate and the polynomial value is zero, this warning will be triggered to indicate that you will be getting a trivial hash result. Typically this will occur if you have forgotten to set the polynomial value in the checksum option.
If you are calculating a CRC reading data words in the Hex file in
reverse order, you must specify a word width in bytes with Hexmate's
r
suboption to -CK
. If you are using the compiler driver, this is specified using the
revword
suboption to -mchecksum
.
If you are calculating a CRC reading data words in the Hex file in
reverse order, the word width can only be one of the values indicated in the
message. This value is specified with Hexmate's r
suboption to
-CK
. If you are using the compiler
driver, this is specified using the revword
suboption to
-mchecksum
.
If you are calculating a CRC reading data words in the Hex file in
reverse order, the starting and ending addresses must be multiples of the word width
specified in Hexmate's -CK
option or the compiler's -mchecksum
option.
PIC18 assembly projects must be set up to use one of the standard or
extended instructions sets. This message will be displayed if you have used an
extended instruction without having enabled the extended instruction set using the
-misa
option.
The file register address for this extended PIC18 instruction is out of range.
clrf [200] ; oops
; for extended instructions, the file operand must be less than, for example, 0x60
This is the output message of the MESSG
assembler
directive.
This is the output of the ERROR
assembler
directive.
The assembler controls of the form OPT CONTROL
should no longer be used. Equivalent directives are available and can be formed by
removing the OPT
token from the control. Instead of using
OPT TITLE "My great project"
, for example, use TITLE
"My great project"
.
The LIST
assembler control previously allows the input
source to be specified using the r
LIST option. This should no
longer be used. Use the RADIX directive instead. Instead of using OPT LIST
r=hex
, for example, use RADIX hex
.
The -mcpu
driver option sets the target device being
built for. The PROCESSOR
directive may be used, if required, to
ensure that an assembly source file is only ever built for the specified device. If
there is a mismatch in the device specified by the option and the directive, this
message will be displayed.