码农的自我修养 - ARM编译器的区分

2023-11-17

在嵌入式软件开发的编码中,有时使用的一些指令是和编译器相关的,这时就要判断当前使用的编译器类型。

不同的编译器,会定义不同的宏来进行识别。

比如在ARM开发工具包中,cortex-M系列开发中,CMSIS Cortex-Mx Core Peripheral Access Layer Header File如下:

这些头文件里有用到编译器的预定义宏,比如core_cm3.h (cortex-M3的头文件)中:

那这几个宏都是什么含义呢?分别对应什么平台呢?

这些是针对ARM处理器的不同编译器来进行分别处理,使用这些宏可以屏蔽编译器相关的代码的差异,保证对不同的编译器,使用的代码都是兼容的。

__CC_ARM --> ARM's (RealView) compiler 

RealView,是一套包含编译、调试和模拟的开发工具,需结合开发环境如Keil uvision、eclipse或者CodeWarrior,形成集成开发环境来使用。

__GNUC__ --> GNU Compiler Collection

GCC的初衷是为GNU操作系统(GNU系统+Linux内核)专门编写的一款编译器。GNU系统是彻底的自由软件。

使用GCC来编译Linux平台上的ARM程序,实际上用的是Linaro的交叉编译器。之前有篇文章介绍过。

而这里的IAR、Keil的编译器,指的是和普通单片机或微控制器一样的bare-metal程序,直接能运行的。

__ICCARM__  --> IAR

同时IAR平台还有个宏__IAR_SYSTEMS_ICC__,可以在下面编译器平台介绍中查到。Embedded Workbench for ARM 是IARSystems 公司为ARM 微处理器开发的一个集成开发环境(下面简称IAR EWARM)。比较其他的ARM 开发环境,IAR EWARM 具有入门容易、使用方便和代码紧凑等特点。

__TI_ARM__ --> Texas Instruments

这个就是TI的了。

__TASKING__ --> Tasking

对应的平台是Altinum Designer。Altium Designer 是原Protel软件开发商Altium公司推出的一体化的电子产品开发系统,主要运行在Windows操作系统。这套软件通过把原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技术的完美融合,为设计者提供了全新的设计解决方案,使设计者可以轻松进行设计,熟练使用这一软件使电路设计的质量和效率大大提高。  

--------------------------------------------------- 

下面是各个编译器平台的宏定义:

ARM Compiler

Type

Macro

Format

Description

Identification

__CC_ARM

Version

__ARMCC_VERSION

VRPBBB

V = Version

R = Revision

P = Patch

BBB = Build

就是ARM公司自己的编译器,Keil uvision中使用的。

Example

Realview C

__ARMCC_VERSION   

3.0

300503

Clang

Type

Macro

Format

Description

Identification

__clang__

Version

__clang_major__

V

V = Major version

Version

__clang_minor__

R

R = Minor version

Version

__clang_patchlevel__

P

P = Patch level

Version

__clang_version__

V.R.P (tags/RELEASE_VRP/final)

V = Major version

R = Minor version

P = Patch level

GCC C/C++

Type

Macro

Description

Identification

__GNUC__

Version

__GNUC__

Version

Version

__GNUC_MINOR__

Revision

Version

__GNUC_PATCHLEVEL__

Patch (introduced in version 3.0)

Example

GNU C/C++

__GNUC__

__GNUC_MINOR__

__GNUC_PATCHLEVEL__

2.7.x

2

7

N/A

3.0.2

3

0

2

可以自己添加代码来定义GNU Version:

#if defined(__GNUC__)

# if defined(__GNUC_PATCHLEVEL__)

#  define __GNUC_VERSION__ (__GNUC__ * 10000 \

                            + __GNUC_MINOR__ * 100 \

                            + __GNUC_PATCHLEVEL__)

# else

#  define __GNUC_VERSION__ (__GNUC__ * 10000 \

                            + __GNUC_MINOR__ * 100)

# endif

#endif

IAR C/C++

Type

Macro

Format

Description

Identification

__IAR_SYSTEMS_ICC__

Version

__VER__

VRR

V = Version

RR = Revision

Example

IAR C/C++

__VER__

3.34__VER__

334

Intel C/C++

Type

Macro

Format

Description

Identification

__INTEL_COMPILER

Identification

__ICC

Obsolete

Identification

__ECC

Obsolete

Identification

__ICL

Version

__INTEL_COMPILER

VRP

V = Version

R = Revision

P = Patch

Version

__INTEL_COMPILER_BUILD_DATE

YYYYMMDD

YYYY = Year

MM = Month

DD = Day

Example

