ZHCU820Y September   2004  – June 2021

 

  1. 1请先阅读
    1. 1.1 关于本手册
    2. 1.1 标记规则
    3. 1.1 相关文档
    4. 1.1 德州仪器 (TI) 提供的相关文档
    5. 1.1 商标
  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 设置默认编译器选项 (MSP430_C_OPTION)
      2. 2.4.2 命名一个或多个备用目录 (MSP430_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 选项)
    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 启用入口挂钩和出口挂钩函数
  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 调试优化代码
    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 用常数除数进行整数除法
  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 条件链接
      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 通过中断向量进行初始化
      4. 4.3.4 FRAM 内存保护单元的初始化
      5. 4.3.5 Cinit 的初始化和看门狗计时器保持
      6. 4.3.6 全局对象构造函数
      7. 4.3.7 指定全局变量初始化类型
      8. 4.3.8 指定在内存中分配段的位置
      9. 4.3.9 链接器命令文件示例
  6. 5C/C++ 语言实现
    1. 5.1  MSP430 C 的特征
      1. 5.1.1 实现定义的行为
    2. 5.2  MSP430 C++ 的特征
    3. 5.3  使用 ULP Advisor
    4. 5.4  关于硬件配置的建议
    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 restrict 关键字
      4. 5.7.4 volatile 关键字
    8. 5.8  C++ 异常处理
    9. 5.9  寄存器变量和参数
    10. 5.10 __asm 语句
    11. 5.11 pragma 指令
      1. 5.11.1  BIS_IE1_INTERRUPT
      2. 5.11.2  CALLS Pragma
      3. 5.11.3  CHECK_ULP Pragma
      4. 5.11.4  CODE_ALIGN Pragma
      5. 5.11.5  CODE_SECTION 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  FORCEINLINE Pragma
      10. 5.11.10 FORCEINLINE_RECURSIVE Pragma
      11. 5.11.11 FUNC_ALWAYS_INLINE Pragma
      12. 5.11.12 FUNC_CANNOT_INLINE Pragma
      13. 5.11.13 FUNC_EXT_CALLED Pragma
      14. 5.11.14 FUNC_IS_PURE Pragma
      15. 5.11.15 FUNC_NEVER_RETURNS Pragma
      16. 5.11.16 FUNC_NO_GLOBAL_ASG Pragma
      17. 5.11.17 FUNC_NO_IND_ASG Pragma
      18. 5.11.18 FUNCTION_OPTIONS Pragma
      19. 5.11.19 INTERRUPT Pragma
      20. 5.11.20 LOCATION Pragma
      21. 5.11.21 MUST_ITERATE Pragma
        1. 5.11.21.1 MUST_ITERATE Pragma 语法
        2. 5.11.21.2 使用 MUST_ITERATE 扩展编译器对循环的了解
      22. 5.11.22 NOINIT 和 PERSISTENT Pragma
      23. 5.11.23 NOINLINE Pragma
      24. 5.11.24 NO_HOOKS Pragma
      25. 5.11.25 once Pragma
      26. 5.11.26 pack Pragma
      27. 5.11.27 PROB_ITERATE Pragma
      28. 5.11.28 RESET_ULP Pragma
      29. 5.11.29 RETAIN Pragma
      30. 5.11.30 SET_CODE_SECTION 和 SET_DATA_SECTION Pragma
      31. 5.11.31 UNROLL Pragma
      32. 5.11.32 vector Pragma
      33. 5.11.33 WEAK Pragma
    12. 5.12 _Pragma 运算符
    13. 5.13 应用程序二进制接口
    14. 5.14 目标文件符号命名规则(链接名)
    15. 5.15 更改 ANSI/ISO C/C++ 语言模式
      1. 5.15.1 C99 支持 (--c99)
      2. 5.15.2 C11 支持 (--c11)
      3. 5.15.3 严格 ANSI 模式和宽松 ANSI 模式(--strict_ansi 和 --relaxed_ansi)
    16. 5.16 GNU 和 Clang 语言扩展
      1. 5.16.1 扩展
      2. 5.16.2 函数属性
      3. 5.16.3 For 循环属性
      4. 5.16.4 变量属性
      5. 5.16.5 类型属性
      6. 5.16.6 内置函数
    17. 5.17 编译器限制
  7. 6运行时环境
    1. 6.1  内存模型
      1. 6.1.1 代码内存模型
      2. 6.1.2 数据存储器模式
      3. 6.1.3 支持近数据
      4. 6.1.4
      5. 6.1.5 C/C++ 软件堆栈
      6. 6.1.6 动态内存分配
    2. 6.2  对象表示
      1. 6.2.1 数据类型存储
        1. 6.2.1.1 指向成员函数类型的指针
        2. 6.2.1.2 结构和数组对齐
        3. 6.2.1.3 字段/结构对齐
        4. 6.2.1.4 var 的 C 代码定义
      2. 6.2.2 字符串常量
    3. 6.3  寄存器惯例
    4. 6.4  函数结构和调用惯例
      1. 6.4.1 函数如何进行调用
      2. 6.4.2 被调用函数如何响应
      3. 6.4.3 访问参数和局部变量
    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 Topic Link Label1 调用的汇编语言程序
        3.       227
      3. 6.6.3 从 C/C++ 访问汇编语言变量
        1. 6.6.3.1 访问汇编语言全局变量
          1. 6.6.3.1.1 汇编语言变量程序
          2. 6.6.3.1.2 C 程序从 Topic Link Label1 中访问汇编语言
        2.       232
        3. 6.6.3.2 访问汇编语言常量
          1. 6.6.3.2.1 从 C 语言访问汇编语言常量
          2. 6.6.3.2.2 Topic Link Label1 的汇编语言程序
          3.        236
      4. 6.6.4 与汇编源代码共享 C/C++ 头文件
      5. 6.6.5 使用内联汇编语言
    7. 6.7  中断处理
      1. 6.7.1 在中断期间保存寄存器
      2. 6.7.2 使用 C/C++ 中断例程
        1.       242
      3. 6.7.3 使用汇编语言中断例程
      4. 6.7.4 中断向量
      5. 6.7.5 其他中断信息
    8. 6.8  使用内在函数访问汇编语言语句
      1. 6.8.1 MSP430 内在函数
      2. 6.8.2 Floating Point Conversion Intrinsics
      3. 6.8.3 弃用的内在函数
      4. 6.8.4 __delay_cycle 内在函数
      5. 6.8.5 __never_executed 内在函数
        1. 6.8.5.1 将 __never_executed 与矢量发生器搭配使用
          1. 6.8.5.1.1 TBIV 矢量发生器
          2.        254
        2. 6.8.5.2 将 __never_executed 与通用 Switch 表达式搭配使用
          1. 6.8.5.2.1 通用 Switch 语句
          2.        257
    9. 6.9  系统初始化
      1. 6.9.1 用于系统预初始化的引导挂钩函数
      2. 6.9.2 运行时栈
      3. 6.9.3 变量的自动初始化
        1. 6.9.3.1 零初始化变量
        2. 6.9.3.2 的直接初始化
        3. 6.9.3.3 在 运行时自动初始化变量
        4. 6.9.3.4 的自动初始化表
          1. 6.9.3.4.1 数据格式遵循的长度
          2. 6.9.3.4.2 零初始化格式
          3. 6.9.3.4.3 行程编码 (RLE) 格式
          4. 6.9.3.4.4 Lempel-Ziv-Storer-Szymanski 压缩 (LZSS) 格式
        5. 6.9.3.5 在加载时初始化变量
        6. 6.9.3.6 全局构造函数
      4. 6.9.4 初始化表
    10. 6.10 对 20 位 MSP430X 器件的编译
  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.       308
        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++ 名称还原器的示例用法
      1.      A 术语表
        1.       A.1 术语
          1.        B 修订历史记录

