ZHCUAV8W january   1998  – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , C346BA02 , C348A01 , CS241C01-Q1 , CS241C05-Q1 , CS246C01-Q1 , CS348C02-Q1 , OMAP-L132 , OMAP-L137 , OMAP-L138 , S470AV336LYSQRB , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768

 

  1.   请先阅读
    1.     关于本手册
    2.     标记规则
    3.     相关文档
    4.     德州仪器 (TI) 提供的相关文档
    5.     商标
  2. 1软件开发工具简介
    1. 1.1 软件开发工具概述
    2. 1.2 编译器接口
    3. 1.3 ANSI/ISO 标准
    4. 1.4 输出文件
    5. 1.5 实用程序
  3. 2使用 C/C++ 编译器
    1. 2.1  关于编译器
    2. 2.2  调用 C/C++ 编译器
    3. 2.3  使用选项更改编译器的行为
      1. 2.3.1  链接器选项
      2. 2.3.2  常用选项
      3. 2.3.3  其他有用的选项
      4. 2.3.4  运行时模型选项
      5. 2.3.5  符号调试和分析选项
      6. 2.3.6  指定文件名
      7. 2.3.7  更改编译器解释文件名的方式
      8. 2.3.8  更改编译器处理 C 文件的方式
      9. 2.3.9  更改编译器解释和命名扩展名的方式
      10. 2.3.10 指定目录
      11. 2.3.11 汇编器选项
      12. 2.3.12 已弃用的选项
    4. 2.4  通过环境变量控制编译器
      1. 2.4.1 设置默认编译器选项 (TI_ARM_C_OPTION)
      2. 2.4.2 命名一个或多个备用目录 (TI_ARM_C_DIR)
    5. 2.5  控制预处理器
      1. 2.5.1  预先定义的宏名称
      2. 2.5.2  #include 文件的搜索路径
        1. 2.5.2.1 在 #include 文件搜索路径(--include_path 选项)中新增目录
      3. 2.5.3  支持#warning 和 #warn 指令
      4. 2.5.4  生成预处理列表文件(--preproc_only 选项)
      5. 2.5.5  预处理后继续编译(--preproc_with_compile 选项)
      6. 2.5.6  生成带有注释的预处理列表文件(--preproc_with_comment 选项)
      7. 2.5.7  生成带有行控制详细信息的预处理列表(--preproc_with_line 选项)
      8. 2.5.8  为 Make 实用程序生成预处理输出(--preproc_dependency 选项)
      9. 2.5.9  生成包含#include在内的文件列表(--preproc_includes 选项)
      10. 2.5.10 在文件中生成宏列表(--preproc_macros 选项)
    6. 2.6  将参数传递给 main()
    7. 2.7  了解诊断消息
      1. 2.7.1 控制诊断消息
      2. 2.7.2 如何使用诊断抑制选项
    8. 2.8  其他消息
    9. 2.9  生成交叉参考列表信息(--gen_cross_reference_listing 选项)
    10. 2.10 生成原始列表文件(--gen_preprocessor_listing 选项)
    11. 2.11 使用内联函数扩展
      1. 2.11.1 内联内在函数运算符
      2. 2.11.2 内联限制
    12. 2.12 使用交叉列出功能
    13. 2.13 控制应用程序二进制接口
    14. 2.14 VFP 支持
    15. 2.15 启用入口挂钩和出口挂钩函数
  4. 3优化您的代码
    1. 3.1  调用优化
    2. 3.2  控制代码大小与速度
    3. 3.3  执行文件级优化(--opt_level=3 选项)
      1. 3.3.1 创建优化信息文件(--gen_opt_info 选项)
    4. 3.4  程序级优化(--program_level_compile 和 --opt_level=3 选项)
      1. 3.4.1 控制程序级优化(--call_assumptions 选项)
      2. 3.4.2 混合 C/C++ 和汇编代码时的优化注意事项
    5. 3.5  自动内联扩展(--auto_inline 选项)
    6. 3.6  链接时优化(--opt_level=4 选项)
      1. 3.6.1 选项处理
      2. 3.6.2 不兼容的类型
    7. 3.7  使用反馈制导优化
      1. 3.7.1 反馈向导优化
        1. 3.7.1.1 第 1 阶段 - 收集程序分析信息
        2. 3.7.1.2 第 2 阶段 - 使用应用程序分析信息进行优化
        3. 3.7.1.3 生成和使用配置文件信息
        4. 3.7.1.4 反馈制导优化的应用示例
        5. 3.7.1.5 .ppdata 段
        6. 3.7.1.6 反馈制导优化和代码大小调整
        7. 3.7.1.7 检测程序执行开销
        8. 3.7.1.8 无效的分析数据
      2. 3.7.2 分析数据解码器
      3. 3.7.3 反馈制导优化 API
      4. 3.7.4 反馈制导优化总结
    8. 3.8  使用配置文件信息分析代码覆盖率
      1. 3.8.1 代码覆盖
        1. 3.8.1.1 第 1 阶段 - 收集程序分析信息
        2. 3.8.1.2 第 2 阶段 -- 生成代码覆盖信息报告
      2. 3.8.2 相关的特征和功能
        1. 3.8.2.1 路径分析器
        2. 3.8.2.2 分析选项
        3. 3.8.2.3 环境变量
    9. 3.9  访问优化代码中的别名变量
    10. 3.10 在优化代码中谨慎使用 asm 语句
    11. 3.11 通过优化使用交叉列出特性
    12. 3.12 调试和分析优化代码
      1. 3.12.1 分析优化的代码
    13. 3.13 正在执行什么类型的优化?
      1. 3.13.1  基于成本的寄存器分配
      2. 3.13.2  别名消歧
      3. 3.13.3  分支优化和控制流简化
      4. 3.13.4  数据流优化
      5. 3.13.5  表达式简化
      6. 3.13.6  函数的内联扩展
      7. 3.13.7  函数符号别名
      8. 3.13.8  归纳变量和强度降低
      9. 3.13.9  循环不变量代码运动
      10. 3.13.10 循环旋转
      11. 3.13.11 指令排程
      12. 3.13.12 尾部合并
      13. 3.13.13 自动增量寻址
      14. 3.13.14 块条件化
        1. 3.13.14.1 块条件化 C 源代码
        2. 3.13.14.2 的 C/C++ 编译器输出
      15. 3.13.15 结语内联
      16. 3.13.16 删除与零的比较
      17. 3.13.17 用常数除数进行整数除法
      18. 3.13.18 分支链接
  5. 4链接 C/C++ 代码
    1. 4.1 通过编译器调用链接器(-z 选项)
      1. 4.1.1 单独调用链接器
      2. 4.1.2 调用链接器作为编译步骤的一部分
      3. 4.1.3 禁用链接器(--compile_only 编译器选项)
    2. 4.2 链接器代码优化
      1. 4.2.1 生成死函数列表(--generate_dead_funcs_list 选项)
      2. 4.2.2 生成聚合数据子段(--gen_data_subsections 编译器选项)
    3. 4.3 控制链接过程
      1. 4.3.1 包含运行时支持库
        1. 4.3.1.1 自动选择运行时支持库
          1. 4.3.1.1.1 使用 --issue_remarks 选项
        2. 4.3.1.2 手动选择运行时支持库
        3. 4.3.1.3 用于搜索符号的库顺序
      2. 4.3.2 运行时初始化
      3. 4.3.3 Cinit 的初始化和看门狗计时器保持
      4. 4.3.4 全局对象构造函数
      5. 4.3.5 指定全局变量初始化类型
      6. 4.3.6 指定在内存中分配段的位置
      7. 4.3.7 链接器命令文件示例
  6. 5C/C++ 语言实现
    1. 5.1  ARM C 的特征
      1. 5.1.1 实现定义的行为
    2. 5.2  ARM C++ 的特征
    3. 5.3  使用 MISRA C 2004
    4. 5.4  使用 ULP Advisor
    5. 5.5  数据类型
      1. 5.5.1 枚举类型大小
    6. 5.6  文件编码和字符集
    7. 5.7  关键字
      1. 5.7.1 const 关键字
      2. 5.7.2 __interrupt 关键字
      3. 5.7.3 volatile 关键字
    8. 5.8  C++ 异常处理
    9. 5.9  寄存器变量和参数
      1. 5.9.1 本地寄存器变量和参数
      2. 5.9.2 全局寄存器变量
    10. 5.10 __asm 语句
    11. 5.11 pragma 指令
      1. 5.11.1  CALLS Pragma
      2. 5.11.2  CHECK_MISRA Pragma
      3. 5.11.3  CHECK_ULP Pragma
      4. 5.11.4  CODE_SECTION Pragma
      5. 5.11.5  CODE_STATE Pragma
      6. 5.11.6  DATA_ALIGN Pragma
      7. 5.11.7  DATA_SECTION Pragma
        1. 5.11.7.1 使用 DATA_SECTION Pragma C 源文件
        2. 5.11.7.2 使用 DATA_SECTION Pragma C++ 源文件
        3. 5.11.7.3 使用 DATA_SECTION Pragma 汇编源文件
      8. 5.11.8  诊断消息 Pragma
      9. 5.11.9  DUAL_STATE Pragma
      10. 5.11.10 FORCEINLINE Pragma
      11. 5.11.11 FORCEINLINE_RECURSIVE Pragma
      12. 5.11.12 FUNC_ALWAYS_INLINE Pragma
      13. 5.11.13 FUNC_CANNOT_INLINE Pragma
      14. 5.11.14 FUNC_EXT_CALLED Pragma
      15. 5.11.15 FUNCTION_OPTIONS Pragma
      16. 5.11.16 INTERRUPT Pragma
      17. 5.11.17 LOCATION Pragma
      18. 5.11.18 MUST_ITERATE Pragma
        1. 5.11.18.1 MUST_ITERATE Pragma 语法
        2. 5.11.18.2 使用 MUST_ITERATE 扩展编译器对循环的了解
      19. 5.11.19 NOINIT 和 PERSISTENT Pragma
      20. 5.11.20 NOINLINE Pragma
      21. 5.11.21 NO_HOOKS Pragma
      22. 5.11.22 once Pragma
      23. 5.11.23 pack Pragma
      24. 5.11.24 PROB_ITERATE Pragma
      25. 5.11.25 RESET_MISRA Pragma
      26. 5.11.26 RESET_ULP Pragma
      27. 5.11.27 RETAIN Pragma
      28. 5.11.28 SET_CODE_SECTION 和 SET_DATA_SECTION Pragma
      29. 5.11.29 SWI_ALIAS Pragma
      30. 5.11.30 TASK Pragma
      31. 5.11.31 UNROLL Pragma
      32. 5.11.32 WEAK Pragma
    12. 5.12 _Pragma 运算符
    13. 5.13 应用程序二进制接口
    14. 5.14 ARM 指令内在函数
    15. 5.15 目标文件符号命名规则(链接名)
    16. 5.16 更改 ANSI/ISO C/C++ 语言模式
      1. 5.16.1 C99 支持 (--c99)
      2. 5.16.2 C11 支持 (--c11)
      3. 5.16.3 严格 ANSI 模式和宽松 ANSI 模式(--strict_ansi 和 --relaxed_ansi)
    17. 5.17 GNU 、Clang 和 ACLE 语言扩展
      1. 5.17.1 扩展
      2. 5.17.2 函数属性
      3. 5.17.3 For 循环属性
      4. 5.17.4 变量属性
      5. 5.17.5 类型属性
      6. 5.17.6 内置函数
    18. 5.18 AUTOSAR
    19. 5.19 编译器限制
  7. 6运行时环境
    1. 6.1  存储器模型
      1. 6.1.1
      2. 6.1.2 C/C++ 系统堆栈
      3. 6.1.3 动态存储器分配
    2. 6.2  对象表示
      1. 6.2.1 数据类型存储
        1. 6.2.1.1 char 和 short 数据类型(有符号和无符号)
        2. 6.2.1.2 float、int 和 long 数据类型(有符号和无符号)
        3. 6.2.1.3 double、long double 和 long long 数据类型(有符号和无符号)
        4. 6.2.1.4 指向数据成员类型的指针
        5. 6.2.1.5 指向成员函数类型的指针
        6. 6.2.1.6 结构和数组对齐
      2. 6.2.2 位字段
      3. 6.2.3 字符串常量
    3. 6.3  寄存器惯例
    4. 6.4  函数结构和调用惯例
      1. 6.4.1 函数如何进行调用
      2. 6.4.2 被调用函数如何响应
      3. 6.4.3 C 异常处理程序调用惯例
      4. 6.4.4 访问参数和局部变量
    5. 6.5  访问 C 和 C++ 中的链接器符号
    6. 6.6  将 C 和 C++ 与汇编语言相连
      1. 6.6.1 使用汇编语言模块与 C/C++ 代码
      2. 6.6.2 从 C/C++ 访问汇编语言函数
        1. 6.6.2.1 从 C/C++ 程序调用汇编语言函数
        2. 6.6.2.2 由 调用的汇编语言程序
        3.       237
      3. 6.6.3 从 C/C++ 访问汇编语言变量
        1. 6.6.3.1 访问汇编语言全局变量
          1. 6.6.3.1.1 汇编语言变量程序
          2. 6.6.3.1.2 C 程序从 中访问汇编语言
        2.       242
        3. 6.6.3.2 访问汇编语言常量
          1. 6.6.3.2.1 从 C 语言访问汇编语言常量
          2. 6.6.3.2.2 的汇编语言程序
          3.        246
      4. 6.6.4 与汇编源代码共享 C/C++ 头文件
      5. 6.6.5 使用内联汇编语言
      6. 6.6.6 修改编译器输出
    7. 6.7  中断处理
      1. 6.7.1 在中断期间保存寄存器
      2. 6.7.2 使用 C/C++ 中断例程
      3. 6.7.3 使用汇编语言中断例程
      4. 6.7.4 如何将中断例程映射到中断向量
        1. 6.7.4.1 intvecs.asm 文件示例
      5. 6.7.5 使用软件中断功能
      6. 6.7.6 其他中断信息
    8. 6.8  固有运行时支持算术和转换例程
      1. 6.8.1 CPSR 寄存器和中断内在函数
    9. 6.9  内置函数
    10. 6.10 系统初始化
      1. 6.10.1 用于系统预初始化的引导挂钩函数
      2. 6.10.2 运行时栈
      3. 6.10.3 变量的自动初始化
        1. 6.10.3.1 零初始化变量
        2. 6.10.3.2 的直接初始化
        3. 6.10.3.3 运行时变量自动初始化
        4. 6.10.3.4 的自动初始化表
          1. 6.10.3.4.1 数据格式遵循的长度
          2. 6.10.3.4.2 零初始化格式
          3. 6.10.3.4.3 行程编码 (RLE) 格式
          4. 6.10.3.4.4 Lempel-Ziv-Storer-Szymanski 压缩 (LZSS) 格式
          5. 6.10.3.4.5 用于处理 C 自动初始化表的 C 代码示例
        5. 6.10.3.5 在加载时初始化变量
        6. 6.10.3.6 全局构造函数
      4. 6.10.4 初始化表
    11. 6.11 TIABI 下的双状态交互工作(已弃用)
      1. 6.11.1 双状态支持级别
      2. 6.11.2 实现
        1. 6.11.2.1 入口点的命名规则
        2. 6.11.2.2 间接调用
          1. 6.11.2.2.1 针对 16-BIS 状态编译的 C 代码:sum( )
          2. 6.11.2.2.2 的 16 位汇编语言程序
          3. 6.11.2.2.3 针对 32-BIS 状态编译的 C 代码:sum( )
          4. 6.11.2.2.4 的 32 位汇编语言程序
          5.        286
  8. 7使用运行时支持函数并构建库
    1. 7.1 C 和 C++ 运行时支持库
      1. 7.1.1 将代码与对象库链接
      2. 7.1.2 头文件
      3. 7.1.3 修改库函数
      4. 7.1.4 支持字符串处理
      5. 7.1.5 极少支持国际化
      6. 7.1.6 时间和时钟函数支持
      7. 7.1.7 允许打开的文件数量
      8. 7.1.8 源码树中的非标准头文件
      9. 7.1.9 库命名规则
    2. 7.2 C I/O 函数
      1. 7.2.1 高级别 I/O 函数
        1. 7.2.1.1 格式化和格式转换缓冲区
      2. 7.2.2 低级 I/O 实现概述
        1.       open
        2.       close
        3.       read
        4.       write
        5.       lseek
        6.       unlink
        7.       rename
      3. 7.2.3 器件驱动程序级别 I/O 函数
        1.       DEV_open
        2.       DEV_close
        3.       DEV_read
        4.       DEV_write
        5.       DEV_lseek
        6.       DEV_unlink
        7.       DEV_rename
      4. 7.2.4 为 C I/O 添加用户定义的器件驱动程序
        1. 7.2.4.1 将默认流映射到器件
      5. 7.2.5 器件前缀
        1.       add_device
        2.       321
        3. 7.2.5.1 为 C I/O 器件编程
    3. 7.3 处理可重入性(_register_lock() 和 _register_unlock() 函数)
    4. 7.4 库构建流程
      1. 7.4.1 所需的非德州仪器 (TI) 软件
      2. 7.4.2 使用库构建流程
        1. 7.4.2.1 通过链接器自动重建标准库
        2. 7.4.2.2 手动调用 mklib
          1. 7.4.2.2.1 构建标准库
          2. 7.4.2.2.2 共享或只读库目录
          3. 7.4.2.2.3 使用自定义选项构建库
          4. 7.4.2.2.4 mklib 程序选项摘要
      3. 7.4.3 扩展 mklib
        1. 7.4.3.1 底层机制
        2. 7.4.3.2 来自其他供应商的库
  9. 8C++ 名称还原器
    1. 8.1 调用 C++ 名称还原器
    2. 8.2 C++ 名称还原器的示例用法
  10.   A 术语表
    1.     A.1 术语
  11.   B 修订历史记录
  12.   B 早期修订版本

