Table of Contents        Previous topic       Next topic       

C COMPILER->8051 Specific Features->Compatibility Features->Support for Keil extensions

The Crossware C compiler supports the following Keil extensions:

Additional Keywords

The keywords bit, sbit, data, bdata, idata, xdata,  sfr, sfr16, code, generic, using, reentrant, interrupt and _at_ are supported.  These translate the equivalent Crossware keywords _bit, _sftbit, _data, _bdata, _idata, _xdata, _sfr, _sfrword, _code, _generic, _using, _reentrant, _interrupt and _at respectively.

Support for these additional keywords is enabled by default and can be disabled using the /Kk command line option or by unchecking the Allow Keil keywords option in the Build->Settings->Compiler tab of the Embedded Development Studio.

Additional Formats

In addition, the compiler supports the following formats:

The interrupt, using and reentrant keywords can be placed after the interrupt function name (the using keyword must follow the interrupt keyword, not the otherway around).

The memory space qualifier of an object can positioned at the beginning of the declaration.  For example:

data char x is equivalent to char data x


data char xdata* p is equivalent to char xdata* data p.

Note that although you can now also use the Crossware _nonreentrant keyword after the function name, it is not recommended because when the default is for reentrant functions, any bit parameters will have been converted to unsigned chars before the compiler realises that the function is non-reentrant.  The information that the object was originally declared as a bit is not available and so the compiler cannot reparse the parameter list converting them back to bits.

Instrinsic Functions

The Crossware C compiler also supports the Keil intrinsic functions except for  _chkfloat_().

These are defined in intrins.h either as macros or intrinic functions.  _nop_() and _testbit_() are macros and _cror_(), _iror_(), _lror_(), _crol_(), _irol_() and _lrol_() are intrinic functions hard coded into the compiler.

By declaring _testbit_() as a macro, it can be used on any integral object that is being used as a boolean flag, not just bits.  Therefore in the case of reentrant functions, when automatic bits are quitely converted to unsigned chars, _testbit_() will continue to function correctly.