Intel C/C++

__INTEL_COMPILER

__INTEL_COMPILER_BUILD_DATE

5.0

500

6.0

600

8.0

800

9.0

900

20060222

KEIL C51

Type

Macro

Format

Description

Identification

__C51__

Identification

__CX51__

Version

__C51__

VRR

V = Version

RR = Revision

Example

Keil C51

__C51__

7.01

701

Microsoft Visual C++

Type

Macro

Format

Description

Identification

_MSC_VER

Version

_MSC_VER

VVRR

VV = Version

RR = Revision

Version

_MSC_FULL_VER

VVRRPPPP

VV = Version

RR = Revision

PPPP = Patch

From Visual C++ 6.0 Processor Pack

Version

_MSC_FULL_VER

VVRRPPPPP

VV = Version

RR = Revision

PPPPP = Patch

From Visual C++ 8.0

Version

_MSC_BUILD

B

B = Build number

From Visual C++ 9.0Example

Example

Visual C++ 1 2

_MSC_VER

_MSC_FULL_VER

1.0

800

3.0

900

4.0

1000

4.2

1020

5.0

1100

6.0

1200

6.0 SP6

1200

12008804

7.0

1300

13009466

7.1 (2003)

1310

13103077

8.0 (2005)

1400

140050727

9.0 (2008)

1500

150021022

9.0 SP1

1500

150030729

10.0 (2010)

1600

160030319

10.0 (2010) SP1

1600

160040219

11.0 (2012)

1700

170050727

12.0 (2013)

1800

180021005

14.0 (2015)

1900

190023026

14.0 (2015 Update 1)

1900

190023506

14.0 (2015 Update 2)

1900

190023918

14.0 (2015 Update 3)

1900

190024210

15.0 (2017)

1910

191025017

MinGW and MinGW-w64

Type

Macro

Description

MinGW32

MinGW-w64 32 Bit

MinGW-w64 64 Bit

Identification

__MINGW32__

defined

defined

defined

Version

__MINGW32_MAJOR_VERSION

Version

defined

defined

defined

Version

__MINGW32_MINOR_VERSION

Revision

defined

defined

defined

Identification

__MINGW64__

-

-

defined

Version

__MINGW64_VERSION_MAJOR

Version

-

defined

defined

Version

__MINGW64_VERSION_MINOR

Revision

-

defined

defined

注意,__MINGW32_MAJOR_VERSION, __MINGW32_MINOR_VERSION, __MINGW64_VERSION_MAJOR, 和__MINGW64_VERSION_MINOR,

这几个宏定义需要包含下面的头文件:

<stdlib.h>, <stdio.h>, <windows.h>, <windef.h>,或者还需要其他。

Examples

__MINGW32_MAJOR_VERSION

__MINGW32_MINOR_VERSION

__MINGW64_VERSION_MAJOR

__MINGW64_VERSION_MINOR

Description

2

4

MinGW32 2.4

3

20

MinGW32 3.20

3

11

2

0

MinGW-w64 2.0

Turbo C/C++

Type

Macro

Format

Description

Identification

__TURBOC__

Version

__TURBOC__

0xVVRR

VV = Version

RR = Revision

This pattern does not apply to the values between 0x295 and 0x400.

Example

Turbo C

Turbo C++

__TURBOC__

2.01

0x201

1.00

0x295

1.01

0x296

2.00

0x297

手里有Ubuntu虚拟机,来试一下GNU的版本:

#include <stdio.h>

int main()
{

  printf("%d.%d.%d\n", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);
  return 0;

}


$ gcc -o version test.c
$ ./version
9.3.0

其实还有非常多的编译器和相对应的预定义宏,就不一一列举了,可以参见文后引用。

比如TI的编译器、Borland编译器等。

参考:

c - What do the __CC_ARM, __ICCARM__, __GNUC__ and __TASKING__ macros mean? - Stack Overflowicon-default.png?t=LA92https://stackoverflow.com/questions/17572519/what-do-the-cc-arm-iccarm-gnuc-and-tasking-macros-mean

Pre-defined Compiler Macros / Wiki / Compilersicon-default.png?t=LA92https://sourceforge.net/p/predef/wiki/Compilers/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

