ZHCAE84 July   2024

 

  1.   1
  2.   摘要
  3.   商标
  4. 1引言
    1. 1.1 入门
  5. 2eCompressor 基于模型的设计
    1. 2.1 通用米6体育平台手机版_好二三四 (TI) 高压评估模块 (TI HV EVM) 用户安全指南
    2. 2.2 方框图
    3. 2.3 硬件、软件和测试要求
      1. 2.3.1 硬件设置
      2. 2.3.2 软件设置
      3. 2.3.3 测试过程
  6. 3 Simulink 配置设置
    1. 3.1 Simulink 工具优化
      1. 3.1.1 最佳代码生成
    2. 3.2 C2000 专用优化
      1. 3.2.1 通过 Simulink 使用 TMU
      2. 3.2.2 通过 Simulink 使用软件库
      3. 3.2.3 从 RAM 运行代码
    3. 3.3 性能比较
  7. 4 使用 Simulink 进行性能分析
    1. 4.1 处理器在环 (PIL) 方法
    2. 4.2 基于 C2000 计时器的性能分析
    3. 4.3 Code Composer Studio 工具
  8. 5总结

基于 C2000 计时器的性能分析

除了 Simulink 提供的处理器在环仿真性能分析外,C2000 计时器外设也可用于获取执行时间数据。计时器代码需要与现有模型集成以进行性能分析,因此该方法属于侵入式性能分析方法。通过单独测量计时器执行时间,可以消除基于计时器的方法所产生的开销。在运行应用程序的代码时,可以移除计时器代码,以节省额外的计时器配置和运行周期。下面讨论了使用 C2000 计时器外设来对某个部分或完整应用代码进行性能分析的步骤。当前示例使用计时器 2 作为性能分析工具,但如果应用程序已经在使用该计时器,则建议选择未使用的计时器。

在模型的顶层,在 Simulink Coder >“Custom Code”下,添加 Simulink 库中可用的系统初始化 块。此块包含计时器初始化代码。

TIDM-02012 计时器初始化代码图 4-4 计时器初始化代码
// Initialize C2000 Timer 2
InitCpuTimers();
CpuTimer2Regs.PRD.all = 0xFFFFFFFF; /* Max Period */
CpuTimer2Regs.TIM.all = 0xFFFFFFFF; /* Counter Configuration */
CpuTimer2Regs.TPR.all = 0x00; /* No clock prescalar configured */
StartCpuTimer2();

数据存储内存 块与要进行性能分析的块所对应的系统初始化块一起添加到顶层。如图 4-5 所示,对数据存储内存 块进行适当的命名。从 APPS 菜单中打开 Embedded Coder 应用程序。选择“Code Mappings”>“Component Interface”,并导航到 Data Stores 选项卡。将使用数据存储内存 块创建的变量存储类更改为 ExportedGlobal

TIDM-02012 变量存储类图 4-5 变量存储类

现在,在要进行性能分析的子系统内,从 Simulink 库添加一个系统输出 块。如果它是一个独立的块(例如 Park 变换块),那么该块可以成为一个子系统,之后可以添加系统输出块。在系统输出 块中,在函数声明代码段中添加读取计时器值代码并将其存储在一个临时变量中,然后在函数退出代码段中再次读取计时器值。在退出代码段中计算差值,并将该值存储在之前定义的全局变量中,如代码块中所示。

TIDM-02012 系统输出计时器代码图 4-6 系统输出计时器代码

要对块性能分析,在创建子系统后,右键点击它并导航至“Block Parameters (subsystem)”。选中“Treat as Atomic Unit”复选框。使用 CCS 构建模型并在器件中加载生成的 .out 文件。在 CCS 的表达式窗口中添加新增的全局变量,以观察和运行代码。打开主机控制模型,选择适当的 COM 端口并设置所需的速度。使用拨动开关启动电机来运行电机。这会向器件发送使能 PWM 信号来运行算法,之后观察窗口中的变量将更新为周期计数。使用表达式窗口中的 Continuous refresh 选项,观察变量的变化。

/* Code block for System Output Function Declaration Code */
uint32_T timerCount1 = CpuTimer2Regs.TIM.all;
asm(" NOP");    

/* Code block for System Output Function Exit Code */
asm(" NOP");                                                   
profilePark=  timerCount1 - CpuTimer2Regs.TIM.all;

要消除计时器测量开销,可以使用下面块中所述的代码在任何块中添加单独的代码块。计时器开销的计算方法是连续读取计时器,两次读取的差值就是开销。执行代码块时,可以量化开销,并从为其他块计算的性能分析数据中减去。需要注意的是,与之前为每个块定义的全局变量相似,也必须添加与计时器开销相对应的变量。

/* Code block for calculation of timer overhead */
uint32_T overheadCount = CpuTimer2Regs.TIM.all;
asm(" NOP");    

/* Code block for System Output Function Exit Code */
asm(" NOP");                                                   
profileOverhead=  overheadCount - CpuTimer2Regs.TIM.all;    

除了基于 C2000 计时器的性能分析外,如果有示波器,也可以使用基于 GPIO 的性能分析方法。需要注意的是,基于 GPIO 的性能分析需要使用外部示波器来查看波形并测量时序。可以在例程(即需要进行性能分析的例程)的开始和结束时切换 GPIO,而不是进行本节中讨论的计时器读取。在基于 GPIO 的性能分析方法中,开销仅限于写入 GPIO 寄存器所用的时间。