ZHCAEQ3 November   2024 F29H850TU , F29H859TU-Q1

 

  1.   1
  2.   摘要
  3.   商标
  4. 1实时控制简介
  5. 2C29 CPU 及其主要特性
    1. 2.1 并行架构和编译器优化
  6. 3C29 性能基准测试
    1. 3.1 使用 ACI 电机控制的信号链基准测试
    2. 3.2 实时控制和 DSP 性能
      1. 3.2.1 影响结果的示例和因素
        1. 3.2.1.1 饱和(或限制)示例
        2. 3.2.1.2 死区示例
        3. 3.2.1.3 空间矢量生成 (SVGEN) 示例
        4. 3.2.1.4 软件流水线
      2. 3.2.2 客户控制和数学运算基准测试
    3. 3.3 通用处理 (GPP) 性能
      1. 3.3.1 影响结果的示例和因素
        1. 3.3.1.1 不连续性管理
        2. 3.3.1.2 Switch() 示例
    4. 3.4 基于模型的设计基准测试
    5. 3.5 应用基准测试
      1. 3.5.1 单相 7kW OBC 说明
      2. 3.5.2 基于 Vienna 整流器的三相功率因数校正
      3. 3.5.3 单相位逆变器
      4. 3.5.4 机器学习
    6. 3.6 闪存存储器效率
    7. 3.7 代码尺寸效率
  7. 4总结
  8. 5参考资料

饱和(或限制)示例

在实时应用中,饱和类型代码十分常见。以下展示了在 C 语言中通过两种不同方式实现饱和的总结。

下面的代码块显示了基于 if..else 实现饱和的方法。C29 需要 11 个周期且不依赖输入,性能优于 Cortex-M7(需要 14-27 个周期,且依赖输入)。在 C29 上,if () 是通过条件分支指令 (BC) 实现的,而对于剩余的两条路径(elseif 和 else),则依次使用了比较指令 (CMPF) 和条件指令 (XCP),从而避免了分支。

volatile float in;
volatile float out; 
const float max =1.0f;
const float min = -1.0f; 
if(in > max) 
 out = max; 
else if(in < min) 
 out = min; 
else 
 out = in; 

C29 Implementation
LD.32  M1,@in 
||ONEF M0   
CMPF   TDM0,M.GT,M1,M0  
ONEF   M1   
|| BC   @($LBB0_2),TDM0.NZ   
LD.32  M1,@in   
|| NEGONEF M2   
CMPF   TDM0,M.LT,M1,M2  
XCP    #0x1,TDM0.Z   
|| LD.32 M1,@in  
SELECT TDM0,M1,M2,M1  
$LBB0_2:
ST.32 @out,M1  

M7 Implementation
MOVW R0,#in2
MOVT R0,#in2   
MOVS R1,#+1   
MOVT R1,#+16256   
VLDR S0,[R0, #0]   
VMOV S1,R1   
VCMP.F32 S0,S1   
FMSTAT  
BLT.N saturation_0  
MOV R2,#+1065353216  
STR R2,[R0, #+4]   
B   saturation_2
saturation_0:   
VMOV.F32 S0,#-1.0   
VLDR  S1,[R0, #0]   
VCMP.F32 S1,S0   
FMSTAT  
BPL.N saturation1_1  
VSTR S0,[R0, #+4]   
B  saturation_2   
saturation_1:
LDR R1,[R0, #+0]   
STR R1,[R0, #+4]   
saturation_2:

下面的代码块显示了基于三元运算符 '?' 实现饱和的方法。C29 通过 MINMAXF 指令实现,且无需分支,需要 3 个周期且不依赖输入,性能优于 Cortex-M7(需要 18-22 个周期,且依赖输入)。

volatile float in;
volatile float out; 
const float max =1.0f;
const float min = -1.0f;

float temp = in; 
temp = (temp > max)? max: ((temp < min)? min: temp); 
out = temp; 

C29 Implementation
ONEF    M0  || LD.32 M1,@in  || NEGONEF M2 MINMAXF M1,M0,M2 ST.32   @out,M1  

M7 Implementation
MOVW R0,#in2
MOVS R1,#+1   
MOVT R0,#in2   
MOVT R1,#+16256   
VMOV S2,R1   
VLDR S0,[R0, #0]   
VCMP.F32 S0,S2   
VMOV.F32 S1,S0   
FMSTAT  
IT  GE   
VMOVGE.F32 S1,#1.0   
BGE.N saturation_0  
VMOV.F32  S2,#-1.0   
VCMP.F32  S0,S2   
FMSTAT  
IT  MI   
VMOVMI.F32 S1,S2   
saturation_0:
VSTR  S1,[R0, #+8]   
注意:

C29 编译器经过优化,能够在 if..else 或三元运算符实现方式之间,生成相同性能的代码。

|| 表示与上述指令并行执行的指令。