码农的自我修养 - ARM编译器的区分 的相关文章

  • 如何修改内核DTB文件

    Summary 我目前正在为定制板编译 Linux 内核 内核 模块和 DTB 以及一些定制驱动程序 有时 我会编译内核并意识到 DTB 文件中的兼容性字符串不是自定义驱动程序正在寻找的内容 现在 我可以解决此问题的唯一方法是修改 DTS
  • 将结构体偏移属性赋予汇编器

    如何将 C 结构体的偏移量发送到汇编代码 例如 在我的 C 代码中 typedef struct unsigned int a unsigned int b CMyStruct 我向 ASM 函数发送一个 CMyStruct 结构的指针 假
  • ARM Linux 如何模拟 PTE 的脏位、访问位和文件位?

    As per pgtable 2 level h https git kernel org cgit linux kernel git torvalds linux git tree arch arm include asm pgtable
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • C 嵌入式应用程序中 time() 函数的问题

    我在用time 在 ARM 微控制器上 处理器一到达此函数就会重新启动 奇怪的是 当我处于调试模式时 代码运行得很好 但一旦我想将其应用到独立模式 我就会遇到重置 我是否忽略了什么 这个功能有替代品吗 代码部分是这样的 include
  • ARM 中只有两个操作数的 ADD 或 SUB

    我正在学习ARM汇编语言 我读过 ADD 应该有 3 个操作数 然而 我见过很多案例 现实中只有两种 例如 STR R1 SP 0x20 var 1C LDR R1 a lua 0x1DE4E6 MOVS R0 R4 haystack AD
  • Linux malloc() 在 ARM 和 x86 上的行为是否不同?

    这个网站上有很多关于内存分配的问题 但是我 找不到专门解决我的问题的人 这 问题 https stackoverflow com questions 19148296 linux memory overcommit details似乎最接近
  • 可以使用Visual Studio 2012构建ARM桌面程序吗?

    我正在使用 Visual Studio 2012 beta 我的桌面 win32 程序在 ARM 架构中编译得很好 升级到 Visual Studio 2012 RC 后 编译器无法工作并出现以下错误 不支持为 ARM 平台编译桌面应用程序
  • 分析 Cortex-M7 (stm32f7) 上的 memcpy 性能

    简洁版本 从 GNU ARM 工具链中提取的 memcpy 的性能指标在 ARM Cortex M7 上对于不同的副本大小似乎差异很大 即使复制数据的代码始终保持不变 这可能是什么原因造成的 长版 我是使用 GNU Arm 工具链 11 2
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • DS-5:什么是 FVP、RTSM、基础模型、AEM 模型、快速模型、CADI?

    DS 5 模拟器使用了很多术语 如 FVP RTSM 快速模型 基础模型 AEM 模型 CADI Arm的文档中提供的解释不是很清楚 这些术语的含义是什么 作为 DS 5 的最终用户我应该关心哪些术语 Model 软件模拟的行业术语 就 A
  • gdb 不会从外部架构读取核心文件

    我正在尝试在 Linux 桌面上读取 ARM 核心文件 但似乎无法找出我的核心文件 有什么方法可以指示 gdb 我的核心文件是什么类型吗 file daemon daemon ELF 32 bit LSB executable ARM ve
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • iPhone 3GS 上的 ARM 与 Thumb 性能比较,非浮点代码

    我想知道是否有人有关于 iPhone 3GS 上 ARM 与 Thumb 代码性能的硬性数据 特别是对于非浮点 VFP 或 NEON 代码 我知道 Thumb 模式下的浮点性能问题 更大的 ARM 指令的额外代码大小是否会在某个时刻成为性能
  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 架构armv7的重复符号

    尝试在我现有的应用程序中使用 Layar SDK 时出现以下错误 我该如何解决这个问题 Ld Users pnawale Library Developer Xcode DerivedData hub afxxzaqisdfliwbzxbi
  • 英特尔的最后分支记录功能是英特尔处理器独有的吗?

    最后分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 MSR 的集合 它们受英特尔酷睿 2 英特尔至强和英特尔凌动处理器系列的支持 http css csail mit edu 6 858 2012 readings ia3
  • ARM NEON 矢量化失败

    我想在 ARM cortex a9 上启用 NEON 矢量化 但在编译时得到以下输出 未矢量化 不支持相关 stmt D 14140 82 D 14143 77 D 14141 81 这是我的循环 void my mul float32 t
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2

