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参考资料

死区示例

在实时应用中,死区代码经常发生。

下面的代码块显示了基于三元运算符 '?' 实现死区代码的方法。C29 的性能(需要 10 个周期且不依赖输入)优于 C28(需要 25-36 个周期,且依赖输入),也优于 Cortex-M7(需要 23-35 个周期,且依赖输入)。这种高效性得益于延迟返回指令 (RETD) 和延迟时隙中高效使用的比较 (CMPF) 指令和赋值 (SELECT) 指令。

float deadzone(float in)
{
 float out; 
 float  out_pos = in - 1.0f;
 float  out_neg = in + 1.0f; 
 out = (in > 1.0f)?  out_pos : ((in > -1.0f)? 0.0f : out_neg); 
 return out; 
}
C29 Implementation
Function call:
CALL @deadzone 
|| LD.32 M0,@in1  
;---------CALLD occurs  
ST.32 @out1,M0  
 deadzone:
ONEF M1   
|| NEGONEF M2  
SADDF M3,M0,M2   
|| CMPF TDM0,M.GT,M0,M2  
|| SADDF M2,M0,M1  
|| RETD  
ZERO M4  
CMPF TDM1,M.GT,M0,M1  
|| SELECT TDM0,M0,M4,M2  
SELECT TDM1,M0,M3,M0  

C28 Implementation
Function call: MOVW  DP,#_in1 
MOV32 R0H,@_in1  
LCR   #_deadzone
MOVW  DP,#_out1   
MOV32 @_out1,R0H

_deadzone:
ADDB   SP,#2     
CMPF32 R0H,#16256
MOVST0 ZF, NF  
B      $C$L1,LEQ  
ADDF32 R0H,R0H,#49024  
B      $C$L3,UNC   
$C$L1:
CMPF32 R0H,#49024  
MOVST0 ZF, NF   
B      $C$L2,LEQ  
ZERO   R0H  
B      $C$L3,UNC   
$C$L2:
ADDF32 R0H,R0H,#16256   
$C$L3:
SUBB   SP,#2  
LRETR   

M7 Implementation
Function call:
VLDR  S0,[R6, #+144] 
BL    deadzone   
VSTR  S0,[R6, #+152] 
  
deadzone:
MOVS     R0,#+1   
MOVT     R0,#+16256   
VMOV     S2,R0   
VMOV.F32 S1,S0  
VCMP.F32 S1,S2  
FMSTAT  
VMOV.F32 S0,#1.0  
VADD.F32 S0,S1,S0  
BLT.N    deadzone_0   
VMOV.F32 S3,#-1.0  
VADD.F32 S0,S1,S3  
BX       LR   
deadzone_0:
MVN      R1,#+1082130432  
VMOV     S4,R1   
VCMP.F32 S1,S4  
FMSTAT  
ITT     GE   
MOVGE   R0,#+0   
VMOVGE  S0,R0   
BX      LR