找回密码
 立即注册
查看: 2025|回复: 1

跨编译器兼容头文件

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:328
  • 最近打卡:2025-03-09 19:40:01

9

主题

328

回帖

4501

积分

荣誉版主

积分
4501
发表于 2023-2-28 13:49:40 | 显示全部楼层 |阅读模式
这是一份SDCC编译器包含的头文件,提供了SDCC、Keil、Raisonance、IAR、Hi-Tech、Tasking、Crossware、Wickenhaeuser等编译器的sbit、sfr、interrupt和nop的定义,将其分享在此。
这份文件本身是使用GPLv2协议的,但是并不要求以同样协议对包含本文件后使用SDCC编译的可执行文件进行授权,所以使用是没问题的。
代码如下,文末也有文件下载。



  1. /*-------------------------------------------------------------------------
  2.    compiler.h
  3.    Copyright (C) 2006, Maarten Brock, sourceforge.brock@dse.nl
  4.    Portions of this file are Copyright 2014 Silicon Laboratories, Inc.
  5.    http://developer.silabs.com/legal/version/v11/Silicon_Labs_Software_License_Agreement.txt
  6.    This library is free software; you can redistribute it and/or modify it
  7.    under the terms of the GNU General Public License as published by the
  8.    Free Software Foundation; either version 2, or (at your option) any
  9.    later version.
  10.    This library is distributed in the hope that it will be useful,
  11.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.    GNU General Public License for more details.
  14.    You should have received a copy of the GNU General Public License
  15.    along with this library; see the file COPYING. If not, write to the
  16.    Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
  17.    MA 02110-1301, USA.
  18.    As a special exception, if you link this library with other files,
  19.    some of which are compiled with SDCC, to produce an executable,
  20.    this library does not by itself cause the resulting executable to
  21.    be covered by the GNU General Public License. This exception does
  22.    not however invalidate any other reasons why the executable file
  23.    might be covered by the GNU General Public License.
  24. -------------------------------------------------------------------------*/
  25. /*
  26.   * Header file to overcome 8051 compiler differences for specifying
  27.   * special function registers. The following compilers are supported:
  28.   * SDCC, Keil, Raisonance, IAR, Hi-Tech, Tasking, Crossware, Wickenhaeuser.
  29.   * Unfortunately not for use with Dunfield. The compilers are identified by
  30.   * their unique predefined macros. See also:
  31.   * http://predef.sourceforge.net/precomp.html
  32.   *
  33.   * SBIT and SFR define special bit and special function registers at the given
  34.   * address. SFR16 and SFR32 define sfr combinations at adjacent addresses in
  35.   * little-endian format. SFR16E and SFR32E define sfr combinations without
  36.   * prerequisite byte order or adjacency. None of these multi-byte sfr
  37.   * combinations will guarantee the order in which they are accessed when read
  38.   * or written.
  39.   * SFR16X and SFR32X for 16 bit and 32 bit xdata registers are not defined
  40.   * to avoid portability issues because of compiler endianness.
  41.   * SFR16LEX is provided for 16 bit little endian xdata registers. It is usable
  42.   * on little endian compilers only; on big endian compilers, these registers
  43.   * will not be defined.
  44.   * This file is to be included in every microcontroller specific header file.
  45.   * Example:
  46.   *
  47.   * // my_mcu.h: sfr definitions for my mcu
  48.   * #include <compiler.h>
  49.   *
  50.   * SBIT  (P0_1, 0x80, 1);      // Port 0 pin 1
  51.   *
  52.   * SFR   (P0, 0x80);           // Port 0
  53.   *
  54.   * SFRX  (CPUCS, 0xE600);      // Cypress FX2 Control and Status register in xdata memory at 0xE600
  55.   *
  56.   * SFR16 (TMR2, 0xCC);         // Timer 2, lsb at 0xCC, msb at 0xCD
  57.   *
  58.   * SFR16E(TMR0, 0x8C8A);       // Timer 0, lsb at 0x8A, msb at 0x8C
  59.   *
  60.   * SFR32 (MAC0ACC, 0x93);      // SiLabs C8051F120 32 bits MAC0 Accumulator, lsb at 0x93, msb at 0x96
  61.   *
  62.   * SFR32E(SUMR, 0xE5E4E3E2);   // TI MSC1210 SUMR 32 bits Summation register, lsb at 0xE2, msb at 0xE5
  63.   *
  64. */
  65. #ifndef COMPILER_H
  66. #define COMPILER_H
  67. /** SDCC - Small Device C Compiler
  68.   * http://sdcc.sf.net
  69. */
  70. #if defined (SDCC) || defined (__SDCC)
  71. # define SBIT(name, addr, bit)  __sbit  __at(addr+bit)                    name
  72. # define SFR(name, addr)        __sfr   __at(addr)                        name
  73. # define SFRX(name, addr)       __xdata volatile unsigned char __at(addr) name
  74. # define SFR16(name, addr)      __sfr16 __at(((addr+1U)<<8) | addr)       name
  75. # define SFR16E(name, fulladdr) __sfr16 __at(fulladdr)                    name
  76. # define SFR16LEX(name, addr)   __xdata volatile unsigned short __at(addr) name
  77. # define SFR32(name, addr)      __sfr32 __at(((addr+3UL)<<24) | ((addr+2UL)<<16) | ((addr+1UL)<<8) | addr) name
  78. # define SFR32E(name, fulladdr) __sfr32 __at(fulladdr)                    name
  79. # define INTERRUPT(name, vector) void name (void) __interrupt (vector)
  80. # define INTERRUPT_USING(name, vector, regnum) void name (void) __interrupt (vector) __using (regnum)
  81. // NOP () macro support
  82. #define NOP() __asm NOP __endasm
  83. /** Keil C51
  84.   * http://www.keil.com
  85. */
  86. #elif defined __CX51__
  87. # define SBIT(name, addr, bit)  sbit  name = addr^bit
  88. # define SFR(name, addr)        sfr   name = addr
  89. # define SFRX(name, addr)       volatile unsigned char xdata name _at_ addr
  90. # define SFR16(name, addr)      sfr16 name = addr
  91. # define SFR16E(name, fulladdr) /* not supported */
  92. # define SFR16LEX(name, addr)   /* not supported */
  93. # define SFR32(name, fulladdr)  /* not supported */
  94. # define SFR32E(name, fulladdr) /* not supported */
  95. # define INTERRUPT(name, vector) void name (void) interrupt vector
  96. # define INTERRUPT_USING(name, vector, regnum) void name (void) interrupt vector using regnum
  97. // NOP () macro support
  98. extern void _nop_ (void);
  99. #define NOP() _nop_()
  100. /** Raisonance
  101.   * http://www.raisonance.com
  102. */
  103. #elif defined __RC51__
  104. # define SBIT(name, addr, bit)  at (addr+bit) sbit                   name
  105. # define SFR(name, addr)        sfr at addr                          name
  106. # define SFRX(name, addr)       xdata at addr volatile unsigned char name
  107. # define SFR16(name, addr)      sfr16 at addr                        name
  108. # define SFR16E(name, fulladdr) /* not supported */
  109. # define SFR16LEX(name, addr)   /* not supported */
  110. # define SFR32(name, fulladdr)  /* not supported */
  111. # define SFR32E(name, fulladdr) /* not supported */
  112. # define INTERRUPT(name, vector) void name (void) interrupt vector
  113. # define INTERRUPT_USING(name, vector, regnum) void name (void) interrupt vector using regnum
  114. // NOP () macro support -- NOP is opcode 0x00
  115. #define NOP() asm { 0x00 }
  116. /** IAR 8051
  117.   * http://www.iar.com
  118. */
  119. #elif defined __ICC8051__
  120. # define SBIT(name, addr, bit)  __bit __no_init volatile bool name @ (addr+bit)
  121. # define SFR(name, addr)        __sfr __no_init volatile unsigned char name @ addr
  122. # define SFRX(name, addr)       __xdata __no_init volatile unsigned char name @ addr
  123. # define SFR16(name, addr)      __sfr __no_init volatile unsigned int  name @ addr
  124. # define SFR16E(name, fulladdr) /* not supported */
  125. # define SFR16LEX(name, addr)   /* not supported */
  126. # define SFR32(name, fulladdr)  __sfr __no_init volatile unsigned long name @ addr
  127. # define SFR32E(name, fulladdr) /* not supported */
  128. # define _PPTOSTR_(x) #x
  129. # define _PPARAM_(address) _PPTOSTR_(vector=address * 8 + 3)
  130. # define _PPARAM2_(regbank) _PPTOSTR_(register_bank=regbank)
  131. # define INTERRUPT(name, vector) _Pragma(_PPARAM_(vector)) __interrupt void name(void)
  132. # define INTERRUPT_USING(name, vector, regnum) _Pragma(_PPARAM2_(regnum)) _Pragma(_PPARAM_(vector)) __interrupt void name(void)
  133. extern __intrinsic void __no_operation (void);
  134. #define NOP() __no_operation()
  135. /** Tasking / Altium
  136.   * http://www.altium.com/tasking
  137. */
  138. #elif defined _CC51
  139. # define SBIT(name, addr, bit)  _sfrbit  name _at(addr+bit)
  140. # define SFR(name, addr)        _sfrbyte name _at(addr)
  141. # define SFRX(name, addr)       _xdat volatile unsigned char name _at(addr)
  142. #if _CC51 > 71
  143. # define SFR16(name, addr)      _sfrword _little name _at(addr)
  144. #else
  145. # define SFR16(name, addr)      /* not supported */
  146. #endif
  147. # define SFR16E(name, fulladdr) /* not supported */
  148. # define SFR16LEX(name, addr)   /* not supported */
  149. # define SFR32(name, fulladdr)  /* not supported */
  150. # define SFR32E(name, fulladdr) /* not supported */
  151. # define INTERRUPT(name, vector) _interrupt (vector) void name (void)
  152. # define INTERRUPT_USING(name, vector, regnum) _interrupt (vector) _using(regnum) void name (void)
  153. // NOP () macro support
  154. extern void _nop (void);
  155. #define NOP() _nop()
  156. /** Hi-Tech 8051
  157.   * http://www.htsoft.com
  158. */
  159. #elif defined HI_TECH_C
  160. # define SBIT(name, addr, bit)  volatile bit           name @ (addr+bit)
  161. # define SFR(name, addr)        volatile unsigned char name @ addr
  162. # define SFRX(name, addr)       volatile far unsigned char name @ addr
  163. # define SFR16(name, addr)      /* not supported */
  164. # define SFR16E(name, fulladdr) /* not supported */
  165. # define SFR16LEX(name, addr)   /* not supported */
  166. # define SFR32(name, fulladdr)  /* not supported */
  167. # define SFR32E(name, fulladdr) /* not supported */
  168. # define INTERRUPT(name, vector)       void name (void) interrupt vector
  169. # define INTERRUPT_PROTO(name, vector)
  170. // NOP () macro support
  171. #define NOP() asm(" nop ")
  172. /** Crossware
  173.   * http://www.crossware.com
  174. */
  175. #elif defined _XC51_VER
  176. # define SBIT(name, addr, bit)  _sfrbit  name = (addr+bit)
  177. # define SFR(name, addr)        _sfr     name = addr
  178. # define SFRX(name, addr)       volatile unsigned char _xdata name _at addr
  179. # define SFR16(name, addr)      _sfrword name = addr
  180. # define SFR16E(name, fulladdr) /* not supported */
  181. # define SFR16LEX(name, addr)   /* not supported */
  182. # define SFR32(name, fulladdr)  /* not supported */
  183. # define SFR32E(name, fulladdr) /* not supported */
  184. /** Wickenhaeuser
  185.   * http://www.wickenhaeuser.de
  186. */
  187. #elif defined __UC__
  188. # define SBIT(name, addr, bit)  unsigned char bit  name @ (addr+bit)
  189. # define SFR(name, addr)        near unsigned char name @ addr
  190. # define SFRX(name, addr)       xdata volatile unsigned char name @ addr
  191. # define SFR16(name, addr)      /* not supported */
  192. # define SFR16E(name, fulladdr) /* not supported */
  193. # define SFR16LEX(name, addr)   /* not supported */
  194. # define SFR32(name, fulladdr)  /* not supported */
  195. # define SFR32E(name, fulladdr) /* not supported */
  196. /** default
  197.   * unrecognized compiler
  198. */
  199. #else
  200. # warning unrecognized compiler
  201. # define SBIT(name, addr, bit)  volatile bool           name
  202. # define SFR(name, addr)        volatile unsigned char  name
  203. # define SFRX(name, addr)       volatile unsigned char  name
  204. # define SFR16(name, addr)      volatile unsigned short name
  205. # define SFR16E(name, fulladdr) volatile unsigned short name
  206. # define SFR16LEX(name, addr)   volatile unsigned short name
  207. # define SFR32(name, fulladdr)  volatile unsigned long  name
  208. # define SFR32E(name, fulladdr) volatile unsigned long  name
  209. #endif
  210. #endif //COMPILER_H
复制代码


compiler.h (10.03 KB, 下载次数: 70)

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:248
  • 最近打卡:2025-04-27 09:57:01
已绑定手机

24

主题

756

回帖

3315

积分

超级版主

积分
3315
QQ
发表于 2023-3-2 13:35:40 | 显示全部楼层
感谢分享。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 14:58 , Processed in 0.429523 second(s), 58 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表