随机推荐

  • 阶段性回顾

    阶段笔记 Day01 1 请你简单介绍下软件开发中系统架构的演变 单一应用 gt 垂直拆分 gt 分布式服务 gt 服务治理 SOA gt 微服务架构 2 远程调用的方式有几种 他们的区别如何 如何选择 远程调用有两种方式 RPC Remo
  • 编程每日一题_C程序设计_两整型数据求和

    问题描述 Calculate a b 问题来源https zoj pintia cn problem sets 91827364500 problems Time Limit 2000 ms Memory Limit 65536 KB In
  • HTML5做移动开发一定要搞明白MPA 与 SPA 的差别

    用HTML5做WEB与移动开发一定要搞明白MPA 与 SPA 的差别 刚开始可能会不明白 为什么习惯pc端web app开发 会发现Sencha Touch这样的框架 用起来有点别扭 老在想那熟悉的多页面开发方式 却总也找不到实现的接口 也
  • Mac系统下Flutter安装教程

    一 下载Flutter 1 第一种方式git repo方式 执行下列命令下载最新的flutter代码 系统请先安装Git git clone b beta https github com flutter flutter git 2 第二种
  • 如何解决:ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

    如何解决 ConnectionRefusedError WinError 10061 由于目标计算机积极拒绝 无法连接 在阅读 Python编程 从入门到实践 17 1 6时遇到了这个问题 项目场景 import requests url
  • spyglass使用教程

    spyglass使用教程 ic 爱好者的博客 CSDN博客
  • vivo手机计算机恢复出厂设置,vivo手机系统恢复出厂设置里面清除所有数据

    哎呀 手机怎么又卡了 完了这局农药又要输了 这个破手机 才用了一年就卡的不要不要的了 是时候要通过恢复出厂设置来解决了 但它真的能让我们的手机变流畅吗 什么是恢复出厂设置 顾名思义 恢复出厂设置就是将手机里所有的设置还原到最开始时的状态 就
  • [网络安全自学篇] 三.Burp Suite安装配置、Proxy基础用法及流量分析示例

    最近开始学习网络安全相关知识 接触了好多新术语 感觉自己要学习的东西太多 真是学无止境 也发现了好几个默默无闻写着博客 做着开源的大神 接下来系统分享一些网络安全的自学笔记 希望读者们喜欢 上一篇文章分享了Chrome浏览器保留密码功能渗透
  • vue的transition动画条上下跳动

    vue部分
  • Dynamics 365 DevOps CI/CD之ConfigurationData

    ConfigurationData如省市区 门店地址这种业务类型的数据 还有系统自定义过程中配置或开发涉及的参数 需要在系统间进行同步 此处CI用到了Power Platform Tool这个工具 这个也是可以在Azure DevOps的商
  • 进度条程序

    package progressbar import java awt BorderLayout import java awt Container import java awt Dimension import java util Ar
  • java中FileReader的使用

    package com test io01 import java io File import java io FileNotFoundException import java io FileReader import java io
  • TTreeNode编程思路

    导读 TTreeNode编程思路 本问以TreeView为例子讲述 其他的用到TTreeNodes的控件的编程思想如出一辙 TreeView由节点构成 建树通过对TreeView items属性进行操作 Items是一个TTreeNodes
  • Redis 配置文件最佳解析

    配置文件 https raw githubusercontent com redis redis 7 0 redis conf 通用模板 引入 include 用于引入其他配置文件 支持使用通配符 根据从上到下的顺序 读取配置项 对同一个配
  • 解决vite首次加载很慢的问题

    目录 vite很快吗 为什么说vite快 为什么说vite慢 解决方案 附加 vite很快吗 vite要比webpack快 是的 真的很快 但个人感受 默认情况下 vite项目的启动确实比webpack快 但如果某个界面是首次进入 且依赖比
  • LaTex希腊字母大全

    小写字母 LaTex指令 大写字母 LaTex指令 alpha alpha A A
  • MySql修改主键字段

    一 应用实例 去除原来的主键字段的主键 ALTER TABLE mdm customer DROP PRIMARY KEY 新增字段并设置为主键 ALTER TABLE mdm customer ADD ID int 32 PRIMARY
  • 【图像处理】数码相机工作原理完整解析

    在过去二十年里 消费电子产品的大多数重要技术突破实际上可归结于一项更大意义上的科技革命 仔细观察就会发现 CD DVD 高清电视 MP3和DVR其实都是基于相同的原理 即 将传统的模拟信息转变为数字信息 这一技术上的根本转变完全颠覆了我们处
  • Tomcat中server.xml中访问多个项目的配置

    Tomcat中server xml中访问多个项目的配置 server xml作为 tomcat 启动时的配置依据 其功能包含了配置访问端口 访问路径等 这里主要针对在同一个 tomcat 中发布多个项目 其中最关键的配置是 标签下appBa
  • 码农的自我修养 - ARM编译器的区分

    在嵌入式软件开发的编码中 有时使用的一些指令是和编译器相关的 这时就要判断当前使用的编译器类型 不同的编译器 会定义不同的宏来进行识别 比如在ARM开发工具包中 cortex M系列开发中 CMSIS Cortex Mx Core Peri