预先定义的宏名称

编译器维护并识别表 2-30 中列出的预定义宏名称。

表 2-30 预定义 ARM 宏名称
宏名称 说明
__16bis__ 如果选择了 16-BIS 状态(使用了 -code_state=16 选项),则已定义;否则未定义。
__32bis__ 如果选择了 32-BIS 状态(未使用 -code_state=16 选项),则已定义;否则未定义。
_AEABI_PORTABILITY_LEVEL 定义为 1,以便在包含头文件时,全面移植目标文件。定义为 0以便完全兼容 C 标准。有关详细信息,请参阅 ARM 标准。
__big_endian__ 如果选择了大端模式(使用了 --endian=big 选项或未使用 --endian=little 选项),则已定义;否则未定义。
__DATE__(1) mmm dd yyyy 形式扩展到编译日期
__FILE__(1) 扩展到当前源文件名
_INLINE 如果使用了优化(--opt_level 或 -O 选项),则扩展为 1;否则未定义。
__LINE__(1) 扩展到当前行号
__little_endian__ 如果选择了小端模式(使用了 --endian=little 选项),则已定义;否则未定义。
__PTRDIFF_T_TYPE__ 定义为 ptrdiff_t 类型
__signed_chars__ 如果 char 类型默认为有符号类型,则已定义
__SIZE_T_TYPE__ 定义为 size_t 类型
__STDC__(1) 定义为 1 以表示编译器符合 ISO C 标准。有关ISO C标准的例外情况,请参阅节 5.1
__STDC_VERSION__ C 标准宏。
__STDC_HOSTED__ C 标准宏。始终定义为 1。
__STDC_NO_THREADS__ C 标准宏。始终定义为 1。
__TI_COMPILER_VERSION__ 已定义为 7-9 位整数,具体取决于 X 是 1、2 还是 3 位。该数字不包含小数。例如,版本 3.2.1 表示为 3002001。去掉前导零以防止数字被解释为八进制。
__TI_EABI_SUPPORT__ 如果启用了 EABI ABI(这是默认设置),则定义为 1;否则未定义。
__TI_FPALIB_SUPPORT__ 如果 FPA 字节序用于存储双精度浮点值,则定义为 1;否则未定义。
__TI_GNU_ATTRIBUTE_SUPPORT__ 如果启用了 GCC 扩展(这是默认设置),则定义为 1
__TI_NEON_SUPPORT__ 如果目标是 NEON SIMD 扩展(使用了 --neon 选项),则定义为 1;否则未定义。
__TI_STRICT_ANSI_MODE__ 如果启用了严格的ANSI/ISO 模式(使用了 --strict_ansi 选项),则定义为 1;否则定义为 0。
__TI_STRICT_FP_MODE__ 如果使用了 --fp_mode=strict(默认设置),则定义为 1;否则定义为 0。
__TI_ARM__ 始终已定义
__TI_ARM_V4__ 如果目标是 v4 架构 (ARM7)(使用 -mv4 选项),则已定义为 1;否则未定义。
__TI_ARM_V5__ 如果目标是 v5E 架构 (ARM9E)(使用 -mv5e 选项),则已定义为 1;否则未定义。
__TI_ARM_V6__ 如果目标是 v6 架构 (ARM11)(使用了 -mv6 选项),则已定义为 1;否则未定义。
__TI_ARM_V6M0__ 如果目标是 v6M0 架构 (Cortex-M0)(使用了 -mv6M0 选项),则已定义为 1;否则未定义。
__TI_ARM_V7__ 如果目标是任意 v7 架构 (Cortex),则定义为 1;否则未定义。
__TI_ARM_V7A8__ 如果目标是 v7A8 架构 (Cortex-A8)(使用了 -mv7A8 选项),则定义为 1;否则未定义。
__TI_ARM_V7M3__ 如果目标是 v7M3 架构 (Cortex-M3)(使用了 -mv7M3 选项),则已定义为 1;否则未定义。
__TI_ARM_V7M4__ 如果目标是 v7M4 架构 (Cortex-M4)(使用了 -mv7M4 选项),则已定义为 1;否则未定义。
__TI_ARM_V7R4__ 如果目标是 v7R4 架构 (Cortex-R4)(使用了 -mv7R4 选项),则定义为 1;否则未定义。
__TI_ARM_V7R5__ 如果目标是 v7R5 架构 (Cortex-R5)(使用了 -mv7R5 选项),则定义为 1;否则未定义。
__TI_FPV4SPD16_SUPPORT__ 如果启用了 VFP 协处理器(使用了 --float_support=fpv4spd16 选项),则定义为 1;否则未定义。
__TI_VFP_SUPPORT__ 如果启用了 VFP 协处理器(使用了任意 --float_support 选项),则定义为 1;否则未定义。
__TI_VFPLIB_SUPPORT__ 如果 VFP 字节序用于存储双精度浮点值,则定义为 1;否则未定义。
__TI_VFPV3_SUPPORT__ 如果启用了 VFP 协处理器(使用了 --float_support=vfpv3 选项),则定义为 1;否则未定义。
__TI_VFPV3D16_SUPPORT__ 如果启用了 VFP 协处理器(使用了 --float_support=vfpv3d16 选项),则定义为 1;否则未定义。
__TI_WCHAR_T_BITS__ 定义为 wchar_t 类型。
__TIME__(1) 以“hh:mm:ss”形式扩展到编译时间
__unsigned_chars__ 如果 char 类型默认为无符号类型(默认设置),则已定义
__WCHAR_T_TYPE__ 定义为 wchar_t 类型。
由 ISO 标准指定
注:

