ZHCUCO7B December   2024  – November 2025 F29H850TU , F29H859TU-Q1

 

  1.   1
  2.   摘要
  3.   商标
  4. 1引言
  5. 2性能优化
    1. 2.1 编译器设置
      1. 2.1.1 启用调试和源代码交叉列
      2. 2.1.2 优化控制
      3. 2.1.3 浮点数学
      4. 2.1.4 定点除法
      5. 2.1.5 单精度与双精度浮点
      6. 2.1.6 链接时优化 (LTO)
    2. 2.2 存储器设置
      1. 2.2.1 从 RAM 执行代码
      2. 2.2.2 从闪存执行代码
      3. 2.2.3 数据放置
    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 准确剖析代码
    4. 2.4 应用代码优化
      1. 2.4.1 SDK 优化库
      2. 2.4.2 使用库优化代码尺寸
      3. 2.4.3 C29 特别指令
      4. 2.4.4 C29 并行性
      5. 2.4.5 首选 32 位变量和写入
      6. 2.4.6 编码风格及其对性能的影响
  6. 3参考资料
  7. 4修订历史记录

内联函数

当使用 -ffast-math 编译器选项时,C29 包含的指令支持高效实现许多标准 RTS 函数。编译器还支持与这些指令相对应的内置函数或内联函数。这F29-SDK 在 examples/rtlibs/fastmath/tmu 中提供了示例,说明如何使用这些内联函数。支持的示例包括 asinf()、acosf()、atan2f()、ceilf()、cosf()、divf()、expf()、floorf()、fmodf()、roundf()、sinf()、truncf()。

  • 此外,编译器支持使用 ISQRTF 指令实现 sqrtf() 和 1/sqrtf()。相应的内联函数如下面的代码块中所示。
    float __builtin_c29_i32_isqrtf32_m(float x);
  • IEXP2F 的内联函数如下面的代码块中所示。
    float __builtin_c29_i32_iexp2f32_m(float f0);
    注: 由于 IEXP2F 在基值或指数较大时存在精度限制,因此编译器不支持通过 IEXP2F 实现 expf()、exp2f()、1/expf() 或 1/exp2f()。但是,F29x-SDK 在 examples/rtlibs/fastmath/tmu/ccs/expf_example 中包含了此情况的示例,展示如何使用有一定输入范围的内联函数。指令(和内联函数)对一定范围的基值/指数值仍然准确且有用。
  • 编译器支持通过 LOG2F 指令进行对数计算。此外,LOG2F 的内联函数如下面的代码块中所示。其可用于实现 logf()、log2f() 和 powf()。
    float __builtin_c29_i32_log2f32_m(float f0);
  • atanf() 可以通过 PUATANF 实现,使用内联函数 float __builtin_c29_i32_puatanf32_m(float f0)
    Example:
    // x is per-unit in [-1,1]
    // y is per-unit in [-0.125, 0.125] i.e. [-pi/4, pi/4] radians
    y = __builtin_c29_i32_puatanf32_m(x);
  • 编译器支持通过 PUATANF 和 QUADF 指令进行 atan2f() 计算。此外,可使用内联函数 float __builtin_c29_i32_puatanf32_m(float f0) 和 float __builtin_c29_quadf32(unsigned int * tdm_w_uip0, float * rw_fp1, float * rw_fp2) 实现 atan2f()
    Example:
    test_output =puatan2f32(y_input,x_input);
    
    static inline float32_t puatan2f32(float32_t y, float32_t x)
    {
       uint32_t flags;
       return __builtin_c29_quadf32(&flags, &y, &x) +      __builtin_c29_i32_puatanf32_m(y / x);
    }