This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS570LC4357:最快的正弦/余弦代码函数

Guru**** 657930 points
Other Parts Discussed in Thread: TMS570LS3137, HALCOGEN, TMS570LC4357, TMS570LS20206, RM46L852
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1029067/tms570lc4357-fastest-sin-cos-code-functions

器件型号:TMS570LC4357
主题中讨论的其他器件:TMS570LS3137HALCOGENTMS570LS20206RM46L852

我正在努力提高电机控制应用的性能。 我已经根据我之前的"如何启用 FPU"主题启用了 VFPU,我将链接到"ti_math_Cortex_R4_bspf.lib"库,并调用"arm_sin_F32"函数,这个单个正弦计算需要149个周期--这是预期的行为吗?

我们有许多基于28377和28388的项目、正弦/余弦需要3or4个周期。 此外、我相信 我的 TMS570LS3137应用花费了~30个周期来执行一个正弦、所以我希望我链接到错误的库、调用错误的 FAST 函数、或者缺少一个已定义的常量。  

另请注意、此应用程序是使用 HalCoGen 构建的(我可以提供)、我在项目中定义了"CCS"和"FPU_Pres存在";需要编译 CCS、但 FPU_Present 在149周期时间内没有产生影响。  

谢谢、

Jim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jim、

    请检查 CMSIS 的 Docs 文件夹中的基准: C:\ti\hercules\Cortex-R4 CMSIS DSP 库\1.0.0\Docs

    Cortex-R4 DSP 软件 Benchmarks.pdf

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的快速回复。 该正弦数据中有2个数字:快速数学需要2747个周期、"控制器"函数正弦需要54个周期。 您知道我是在运行快速数学运算还是控制器正弦波吗?

    该数据适用于 TMS570LS20206、数据表指出、它是以160MHz 运行的1.66DMIPS/MHz。 TMS570LC4357与1.66的 DMIPS/MHz 相同、但我以300MHz 的频率运行 CPU、因此我的正弦时间不应约为  TMS570LS20206的1/2、因为我的 CPU 运行速度几乎是前者的两倍? 如果我能够弄清楚如何调用控制器正弦、我应该大约为27个周期(当前为149个)。

    谢谢、

    Jim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    抱歉,我在最后一封电子邮件中混用了时间和周期-- TMS570LS20206 使用控制器功能在54个周期内运行一个正弦。 我的当前时间是149个周期、但应该是54个周期? 如何验证我正在调用"控制器"正弦函数?

    谢谢、

    Jim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我找到了这份有关 Sitara 的 TI 应用手册、但它也使用 ARM R5F;它在34个周期内运行 sin、但它使用 R5F 库。 是否有针对此4357的 R5F 库更新可提高性能?

    谢谢

    Jim

     https://www.ti.com/lit/an/spracv1/spracv1.pdf?ts=1629415493134&ref_url=https%253A%252F%252Fwww.google.com%252F

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="2713" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1029067/tms570lc4357-fastest-sin-cos-code-functions/3804192 #3804192"]您知道我是如何确定我运行的是快速数学运算还是控制器正弦波?

    "控制器"函数为 arm_sin cos_F32、它为  θ 输入输出正弦和余弦输出(θ 以度为单位)。

    而 "快速数学"函数是 arm_sin_F32和 arm_Cos_F32、以弧度为单位获取输入。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="2713" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1029067/tms570lc4357-fastest-sin-cos-code-functions ]我们有许多基于28377和28388的工程、正弦/余弦需要3or4个周期。 [/报价]

    这些 C2000器   件具有三角函数加速器(TMU)、其中包含专用的 SINPUF32和 COSPUF32指令、记录为占用4p 个周期。

    而对于 Cortex-R5F 中的 VFPv3-D16、我看不到任何三角硬件指令、因此 必须在软件中仿真函数。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="2713" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1029067/tms570lc4357-fastest-sin-cos-code-functions/3804218 #3804218"]我当前的时间是149个周期,但应该是54?

    周期时间是指令和存储器访问时间的组合。 其中存储器访问时间取决于:

    a:等待状态的数量、对于闪存和 SRAM 可能会有所不同。

    b. 对于 TMS570LC4357 Cortex-R5F 器件、如果启用了指令缓存和数据缓存。

    用于基于 Cortex-R4F 的 TMS570LS20206的 Cortex-R4 DSP 软件 Benchmarks.pdf (即没有缓存)不描述测量的时序是与闪存或 SRAM 中被测代码一起进行的。

    我为以下函数创建了一些计时测试:

    • "空"测试、仅用于测量读取周期计数器的开销
    •  来自 TI 编译器运行时标准库的正弦和余弦
    •  CMSIS DSP 快速数学函数中的 ARM_SIN_F32和 ARM_COS_F32
    • CMSIS DSP 控制器函数中的 ARM_SIN_COS_F32

    相同的测试函数在以下位置运行:

    1. 基于 Cortex-R4F 的 RM46L852 (即无缓存)。  GCLK 和 HCLK 都设置为220MHz。
    2. 基于 Cortex-R5F 的 TMS570LC4357。 启用了指令和数据缓存。  GCLK (CPU 时钟)为300MHz。 HCLK (外设总线时钟)为150MHz。

    每组测试连续运行3次、对于使用高速缓存来查看必须将代码加载到高速缓存中是否有任何变化的情况、与后续测试相比、代码仍可以在高速缓存中。

    对于每个器件的工程、有两个编译配置:

    • debug_flash:所有代码都在闪存中
    • DEBUG_SRAM:正在定时的代码及其查找表被放置在 SRAM 中,由于在最高 HCLK 频率下 SRAM 的等待状态更少,因此 SRAM 访问速度比闪存快

      使用 Debug_FLASH 编译配置的 RM46L852测试的结果:

    Starting tests
    Cycle count overhead = 24
    sinf(1.234500)=0.943983, took 536 cycles
    cosf(1.234500)=0.329993, took 572 cycles
    arm_sin_f32(1.234500)=0.943983, took 118 cycles
    arm_cos_f32(1.234500)=0.329993, took 114 cycles
    arm_sin_cos_f32(70.731636)=0.943955,0.329983, took 100 cycles
    Cycle count overhead = 24
    sinf(1.234500)=0.943983, took 531 cycles
    cosf(1.234500)=0.329993, took 572 cycles
    arm_sin_f32(1.234500)=0.943983, took 118 cycles
    arm_cos_f32(1.234500)=0.329993, took 114 cycles
    arm_sin_cos_f32(70.731636)=0.943955,0.329983, took 100 cycles
    Cycle count overhead = 24
    sinf(1.234500)=0.943983, took 531 cycles
    cosf(1.234500)=0.329993, took 572 cycles
    arm_sin_f32(1.234500)=0.943983, took 118 cycles
    arm_cos_f32(1.234500)=0.329993, took 114 cycles
    arm_sin_cos_f32(70.731636)=0.943955,0.329983, took 100 cycles

      使用 Debug_SRAM 构建配置的 RM46L852测试的结果:

    Starting tests
    Cycle count overhead = 9
    sinf(1.234500)=0.943983, took 444 cycles
    cosf(1.234500)=0.329993, took 490 cycles
    arm_sin_f32(1.234500)=0.943983, took 85 cycles
    arm_cos_f32(1.234500)=0.329993, took 85 cycles
    arm_sin_cos_f32(70.731636)=0.943955,0.329983, took 54 cycles
    Cycle count overhead = 9
    sinf(1.234500)=0.943983, took 437 cycles
    cosf(1.234500)=0.329993, took 490 cycles
    arm_sin_f32(1.234500)=0.943983, took 85 cycles
    arm_cos_f32(1.234500)=0.329993, took 85 cycles
    arm_sin_cos_f32(70.731636)=0.943955,0.329983, took 54 cycles
    Cycle count overhead = 9
    sinf(1.234500)=0.943983, took 437 cycles
    cosf(1.234500)=0.329993, took 490 cycles
    arm_sin_f32(1.234500)=0.943983, took 85 cycles
    arm_cos_f32(1.234500)=0.329993, took 85 cycles
    arm_sin_cos_f32(70.731636)=0.943955,0.329983, took 54 cycles

    采用 Debug_FLASH 配置的 TMS570LC4357的结果:

    Starting tests
    Cycle count overhead = 9
    sinf(1.234500)=0.943983, took 687 cycles
    cosf(1.234500)=0.329993, took 777 cycles
    arm_sin_f32(1.234500)=0.943983, took 256 cycles
    arm_cos_f32(1.234500)=0.329993, took 181 cycles
    arm_sin_cos_f32(70.731636)=0.943955,0.329983, took 176 cycles
    Cycle count overhead = 9
    sinf(1.234500)=0.943983, took 465 cycles
    cosf(1.234500)=0.329993, took 514 cycles
    arm_sin_f32(1.234500)=0.943983, took 80 cycles
    arm_cos_f32(1.234500)=0.329993, took 80 cycles
    arm_sin_cos_f32(70.731636)=0.943955,0.329983, took 50 cycles
    Cycle count overhead = 9
    sinf(1.234500)=0.943983, took 445 cycles
    cosf(1.234500)=0.329993, took 493 cycles
    arm_sin_f32(1.234500)=0.943983, took 80 cycles
    arm_cos_f32(1.234500)=0.329993, took 80 cycles
    arm_sin_cos_f32(70.731636)=0.943955,0.329983, took 50 cycles

    采用 Debug_SRAM 配置的 TMS570LC4357的结果:

    Starting tests
    Cycle count overhead = 9
    sinf(1.234500)=0.943983, took 561 cycles
    cosf(1.234500)=0.329993, took 606 cycles
    arm_sin_f32(1.234500)=0.943983, took 176 cycles
    arm_cos_f32(1.234500)=0.329993, took 170 cycles
    arm_sin_cos_f32(70.731636)=0.943955,0.329983, took 100 cycles
    Cycle count overhead = 9
    sinf(1.234500)=0.943983, took 450 cycles
    cosf(1.234500)=0.329993, took 507 cycles
    arm_sin_f32(1.234500)=0.943983, took 79 cycles
    arm_cos_f32(1.234500)=0.329993, took 80 cycles
    arm_sin_cos_f32(70.731636)=0.943955,0.329983, took 57 cycles
    Cycle count overhead = 9
    sinf(1.234500)=0.943983, took 441 cycles
    cosf(1.234500)=0.329993, took 495 cycles
    arm_sin_f32(1.234500)=0.943983, took 79 cycles
    arm_cos_f32(1.234500)=0.329993, took 80 cycles
    arm_sin_cos_f32(70.731636)=0.943955,0.329983, took 50 cycles

    下表列出 了针对不同组合的 ARM_SIN_COS_F32 ()控制器函数的"已校正"周期数。 其中、"校正"意味着从 arm_sin_Cos_F32 ()结果中减去"周期计数"开销:

    器件 构建配置 结果
    RM46L852 调试闪存 所有3次测试迭代花费76个周期
    TMS570LC4357 调试闪存 第一个测试迭代(必须在缓存中加载代码时)花费167个周期。 后续测试迭代(代码可能已经在缓存中)花费41个周期。
    RM46L852 Debug_SRAM 所有3次测试迭代花费45个周期
    TMS570LC4357 Debug_SRAM 第一次测试迭代花费91个周期。 后续测试迭代花费了48或41个周期。

    这表明 、对于 TMS570LC4357、当必须将代码/数据加载到高速缓存中时、需要花费更多的周期、对于 没有高速缓存的 RM46L852而言、需要更多的周期。

    因此、 TMS570LC4357的任何时序测量 都需要考虑是否缓存了代码/数据。

    所使用的工程已附加、它们使用 CCS 10.4、 HALCoGen 04.07.01和 TI ARM 编译器 v20.2.5

    e2e.ti.com/.../RM46L852_5F00_sin_5F00_cos.zip

    e2e.ti.com/.../TMS570LC4357_5F00_sin_5F00_cos.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢切斯特;这应该会有所帮助;让我尝试让我的代码显示这种速度。

    Jim