名称中包含 __TI_ARM 的宏是旧的 __TI_TMS470 宏的副本。例如,__TI_ARM_V7__ 是 __TI_TMS470_V7__ 宏的新名称。旧的宏名称仍然存在并且可以继续使用。

可以按照与任何其他已定义名称相同的方式使用表 2-30 中列出的名称。例如,

printf ( "%s %s" , __TIME__ , __DATE__);

转换为类似如下行:

printf ("%s %s" , "13:58:17", "Jan 14 1997");

此外,ARM C 语言扩展 (ACLE) v2.0 规范描述了标识 ARM 架构特征的宏以及 C/C++ 实现如何使用该架构。所有 ACLE 预定义宏都以前缀 __ARM 开头。表 2-31 列出了 ACLE 规范中提到的宏以及规范中可提供更多信息的章节。有些宏未定义,是因为这些宏不适用于任何 Cortex-M 或 Cortex-R 处理器变体。

表 2-31 ACLE 预定义宏
宏名称 说明 ACLE 规范章节
__ARM_32BIT_STATE 如果编译器为 ARM 32 位处理器变体生成代码(-mv6m0、-mv7m3、-mv7m4、-mv7a8、-mv7r4 和 -mv7r5),则定义为 1;否则未定义。 (第 5.4.1 节)
__ARM_64BIT_STATE 未定义 (第 5.4.1 节)
__ARM_ACLE 对于所有 Cortex-M 和 Cortex-R 处理器变体(-mv6m0、-mv7m3、-mv7m4、-mv7r4 和 -mv7r5),定义为 200。 (第 3.4、5.2 节)
__ARM_ALIGN_MAX_PWR 不支持 (第 6.5.2 节)
__ARM_ALIGN_MAX_STACK_PWR 不支持 (第 6.5.3 节)
__ARM_ARCH 确定在编译器命令行上选择的 ARM 架构版本。
  • 4 表示 -mv4
  • 5 表示 -mv5e
  • 6 表示 -mv6 或 -mv6m0
  • 7 表示 -mv7a8、-mv7m3、-mv7m4、-mv7r4 或 -mv7r5
