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修订历史记录

C29 特别指令

C29 支持许多可用于优化特定函数类型的指令。下面列出了主要示例:

  • SVGEN — 空间矢量生成可通过 QUADF 指令进行优化,使用内联函数“float __builtin_c29_quadf32(unsigned int * tdm_w_uip0, float * rw_fp1, float * rw_fp2)”进行利用。
    注: 已在 F29x Motor Control SDK 中计划了 SVGEN(包括可应用于三级逆变器的 SVGEN)的优化实现。
  • CRC — 循环冗余校验实现可通过 CRC 指令进行优化。F29x SDK 中提供了代码示例。还提供了一个内联函数“unsigned int __builtin_c29_i32_crc(unsigned int ui0, unsigned int ui1, unsigned int ui2, unsigned int ui3)”。
  • 限制(饱和)运算 — 可使用 MINMAXF 指令进行优化。
    • 如果使用三元运算符编写 C 代码,且 min 与 max 是常量,并使用 -O3 和 -ffast-math 选项进行编译,则编译器会生成 MINMAXF 指令和一个出色的实现。此实现速度最快,因为它包含两条并行执行的 MV 指令,后跟 MINMAXF 指令。如果 min 和 max 是常量,但仅使用了 -O3,则不会生成 MINMAXF,而是生成 CMPF 和 SELECT 指令对。如果 min 和 max 并非常量,并且使用了 -O3 和 -ffast-math 选项,则编译器会生成从内存读取的 LD 指令,接着生成 CMPF、SELECT 和 MAXF 指令。
      float saturation(float in)
      { 
         float out; 
         out = (in > max)? max:((in < min)? min:in); 
         return out;
      }
    • 使用 if.else 条件和下面的任一实现,行为与上述完全相同。
      float saturation(float in)
      {
         float out;
         if(in > max) 
         { 
            out = max; 
         } else if(in < min) 
         { 
            out = min; 
         } else { 
            out = in; 
         }
         return out;
      }
      float saturation(float in)
      {
         float out = in;
         if(in > max) 
         { 
            out = max; 
         } else if(in < min) 
         { 
            out = min; 
         }
         return out;
      }
      float saturation(float in)
      {
         float out = in;
         if(in > max) 
         { 
            out = max; 
         } 
         if(in < min) 
         { 
            out = min; 
         }
         return out;
      }
  • 死区操作——当 min 和 max 为常量、启用 -O3 选项,且 C 代码采用如下代码块所示的三元运算符或 if..else 语句编写时,编译器会生成最高效的代码。
    float deadzone(float in)
    {
       float out; 
       out = (in>1.0f)?(in-1.0f):((in>-1.0f)?0.0f:(in+1.0f));
       return out;
    }
    float deadzone(float in)
    {
        float out;
        if(in >1.0f)
        { 
            out = in-1.0f; 
        } else if(in >-1.0f){ 
            out =0.0f; 
        } else { 
            out = in+1.0f; 
        }
        return out;
    }