ZHCADC3B February   2019  – October 2023

 

  1.   1
  2. 简介
    1. 1.1  ABI - C28x
    2. 1.2  范围
    3. 1.3  ABI 变体
    4. 1.4  工具链和互操作性
    5. 1.5 
    6. 1.6  目标文件的类型
    7. 1.7 
    8. 1.8  C28x 架构概述
    9. 1.9  C28x 存储器模型
    10. 1.10 参考文档
    11. 1.11 代码片段表示法
  3. 数据表示
    1. 2.1 基本类型
    2. 2.2 寄存器中的数据
    3. 2.3 存储器中的数据
    4. 2.4 指针类型
    5. 2.5 复数类型
    6. 2.6 结构体和联合体
    7. 2.7 数组
    8. 2.8 位字段
      1. 2.8.1 易失性位字段
    9. 2.9 枚举类型
  4. 调用约定
    1. 3.1 调用和返回
      1. 3.1.1 调用指令
        1. 3.1.1.1 间接调用
        2. 3.1.1.2 直接调用
      2. 3.1.2 返回指令
      3. 3.1.3 流水线约定
      4. 3.1.4 弱函数
    2. 3.2 寄存器惯例
      1. 3.2.1 实参寄存器
      2. 3.2.2 被调用者保存的寄存器
    3. 3.3 实参传递
      1. 3.3.1 传递 16 位实参的
      2. 3.3.2 传递更长实参的
      3. 3.3.3 C++ 实参传递
      4. 3.3.4 传递结构体和联合体
      5. 3.3.5 未在寄存器中传递的实参的栈布局
      6. 3.3.6 帧指针
    4. 3.4 返回值
    5. 3.5 通过引用传递并返回的结构体和联合体
    6. 3.6 编译器辅助函数的约定
    7. 3.7 逻辑程序和收尾程序辅助函数
    8. 3.8 已见函数的暂存寄存器
    9. 3.9 中断函数
  5. 数据分配和寻址
    1. 4.1 数据段和数据区段
    2. 4.2 数据分块
    3. 4.3 寻址模式
    4. 4.4 静态数据的分配和寻址
      1. 4.4.1 静态数据的寻址方法
      2. 4.4.2 静态数据的放置约定
        1. 4.4.2.1 寻址的抽象约定
      3. 4.4.3 静态数据的初始化
    5. 4.5 自动变量
    6. 4.6 帧布局
      1. 4.6.1 栈对齐
      2. 4.6.2 寄存器保存顺序
    7. 4.7 堆分配对象
  6. 代码分配和寻址
    1. 5.1 计算代码标签的地址
    2. 5.2 调用
      1. 5.2.1 直接 调用
      2. 5.2.2 Far Call Trampoline
      3. 5.2.3 间接调用
  7. 辅助函数 API
    1. 6.1 浮点行为
    2. 6.2 C 辅助函数 API
    3. 6.3 C99 的浮点辅助函数
  8. 标准 C 库 API
    1. 7.1  关于标准 C 库
    2. 7.2  保留符号
    3. 7.3  <assert.h> 实现
    4. 7.4  <complex.h> 实现
    5. 7.5  <ctype.h> 实现
    6. 7.6  <errno.h> 实现
    7. 7.7  <float.h> 实现
    8. 7.8  <inttypes.h> 实现
    9. 7.9  <iso646.h> 实现
    10. 7.10 <limits.h> 实现
    11. 7.11 <locale.h> 实现
    12. 7.12 <math.h> 实现
    13. 7.13 <setjmp.h> 实现
    14. 7.14 <signal.h> 实现
    15. 7.15 <stdarg.h> 实现
    16. 7.16 <stdbool.h> 实现
    17. 7.17 <stddef.h> 实现
    18. 7.18 <stdint.h> 实现
    19. 7.19 <stdio.h> 实现
    20. 7.20 <stdlib.h> 实现
    21. 7.21 <string.h> 实现
    22. 7.22 <tgmath.h> 实现
    23. 7.23 <time.h> 实现
    24. 7.24 <wchar.h> 实现
    25. 7.25 <wctype.h> 实现
  9. C++ ABI
    1. 8.1  限制 (GC++ABI 1.2)
    2. 8.2  导出模板 (GC++ABI 1.4.2)
    3. 8.3  数据布局(GC++ABI 第 2 章)
    4. 8.4  初始化保护变量 (GC++ABI 2.8)
    5. 8.5  构造函数返回值 (GC++ABI 3.1.5)
    6. 8.6  一次性构建 API (GC++ABI 3.3.2)
    7. 8.7  控制对象构造顺序 (GC++ ABI 3.3.4)
    8. 8.8  还原器 API (GC++ABI 3.4)
    9. 8.9  静态数据 (GC++ ABI 5.2.2)
    10. 8.10 虚拟表和键函数 (GC++ABI 5.2.3)
    11. 8.11 回溯表位置 (GC++ABI 5.3)
  10. 异常处理
    1. 9.1  概述
    2. 9.2  PREL31 编码
    3. 9.3  异常索引表 (EXIDX)
      1. 9.3.1 指向行外 EXTAB 条目的指针
      2. 9.3.2 EXIDX_CANTUNWIND
      3. 9.3.3 内联 EXTAB 条目
    4. 9.4  异常处理指令表 (EXTAB)
      1. 9.4.1 EXTAB 通用模型
      2. 9.4.2 EXTAB 紧凑模型
      3. 9.4.3 个性化例程
    5. 9.5  回溯指令
      1. 9.5.1 通用序列
      2. 9.5.2 字节编码展开指令
    6. 9.6  描述符
      1. 9.6.1 类型标识符编码
      2. 9.6.2 作用域
      3. 9.6.3 Cleanup 描述符
      4. 9.6.4 catch 描述符
      5. 9.6.5 函数异常规范 (FESPEC) 描述符
    7. 9.7  特殊段
    8. 9.8  与非 C++ 代码交互
      1. 9.8.1 EXIDX 条目自动生成
      2. 9.8.2 手工编码的汇编函数
    9. 9.9  与系统功能交互
      1. 9.9.1 共享库
      2. 9.9.2 覆盖块
      3. 9.9.3 中断
    10. 9.10 TI 工具链中的汇编语言运算符
  11. 10DWARF
    1. 10.1 DWARF 寄存器名称
    2. 10.2 调用帧信息
    3. 10.3 供应商名称
    4. 10.4 供应商扩展
  12. 11ELF 目标文件(处理器补充)
    1. 11.1 注册供应商名称
    2. 11.2 ELF 标头
    3. 11.3
      1. 11.3.1 段索引
      2. 11.3.2 段类型
      3. 11.3.3 扩展段标头属性
      4. 11.3.4 子段
      5. 11.3.5 特殊段
      6. 11.3.6 段对齐
    4. 11.4 符号表
      1. 11.4.1 符号类型
      2. 11.4.2 通用块符号
      3. 11.4.3 符号名称
      4. 11.4.4 保留符号名称
      5. 11.4.5 映射符号
    5. 11.5 重定位
      1. 11.5.1 重定位类型
        1. 11.5.1.1 绝对重定位
        2. 11.5.1.2 PC 相对重定位
        3. 11.5.1.3 数据段中的重定位
        4. 11.5.1.4 C28x 指令的重定位
        5. 11.5.1.5 其他重定位类型
      2. 11.5.2 重定位操作
      3. 11.5.3 未解析的弱引用的重定位
  13. 12ELF 程序加载和链接(处理器补充)
    1. 12.1 程序标头
      1. 12.1.1 基址
      2. 12.1.2 段内容
      3. 12.1.3 线程局部存储
    2. 12.2 程序加载
  14. 13构建属性
    1. 13.1 关于构建属性
    2. 13.2 C28x ABI 构建属性子段
    3. 13.3 构建属性标签
  15. 14复制表和变量初始化
    1. 14.1 关于复制表
    2. 14.2 复制表格式
    3. 14.3 压缩的数据格式
      1. 14.3.1 RLE
      2. 14.3.2 LZSS 格式
    4. 14.4 变量初始化
  16. 15修订历史记录
    1.     188

