00001 //----------------------------------------------------------------------------- 00002 // xcompiler_defs.h 00003 //----------------------------------------------------------------------------- 00004 00005 /* This is a modified version of the compilers_defs.h header from Silabs. 00006 * The pourpose is to provide a more cross-platform and standard proposal, 00007 * for example, it will be more C99 compliant. 00008 * 00009 * The number of compatible compilers will be reduced, at this moment are: 00010 * Architecture 8051: SDCC, Keil 00011 * Architecture x86 (32 bits): 00012 * Architecture ARM Cortex-M3: 00013 00014 * Only common characteristics for any compiler in a given architecture will be maintained, so macros available are: 00015 * SRF(), SBIT(), SFR16() 00016 00017 * Types: uin8_t, int8_t, uin16_t, int16_t, uint32_t, int32_t 00018 00019 */ 00020 00021 00022 00023 00024 00025 00026 // Portions of this file are copyright Maarten Brock 00027 // http://sdcc.sourceforge.net 00028 // Portions of this file are copyright 2010, Silicon Laboratories, Inc. 00029 // http://www.silabs.com 00030 // 00031 // GNU LGPL boilerplate: 00050 // Program Description: 00051 // 00052 // **Important Note**: This header file should be included before including 00053 // a device-specific header file such as C8051F300_defs.h. 00054 // 00055 // Macro definitions to accomodate 8051 compiler differences in specifying 00056 // special function registers and other 8051-specific features such as NOP 00057 // generation, and locating variables in memory-specific segments. The 00058 // compilers are identified by their unique predefined macros. See also: 00059 // http://predef.sourceforge.net/precomp.html 00060 // 00061 // SBIT and SFR define special bit and special function registers at the given 00062 // address. SFR16 and SFR32 define sfr combinations at adjacent addresses in 00063 // little-endian format. SFR16E and SFR32E define sfr combinations without 00064 // prerequisite byte order or adjacency. None of these multi-byte sfr 00065 // combinations will guarantee the order in which they are accessed when read 00066 // or written. 00067 // 00068 // SFR16X and SFR32X for 16 bit and 32 bit xdata registers are not defined 00069 // to avoid portability issues because of compiler endianness. 00070 // 00071 // Example: 00072 // // my_mcu.c: main 'c' file for my mcu 00073 // #include <compiler_defs.h> // this file 00074 // #include <C8051xxxx_defs.h> // SFR definitions for specific MCU target 00075 // 00076 // SBIT (P0_1, 0x80, 1); // Port 0 pin 1 00077 // SFR (P0, 0x80); // Port 0 00078 // SFRX (CPUCS, 0xE600); // Cypress FX2 Control and Status register in 00079 // // xdata memory at 0xE600 00080 // SFR16 (TMR2, 0xCC); // Timer 2, lsb at 0xCC, msb at 0xCD 00081 // SFR16E(TMR0, 0x8C8A); // Timer 0, lsb at 0x8A, msb at 0x8C 00082 // SFR32 (MAC0ACC, 0x93); // SiLabs C8051F120 32 bits MAC0 Accumulator, 00083 // // lsb at 0x93, msb at 0x96 00084 // SFR32E(SUMR, 0xE5E4E3E2); // TI MSC1210 SUMR 32 bits Summation register, 00085 // // lsb at 0xE2, msb at 0xE5 00086 // 00087 // Target: C8051xxxx 00088 // Tool chain: Generic 00089 // Command Line: None 00090 // 00091 // Release 2.3 - 27 MAY 2010 (DM) 00092 // -Removed 'LOCATED_VARIABLE' pragma from Keil because it is not supported 00093 // Release 2.2 - 06 APR 2010 (ES) 00094 // -Removed 'PATHINCLUDE' pragma from Raisonance section 00095 // Release 2.1 - 16 JUL 2009 (ES) 00096 // -Added SEGMENT_POINTER macro definitions for SDCC, Keil, and Raisonance 00097 // -Added LOCATED_VARIABLE_NO_INIT macro definitions for Raisonance 00098 // Release 2.0 - 19 MAY 2009 (ES) 00099 // -Added LOCATED_VARIABLE_NO_INIT macro definitions for SDCC and Keil 00100 // Release 1.9 - 23 OCT 2008 (ES) 00101 // -Updated Hi-Tech INTERRUPT and INTERRUPT_USING macro definitions 00102 // -Added SFR16 macro defintion for Hi-Tech 00103 // Release 1.8 - 31 JUL 2008 (ES) 00104 // -Added INTERRUPT_USING and FUNCTION_USING macro's 00105 // -Added macro's for IAR 00106 // -Corrected Union definitions for Hi-Tech and added SFR16 macro defintion 00107 // Release 1.7 - 11 SEP 2007 (BW) 00108 // -Added support for Raisonance EVAL 03.03.42 and Tasking Eval 7.2r1 00109 // Release 1.6 - 27 AUG 2007 (BW) 00110 // -Updated copyright notice per agreement with Maartin Brock 00111 // -Added SDCC 2.7.0 "compiler.h" bug fixes 00112 // -Added memory segment defines (SEG_XDATA, for example) 00113 // Release 1.5 - 24 AUG 2007 (BW) 00114 // -Added support for NOP () macro 00115 // -Added support for Hi-Tech ver 9.01 00116 // Release 1.4 - 07 AUG 2007 (PKC) 00117 // -Removed FID and fixed formatting. 00118 // Release 1.3 - 30 SEP 2007 (TP) 00119 // -Added INTERRUPT_PROTO_USING to properly support ISR context switching 00120 // under SDCC. 00121 // Release 1.2 - (BW) 00122 // -Added support for U8,U16,U32,S8,S16,S32,UU16,UU32 data types 00123 // Release 1.1 - (BW) 00124 // -Added support for INTERRUPT, INTERRUPT_USING, INTERRUPT_PROTO, 00125 // SEGMENT_VARIABLE, VARIABLE_SEGMENT_POINTER, 00126 // SEGMENT_VARIABLE_SEGMENT_POINTER, and LOCATED_VARIABLE 00127 // Release 1.0 - 29 SEP 2006 (PKC) 00128 // -Initial revision 00129 00130 //----------------------------------------------------------------------------- 00131 // Header File Preprocessor Directive 00132 //----------------------------------------------------------------------------- 00133 00134 #ifndef XCOMPILER_DEFS_H 00135 #define XCOMPILER_DEFS_H 00136 00137 //----------------------------------------------------------------------------- 00138 // Macro definitions 00139 //----------------------------------------------------------------------------- 00140 00141 00142 //----------------------------------------------------------------------------- 00143 // SDCC - Small Device C Compiler 00144 // http://sdcc.sourceforge.net 00145 00146 #if defined SDCC 00147 00148 # define SEG_GENERIC 00149 # define SEG_FAR __xdata 00150 # define SEG_DATA __data 00151 # define SEG_NEAR __data 00152 # define SEG_IDATA __idata 00153 # define SEG_XDATA __xdata 00154 # define SEG_PDATA __pdata 00155 # define SEG_CODE __code 00156 # define SEG_BDATA __bdata 00157 00158 # define SBIT(name, addr, bit) __sbit __at(addr+bit) name 00159 # define SFR(name, addr) __sfr __at(addr) name 00160 //# define SFRX(name, addr) xdata volatile unsigned char __at(addr) name 00161 # define SFR16(name, addr) __sfr16 __at(((addr+1U)<<8) | addr) name 00162 //# define SFR16E(name, fulladdr) __sfr16 __at(fulladdr) name 00163 //# define SFR32(name, addr) __sfr32 __at(((addr+3UL)<<24) | ((addr+2UL)<<16) | ((addr+1UL)<<8) | addr) name 00164 //# define SFR32E(name, fulladdr) __sfr32 __at(fulladdr) name 00165 00166 # define INTERRUPT(name, vector) void name (void) interrupt (vector) 00167 # define INTERRUPT_USING(name, vector, regnum) void name (void) interrupt (vector) using (regnum) 00168 # define INTERRUPT_PROTO(name, vector) void name (void) interrupt (vector) 00169 # define INTERRUPT_PROTO_USING(name, vector, regnum) void name (void) interrupt (vector) using (regnum) 00170 00171 # define FUNCTION_USING(name, return_value, parameter, regnum) return_value name (parameter) using (regnum) 00172 # define FUNCTION_PROTO_USING(name, return_value, parameter, regnum) return_value name (parameter) using (regnum) 00173 // Note: Parameter must be either 'void' or include a variable type and name. (Ex: char temp_variable) 00174 00175 # define SEGMENT_VARIABLE(name, vartype, locsegment) locsegment vartype name 00176 # define VARIABLE_SEGMENT_POINTER(name, vartype, targsegment) targsegment vartype * name 00177 # define SEGMENT_VARIABLE_SEGMENT_POINTER(name, vartype, targsegment, locsegment) targsegment vartype * locsegment name 00178 # define SEGMENT_POINTER(name, vartype, locsegment) vartype * locsegment name 00179 # define LOCATED_VARIABLE(name, vartype, locsegment, addr, init) locsegment at (addr) vartype name = init 00180 # define LOCATED_VARIABLE_NO_INIT(name, vartype, locsegment, addr) locsegment at (addr) vartype name 00181 00182 // used with UU16 00183 # define LSB 0 00184 # define MSB 1 00185 00186 // used with UU32 (b0 is least-significant byte) 00187 # define b0 0 00188 # define b1 1 00189 # define b2 2 00190 # define b3 3 00191 00192 //typedef unsigned char U8; 00193 //typedef unsigned int U16; 00194 //typedef unsigned long U32; 00195 00196 typedef unsigned char uint8_t; 00197 typedef unsigned int uint16_t; 00198 typedef unsigned long uint32_t; 00199 00200 //typedef signed char S8; 00201 //typedef signed int S16; 00202 //typedef signed long S32; 00203 00204 typedef signed char int8_t; 00205 typedef signed int int16_t; 00206 typedef signed long int32_t; 00207 00208 typedef union UU16 00209 { 00210 uint16_t U16; 00211 int16_t S16; 00212 uint8_t U8[2]; 00213 int8_t S8[2]; 00214 } UU16; 00215 00216 typedef union UU32 00217 { 00218 uint32_t U32; 00219 int32_t S32; 00220 UU16 UU16[2]; 00221 uint16_t U16[2]; 00222 int16_t S16[2]; 00223 uint8_t U8[4]; 00224 int8_t S8[4]; 00225 } UU32; 00226 00227 // NOP () macro support 00228 #define NOP() _asm NOP _endasm 00229 00230 00231 //----------------------------------------------------------------------------- 00232 // Keil C51 00233 // http://www.keil.com 00234 00235 #elif defined __C51__ 00236 00237 # define SEG_GENERIC 00238 # define SEG_FAR xdata 00239 # define SEG_DATA data 00240 # define SEG_NEAR data 00241 # define SEG_IDATA idata 00242 # define SEG_XDATA xdata 00243 # define SEG_PDATA pdata 00244 # define SEG_CODE code 00245 # define SEG_BDATA bdata 00246 00247 # define SBIT(name, addr, bit) sbit name = addr^bit 00248 # define SFR(name, addr) sfr name = addr 00249 # define SFR16(name, addr) sfr16 name = addr 00250 # define SFR16E(name, fulladdr) /* not supported */ 00251 # define SFR32(name, fulladdr) /* not supported */ 00252 # define SFR32E(name, fulladdr) /* not supported */ 00253 00254 # define INTERRUPT(name, vector) void name (void) interrupt vector 00255 # define INTERRUPT_USING(name, vector, regnum) void name (void) interrupt vector using regnum 00256 # define INTERRUPT_PROTO(name, vector) void name (void) 00257 # define INTERRUPT_PROTO_USING(name, vector, regnum) void name (void) 00258 00259 # define FUNCTION_USING(name, return_value, parameter, regnum) return_value name (parameter) using regnum 00260 # define FUNCTION_PROTO_USING(name, return_value, parameter, regnum) return_value name (parameter) 00261 // Note: Parameter must be either 'void' or include a variable type and name. (Ex: char temp_variable) 00262 00263 # define SEGMENT_VARIABLE(name, vartype, locsegment) vartype locsegment name 00264 # define VARIABLE_SEGMENT_POINTER(name, vartype, targsegment) vartype targsegment * name 00265 # define SEGMENT_VARIABLE_SEGMENT_POINTER(name, vartype, targsegment, locsegment) vartype targsegment * locsegment name 00266 # define SEGMENT_POINTER(name, vartype, locsegment) vartype * locsegment name 00267 # define LOCATED_VARIABLE_NO_INIT(name, vartype, locsegment, addr) vartype locsegment name _at_ addr 00268 00269 // used with UU16 00270 # define LSB 1 00271 # define MSB 0 00272 00273 // used with UU32 (b0 is least-significant byte) 00274 # define b0 3 00275 # define b1 2 00276 # define b2 1 00277 # define b3 0 00278 00279 //typedef unsigned char U8; 00280 //typedef unsigned int U16; 00281 //typedef unsigned long U32; 00282 00283 typedef unsigned char uint8_t; 00284 typedef unsigned int uint16_t; 00285 typedef unsigned long uint32_t; 00286 00287 //typedef signed char S8; 00288 //typedef signed int S16; 00289 //typedef signed long S32; 00290 00291 typedef signed char int8_t; 00292 typedef signed int int16_t; 00293 typedef signed long int32_t; 00294 00295 typedef union UU16 00296 { 00297 uint16_t U16; 00298 int16_t S16; 00299 uint8_t U8[2]; 00300 int8_t S8[2]; 00301 } UU16; 00302 00303 typedef union UU32 00304 { 00305 uint32_t U32; 00306 int32_t S32; 00307 UU16 UU16[2]; 00308 uint16_t U16[2]; 00309 int16_t S16[2]; 00310 uint8_t U8[4]; 00311 int8_t S8[4]; 00312 } UU32; 00313 00314 // NOP () macro support 00315 extern void _nop_ (void); 00316 #define NOP() _nop_() 00317 00318 //----------------------------------------------------------------------------- 00319 00320 //----------------------------------------------------------------------------- 00321 00322 // Default 00323 // Unknown compiler 00324 00325 #else 00326 00327 #warning Unrecognized compiler, I assumne it has stdint.h header file (Angel) 00328 00329 #include <stdint.h> 00330 00331 # define SBIT(name, addr, bit) volatile bool name 00332 # define SFR(name, addr) volatile uint8_t name 00333 # define SFRX(name, addr) volatile uint8_t name 00334 # define SFR16(name, addr) volatile uint16_t name 00335 00336 //# define SFR16E(name, fulladdr) volatile unsigned short name 00337 //# define SFR32(name, fulladdr) volatile unsigned long name 00338 //# define SFR32E(name, fulladdr) volatile unsigned long name 00339 00340 00341 00342 #endif 00343 00344 //----------------------------------------------------------------------------- 00345 // Header File PreProcessor Directive 00346 //----------------------------------------------------------------------------- 00347 00348 #endif // #define COMPILER_DEFS_H 00349 00350 //----------------------------------------------------------------------------- 00351 // End Of File 00352 //-----------------------------------------------------------------------------