运行时模型选项

这些选项对 MSP430 工具集来说是特定的。有关更多信息,请参阅参考的章节。Topic Link Label3.3.11中列出了 MSP430 专用汇编器选项。

MSP430 编译器现在仅支持使用 ELF 目标文件格式和 DWARF 调试格式的嵌入式应用程序二进制接口 (EABI) ABI。如果希望支持传统的COFF ABI,请使用 MSP430 v4.4 代码生成工具,并参阅 SLAU132JSLAU131J 以查看相关文档。

--common={on|off} 当为on(默认设置)时,未初始化的文件范围变量作为通用符号发出。当为off 时,不会创建通用符号。允许创建通用符号的好处是生成的代码可以删除未使用的变量,否则会增加 .bss 段的大小。(大于 32 字节的未初始化变量通过放置在可以在链接时省略的单独子段中被单独地优化。)如果变量已分配到 .bss 以外的段,则变量不能作为通用符号。
--code_model={large|small} 指定代码内存模型:小型(16 位函数指针和低 64K 内存)或大型(20 位函数指针和 1MB 地址空间)。有关详细信息,请参阅Topic Link Label7.1.1
--data_model={restricted|large|
small}
指定数据内存模型:小型(16 位数据指针和低 64K 内存)、受限(32 位数据指针、限制为64K的对象 和 1MB 内存)和大型(32 位数据指针和 1MB内存)。有关详细信息,请参阅Topic Link Label7.1.2
--disable_interrupts_around_hw_mpy=off 将此选项设置为 off 会在内联的硬件乘法期间启用中断。(内联硬件乘法由 --use_hw_mpy 和 --opt_for_speed 选项控制。)

