Readme file for ICCAVR V2.26C
Updated: 12/Sep/2001 [IPEO]
Archived: $Revision: 1.17 $
Contents
Important information
- The cpu name to use with XLINK and XLIB is "a90", e.g.
-ca90
Assignment to a bitfield always generates a write access, sometimes also a read access.
The generic memory model currently does not work. It has therefore been
disabled in the compiler and in the IAR Embedded Workbench. However, the
__generic type pointer does work.
It is not stated clearly enough in the manuals that it is not possible to
use a CSTARTUP designed for ICCA90 (V1.xx). You must adapt the
CSTARTUP supplied with this version of the compiler. The main
reason for this is that ICCAVR supports EC++, and that ICCAVR uses a new
method for segment initialization.
Support for 64-bit doubles has been implemented. See also AVRG0002.
Support for long long ints has not yet been implemented. It will be supported by the compiler in the near
future. See also AVRG0003.
Upgrade information
New features
Known problems
where top and read are volatile variables.
There are two possible workarounds for this problem. The first one is
to disable variable clustering in the IAR Embedded Workbench. The second one
is to make sure that the loop body is not empty, e.g. place a
__no_operation() intrinsic call in the loop body:
while(top == read) __no_operation();
AVRC0003: (partially resolved)
Structure copying when using the large memory model with more than nine
registers locked will cause an internal error with the message:
Internal Error: [CgDriver]: Coloring failed
If the address calculations for the source or destination structure are
non-trivial, the compiler may crash when locking more than five registers.
Workaround: Lock fewer (nine or five) registers.
AVRC0002:
The float_complex and double_complex classes do not
work. The float_complex and double_complex classes are
currently broken due to an optimization in the library that resulted in
a name/macro conflict.
AVRG0003:
Support for long long int has not yet been implemented.
LB393:
The linker will often inappropriately generate warning [w6]. This
warning can safely be ignored if the names of the types referred to begin
with one or two underscore (_) characters.
LB263:
Objects referenced only from inline asm statements will be removed.
Workaround: Use the __require intrinsic function to create a
reference to the object, or use the __root attribute on the
object. Place the intrinsic call close to your inline assembler
code.
Program corrections
- EW10084:
Static functions can have tentative attribute, this caused the jump
optimization to fail.
- AVRC0054:
When setting a bit in a volatile variable the compiler wrongly updated the
first byte independent of the size of the variable causing wrong code generation
for types larger than char.
- AVRC0053:
Initializing a generic pointer with a constant value,
could cause a compiler internal error.
- LB400:
A loop of the form for (i=0; i < count; i++); could be executed
count + 1 times at the high speed optimization level.
- AVRC0050:
The script file build_one_lib.bat used constructs that are not available
in Windows 95/98.
- AVRC0049:
iom32.h defined wrong interrupt vector addresses.
- AVRC0048:
There was a missing code generation rule for __tinyflash.
- AVRC0047:
Calling a __nearfunc function immediately after a call
to a __farfunc function caused an compiler internal error.
- AVRC0046:
Combining __no_init with the __flash keyword caused a internal compiler error.
- AVRC0045:
Postincrement of dereferenced pointers to flash memory (__flash) resulted in an
internal error. Example: i = *fptr1++;
- AVRL0043:
The time conversion functions gmtime/mktime/asctime referenced an
undefined variable (_Mbstate).
Miscellaneous
Release history
ICCAVR V2.26B - 06/Jul/2001
ICCAVR V2.25E - 04/May/2001
NOTE:The behavior of the above statement is undefined according to
ANSI C (ANSI/ISO9899-1990 6.3).
- AVRC0009:
Using the intrinsic functions __load_program_memory and
__extended_load_program_memory caused an internal error.
- AVRC0008:
Trying to write to the flash memory caused an internal error.
- AVRL0003:
ctype.s90 was missing from all IAR CLIB libraries (clXX.r90), which
caused all table versions of the isXXXX functions to fail to
link.
ICCAVR V2.25B - 31/Oct/2000
- Atmel has renamed the registers, bits, and interrupt vector that is
related to the I2C-interface in the at94k-devices. The new names are
formed by replacing the I2 part of the name with TW.
See ioat94k.h for more details.
- AVRL0002 [20231_IAR]:
Inclusion of one floating point function caused the entire floating point
package to be included. This caused unused code to be included in the
final executable module, increasing the size by approximately 700 bytes.
Cause: The library segment parts were accidentally declared as ROOT segment
parts. Fixed by replacing RSEG CODE with RSEG CODE:CODE:NOROOT in the
library.
- AVRL0001:
When using locked registers and placing global variables in the locked
registers, the linker issues an error:
Error[e117]: Incompatible runtime models. Module ?REGISTER_REGVAR_L10
specifies that 'R15' must be 'VAR', but module ?REGISTER_CGREG_L10
has the value 'REG'
This is due to an error in the library module that contains the inter-module
consistency checks for global register variables.
- AVRC0007:
Dereferencing a tinyflash pointer gives an IE illegal state.
Example:
char __tinyflash* t=(char __tinyflash*)1;
*t;
Cause: Code generation rules were missing for __tinyflash.
AVRC0006 (Partially corrected):
A busy wait loop with nothing in the body of the loop, where the loop
condition contained one or more volatile variables, was considered to be
dead code if clustering of variables was enabled.
Example:
while(top == read);
where top and read are volatile variables.
This problem has been partially corrected, i.e. the fix has not been
validated to completely eliminate the problem.
There are two possible workarounds for this problem. The first is
to disable variable clustering in the IAR Embedded Workbench. The second
is to make sure that the loop body is not empty, e.g. place a
__no_operation() intrinsic call in the loop body:
while(top == read) __no_operation();
AVRC0005:
Using pointers to objects in the built-in EEPROM on targets with more than
256 bytes of built in EEPROM causes the toolset to emit an internal tool
error.
An error in setup of the parser caused the size of an EEPROM pointer to
be one (1) instead of two (2). This resulted in inconsistencies during
code generation, which when detected gave rise to the internal tool error
message.
AVRC0004:
The compiler gives error messages for the __eeprom keywords when using
--cpu.
An error in the code that handled the results from the command line parser
caused the information about the size of the built in EEPROM to be set to 0
bytes when the --cpu command line option was used to specify the target
processor, unless the size of the built in EEPROM was explicitly specified
on the command line, or from the options dialog in the IAR Embedded
Workbench.
AVRC0003 (Partially corrected):
Structure-copying when using the large memory model with more than nine
registers locked will cause an internal error with the message:
Internal Error: [CgDriver]: Coloring failed
If the address calculations for the source or destination structure are
non-trivial, the compiler may crash when locking more than five registers.
Workaround: Lock fewer (nine or five) registers.
This problem has been partially corrected. The problem is still in the
compiler, but will only be triggered in rare cases of high register
pressure.
AVRG0001:
The documentation for the license server was missing.
AVRG0000:
Problems with the new copy protection system.
ICCAVR V2.21H - 21/Jul/2000 [Pre-release]
- The compiler now tries to avoid saving and restoring registers that were
initially used by the code generator but later removed by the
optimizer.
- Inline assembler has been enabled.
- An intrinsic function, __reverse, has been added. It is
documented in the Manual corrections
readme file.
- A number of command line options have been added. They are documented in
the Manual corrections readme file.
--no_clustering - Disable clustering of variables
--enable_external_bus - Make cstartup enable the external bus
--do_cross_call - Force compiler to always run the cross-call optimization
--zero_register - Use R15 as zero register, i.e. R15 always contains zero
--64k_flash - Prohibit the compiler from using the RAMPZ register in -v2 through -v4
ICCAVR V2.20C - 1/Oct/1999 [Non-public release]
Copyright 2000-2001 IAR Systems. All rights reserved.