(第 5.1 节)
__ARM_ARCH_ISA_A64 未定义 (第 5.4.1 节)
__ARM_ARCH_ISA_ARM 如果编译器为支持 ARM 指令集的处理器变体生成代码(-mv7a8、-mv7r4 和 -mv7r5),则定义为 1;否则未定义。 (第 5.4.1 节)
__ARM_ARCH_ISA_THUMB 如果编译器为支持 THUMB-1 指令集的处理器变体生成代码,则定义为 1。如果编译器为支持 THUMB-2 指令集的处理器变体生成代码,则定义为 2;否则未定义。 (第 5.4.1 节)
__ARM_ARCH_PROFILE 不支持 (第 5.4.2 节)
__ARM_BIG_ENDIAN 默认定义为 1;如果使用了 --little-endian (-me) 选项,则未定义。 (第 5.3 节)
__ARM_FEATURE_CLZ 如果编译器为支持 CLZ 指令的处理器变体生成代码(-mv7m3、-mv7m4、-mv7a8、-mv7r4 和 -mv7r5),则定义为 1;否则未定义。 (第 5.4.5 节)
__ARM_FEATURE_COPROC 不支持 (第 5.9 节)
__ARM_FEATURE_CRC32 未定义 (第 5.5.8 节)
__ARM_FEATURE_CRYPTO 未定义 (第 5.5.7 节)
__ARM_FEATURE_DIRECTED_ROUNDING 未定义 (第 5.5.9 节)
__ARM_FEATURE_DSP 如果编译器为支持 DSP 指令/内在函数的 Cortex-M 或 Cortex-R 处理器生成代码(-mv7m4、-mv7r4 和 -mv7r5),则定义为 1;否则未定义。 (第 5.4.7 节)
__ARM_FEATURE_FMA 不支持 (第 5.5.3 节)
__ARM_FEATURE_FP16_SCALAR_ ARITHMETIC 未定义 (第 3.4、5.5.13 节)
__ARM_FEATURE_FP16_VECTOR_ ARITHMETIC 未定义 (第 5.5.13 节)
__ARM_FEATURE_IDIV 不支持 (第 5.4.10 节)
__ARM_FEATURE_JCVT 未定义 (第 5.5.14 节)
__ARM_FEATURE_LDREX 未定义 (第 5.4.4 节)
__ARM_FEATURE_NUMERIC_MAXMIN 未定义 (第 5.5.10 节)
__ARM_FEATURE_QBIT 不支持 (第 5.4.6 节)
__ARM_FEATURE_QRDMX 未定义 (第 5.5.12 节)
__ARM_FEATURE_SAT 如果编译器为支持 SSAT/USAT 指令/内在函数的处理器变体生成代码(-mv7m3、-mv7m4、-mv7a8、-mv7r4 和 -mv7r5),则定义为 1;否则未定义。 (第 5.4.8 节)
__ARM_FEATURE_SIMD32 如果编译器为支持所有 SIMD 指令/内在函数的处理器变体生成代码(-mv7m4、-mv7r4 和 -mv7r5),则定义为 1;否则未定义。 (第 5.4.9 节)
__ARM_FEATURE_UNALIGNED 如果编译器为支持对存储器进行无符号访问的处理器变体生成代码(-mv7m3、-mv7m4、-mv7a8、-mv7r4 和 -mv7r5),则定义为 1;否则未定义。 (第 5.4.3 节)
__ARM_FP 对于 --float_support={fpv4spd16 | fpv5spd16},定义为 6。对于 --float_support={vfpv2 | vfpv3 | vfpv3d16},定义为 12;否则未定义。 (第 5.5.1 节)
__ARM_FP16_ARGS 如果将 16 位浮点类型可以用于参数和/或结果,则定义为 1;否则未定义。 (第 5.5.11 节)
__ARM_FP16_FORMAT_ALTERNATIVE 未定义 (第 5.5.2 节)
__ARM_FP16_FORMAT_IEEE 如果使用了 IEEE 格式的16 位浮点(根据 IEEE 754-2008 标准),则定义为 1;否则未定义。 (第 5.5.2 节)
__ARM_FP_FAST 不支持 (第 5.6 节)
__ARM_FP_FENV_ROUNDING 不支持 (第 5.6 节)
__ARM_NEON 未定义 (第 3.4、5.5.4 节)
__ARM_NEON_FP 未定义 (第 5.5.5 节)
__ARM_PCS 如果编译器可以假设转换单元的默认程序调用标准符合 ARM 架构程序调用标准 (AAPCS) 规范中规定的“基础程序调用标准”(-mv7m3、-mv7m4、-mv7r4 和 -mv7r5),则定义为 1;否则未定义。 (第 5.7 节)
__ARM_PCS_AAPCS64 未定义 (第 5.7 节)
__ARM_PCS_VFP 如果默认程序调用约定是在硬件浮点寄存器中传递浮点参数/返回值,则定义为 1;否则未定义。 (第 5.7 节)
__ARM_ROPI 未定义 (第 5.8 节)
__ARM_RWPI 未定义 (第 5.8 节)
__ARM_SIZEOF_MINIMAL_ENUM 定义为最小的枚举类型大小(packed 为 1 个字节,int 为 4 个字节)。这反映了 --enum_type=[packed | int] 选项,其中packed是默认值。 (第 3.1.1 节)
__ARM_SIZEOF_WCHAR_T 如果 --wchar_t=16(默认设置),则定义为 2。如果 --wchar_t=32,则定义为 4。 (第 3.1.1 节)
__ARM_WMMX 未定义 (第 5.5.6 节)
__STDC_IEC_559__ 未定义 (第 5.6 节)
__SUPPORT_SNAN__ 不支持 (第 5.6 节)