C 辅助函数 API

编译器生成对辅助函数的调用以执行编译器需要支持但架构不直接支持的运算,例如在缺少专用硬件的设备上执行浮点运算。这些辅助函数必须在符合 ABI 的任何工具链的 RTS 库中实现。

辅助函数使用前缀 _ _C28x 命名。具有此前缀的任何标识符都将保留供 ABI 使用。

辅助函数遵守标准调用约定。

下表使用 C 表示法和语法指定辅助函数。表中的类型对应于节 2.1中指定的通用数据类型。

表 6-1 中的函数执行各种数学、逻辑和比较运算。

表 6-1 TMS320C28x EABI 函数
签名说明
__c28xabi_absll返回 long long int 的绝对值。
__c28xabi_addd将两个双精度浮点数相加。
__c28xabi_addf将两个单精度浮点数相加。
__c28xabi_andll两个 long long int 值按位与运算。
__c28xabi_cmpd比较两个双精度浮点数。
__c28xabi_cmpf比较两个单精度浮点数。
__c28xabi_cmpll比较两个 signed long long int 值。
__c28xabi_cmpull比较两个 unsigned long long int 值。
__c28xabi_divd将两个双精度浮点数相除。
__c28xabi_divf将两个单精度浮点数相除。
__c28xabi_divi将两个 16 位 signed int 相除。
__c28xabi_divl将两个 32 位 signed int 相除。
__c28xabi_divll将两个 64 位 signed long long int 值相除。
__c28xabi_divu将两个 16 位 unsigned int 相除。
__c28xabi_divul将两个 32 位 unsigned int 相除。
__c28xabi_divull将两个 64 位 unsigned long long int 值相除。
__c28xabi_dtof将双精度浮点数转换为单精度浮点数。
__c28xabi_dtoi将双精度浮点数转换为 16 位 signed int。
__c28xabi_dtol将双精度浮点数转换为 32 位 signed int。
__c28xabi_dtoll将双精度浮点数转换为 64 位 signed long long int。
__c28xabi_dtou将双精度浮点数转换为 16 位 unsigned int。
__c28xabi_dtoul将双精度浮点数转换为 32 位 unsigned int。
__c28xabi_dtoull将双精度浮点数转换为 64 位 unsigned long long int。
_c28xabi_ftod将单精度浮点数转换为双精度浮点数。
__c28xabi_ftoi将单精度浮点数转换为 16 位 signed int。
__c28xabi_ftol将单精度浮点数转换为 32 位 signed int。
__c28xabi_ftoll将单精度浮点数转换为 64 位 signed long long int。
__c28xabi_ftou将单精度浮点数转换为 16 位 unsigned int。
__c28xabi_ftoul将单精度浮点数转换为 32 位 unsigned int。
__c28xabi_ftoull将单精度浮点数转换为 64 位 unsigned long long int。
__c28xabi_itod将 16 位 signed int 转换为双精度浮点数。
__c28xabi_itof将 16 位 signed int 转换为单精度浮点数。
__c28xabi_lltod将 64 位 signed int 转换为双精度浮点数。
__c28xabi_lltof将 64 位 signed int 转换为单精度浮点数。
__c28xabi_ltod将 32 位 signed int 转换为双精度浮点数。
__c28xabi_ltof将 32 位 signed int 转换为单精度浮点数。
__c28xabi_modi计算有符号 16 位除法的余数。
__c28xabi_modl计算有符号 32 位除法的余数。
_c28xabi_modll计算 64 位 signed long long int 除法的余数。
__c28xabi_modu计算无符号 16 位除法的余数。
__c28xabi_modul计算无符号 32 位除法的余数。
__c28xabi_modull计算 64 位 unsigned long long int 除法的余数。
__c28xabi_mpyd将两个双精度浮点数相乘。
__c28xabi_mpyf将两个单精度浮点数相乘。
__c28xabi_mpyll将两个 64 位 signed long long int 相乘。
__c28xabi_negd对双精度浮点数取反。
__c28xabi_negf对单精度浮点数取反。
__c28xabi_orll两个 long long int 值按位或运算。
__c28xabi_subd从一个双精度浮点数减去另一个双精度浮点数。
__c28xabi_subf从一个单精度浮点数减去另一个单精度浮点数。
__c28xabi_ulltod将 64 位 unsigned long long int 转换为双精度浮点数。
__c28xabi_ulltof将 64 位 unsigned long long int 转换为单精度浮点数。
__c28xabi_ultod将 32 位 unsigned int 转换为双精度浮点数。
__c28xabi_ultof将 32 位 unsigned int 转换为单精度浮点数。
__c28xabi_utod将 16 位 unsigned int 转换为双精度浮点数。
__c28xabi_utof将 16 位 unsigned int 转换为单精度浮点数。
__c28xabi_xorll两个 long long int 值按位异或运算。