仅当应用程序中的所有 ISR 不使用乘法并且不调用其他函数时才应使用此选项。默认情况下,如果硬件乘法被内联,则在硬件乘法期间禁用中断,因为此类运算不可重入。

如果此选项设置为 off 并且 ISR 使用乘法,则链接器会发出警告,指出 ISR 中的乘法将使用 RTS 软件乘法例程而不是 RTS 硬件乘法例程。

如果此选项设置为 off 并且 ISR 调用其他函数,则链接器生成非致命错误诊断,指示如果应用程序包含调用其他函数的 ISR,则不能使用选项 --disable_interrupts_around_hw_mpy=off。这样做的原因是,如果 ISR 调用使用硬件乘法器进行乘法的例程,那么启用中断的内联硬件乘法器就不再安全了。

--enum_type={packed|unpacked} 默认情况下,编译器使用 --enum_type=unpacked,这意味着编译器使用不小于 16 位的整数类型(int、long 或 long long)来存储枚举类型变量。如果枚举常量值适合 8 位整数类型,则 --enum_type=packed 选项会使编译器使用 8 位整数类型。有关枚举类型大小的详细信息,请参阅Topic Link Label6.5.1

不要将使用 --enum_type=packed 选项编译的目标文件与没有使用该选项编译的目标文件一起链接。如果正在使用 --enum_type=packed 选项,则必须始终使用该选项来编译所有 C/C++ 文件;否则,您将遇到直到运行时才能检测到的错误。

--large_memory_model 已弃用此选项。使用 --data_model=large。
--near_data={globals|none} 指定全局读取/写入数据必须位于内存的前 64K 中。有关详细信息,请参阅Topic Link Label7.1.3
--pending_instantiations=# 指定在任何给定时间可能正在进行的模板实例化的数量。使用 0 指定无限数量。
--plain_char={unsigned|signed} 指定如何处理 C/C++ 普通字符变量。默认为无符号。
--ramfunc={on|off} 如果设置为 on,则指定所有函数都应放置在位于RAM 中的 .TI.ramfunc 段中。如果设置为 off,则只有具有 ramfunc 函数属性的函数才会以此种方式被处理。请参阅Topic Link Label6.16.2

较新的 TI 链接器命令文件通过在 .TI.ramfunc 段中旋转函数来自动支持 --ramfunc 选项。如果链接器命令文件不包含 .TI.ramfunc 段的段规格,则可以修改链接器命令文件以将此段放在 RAM 中。有关段放置位置的详细信息,请参阅《MSP430 汇编语言工具用户指南》。

--silicon_version 选择指令集版本。使用 --silicon_version=mspx 为 MSP430X 器件生成代码(20 位代码寻址)。使用 --silicon_version=msp 为 16 位 MSP430 器件生成代码。

为 16 位 MSP430 器件汇编/编译的模块与为 20 位 MSPx 器件汇编/编译的模块不兼容。如果试图组合不兼容的目标文件,链接器将生成错误。

--use_hw_mpy[= 16,32,F5,none] 此选项是编译器选项。该选项应放置在命令行上 -z 选项之前。

MSP430 器件没有乘法指令,而有些器件根本没有硬件乘法。乘法由库函数执行。该库函数要么使用硬件乘法功能,要么在软件中模拟该功能。默认情况下,编译器生成相应版本的引用但该版本不使用某些 MSP430 器件版本上可用的硬件乘法器外设。如果 MSP430 器件具有多个硬件,则可以选择使用与硬件匹配的库例程以获得最佳性能。在为硬件乘法器可用的器件进行编译时,请使用 --use_hw_mpy 编译器选项。

在编译时,如果 --opt_for_speed 设置为 4 或 5 并且 --opt_level 设置为除“off”以外的任何值,则使用此选项会导致在代码生成期间内联硬件乘法调用。如果要控制在内联硬件乘法期间是否启用中断,请参阅 --disable_interrupts_around_hw_mpy=off 选项。

如果未启用内联但启用了其他优化(--opt_for_speed 设置为 1、2 或 3),则使用此选项会使链接器将所有对默认乘法例程的引用替换为支持硬件乘法器的乘法例程版本。

可选参数指示正在使用哪个版本的硬件乘法,并且必须为以下之一:

  • 16 使用 F1xx/2xx/4xx 系列 16 位硬件乘法器(默认值)
  • 32 使用 F4xx 32 位硬件乘法器
  • F5 使用 F5xx/6xx 系列 32 位硬件乘法器
  • none = 不使用硬件乘法器

有关硬件乘法器的更多信息,请参阅 MSP430x1xx、MSP430x3xx、MSP430x4xx 和 MSP430x5xx 系列用户指南