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

不连续性管理

传统上,分支 (Branch)、调用 (Call) 和返回 (Return) 操作由于指令流水线的存在会导致开销。在流水线的 Decode-2 阶段,CPU 解析并确定需要执行分支、调用或返回操作。此时,流水线已经填充了后续指令,这些指令需要被清除,然后从不连续目标位置重新抓取指令。清除指令会产生开销。

C29 CPU 具有 9 级流水线,不连续性决策同样发生在 Decode-2 (D2) 阶段。因此,在流水线中,不连续性指令后续的三条指令(Fetch-1、Fetch-2 和 Decode-1 阶段)已经进入执行阶段。除了传统的分支、调用和返回指令外,C29 ISA 还支持延迟 分支、调用和返回指令(在指令后添加后缀 D,如 CALLD、RETD)。使用延迟指令时,无论不连续性是否发生(如条件分支),其后的三条指令始终会被执行。这三条指令称为延迟时隙。C29 编译器在使用延迟指令时,会将适当的指令插入延迟时隙中,从而将原本的三周期不连续开销降低为零周期。

以下两个示例说明了编译器这种结构的使用原理。

  • 函数调用:在三个延迟时隙中传递 6 个函数参数。
@CALLD  funcA         ; Call funcA
||LD.32 A4,@pointer1  ; Load A4 with pointer1 value from memory
LD.32   A5,@pointer2  ; Load A5 with pointer2 value from memory
||SUB.U16 A6,SP,#34   ; A6 points to value on stack offset -34
MV      A7,#ArrayB    ; Load A7 with address of ArrayB
||LD.32 D0,@variable1 ; Load D0 with Variable1 from memory
LD.32   D1,@variable2 ; Load D1 with Variable2 from memory
; Total Cycles = 4
  • 函数返回:在延迟时隙中恢复保存的寄存器并释放堆栈空间。
funcA: ADD.U16 SP,SP,#24      ; Allocate local stack space
       ST.64   *(SP-#24),XM2  ; Save XM2, XM4, XM6 registers on stack
       ST.64   *(SP-#16),XM4
       ST.64   *(SP-#8),XM6
       ... user code...
       RETD    *(SP-#32)     ; packet 1:Return and restore RPC from stack
       ||MV    M0,M3         ; Place return value in register M0
       LD.64   XM6,*(SP-#8)  ; packet 2:Restore XM6 from stack
       LD.64   XM4,*(SP-#16) ; packet 3:Restore XM4 from stack
       LD.64   XM2,*(SP-#24) ; packet 4:Restore XM2 from stack
       ||SUB.U16 SP,SP,#32   ; Deallocate local + return stack space
; Total Cycles = 4
注意:

以上示例是 C29 编译器如何使用延迟时隙的模型。实际上,延迟时隙不仅仅用于函数实参传递、寄存器恢复和堆栈释放,通常还包含用于实现用户代码的实际功能的指令。