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.

[参考译文] TMS320F28035:IQMath Sinus/Cosinus 运行时间是文档所述时间的两倍

Guru**** 2538950 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/681517/tms320f28035-iqmath-sinus-cosinus-run-time-twice-as-long-as-documented

器件型号:TMS320F28035
Thread 中讨论的其他器件:controlSUITEC2000WARE

你(们)好

我想使用 F28035上的 IQMath 库计算正弦和余弦值。

但是、如果我测量计算的运行时间、则需要两倍于文档中所述的时间。

//优化4,速度/大小4:365个周期(RAM 不足)
_iq29 iq29PosRad =_IQ29mpyI32 (IQ29_INC_TO_RAD、u16Pos); // 4.
_iq29 iq29Sin =_IQ29sin (iq29PosRad); //46.
_iq29 iq29Cos =_IQ29cos (IQ29PosRad); //44.
_iq29 iq29Sinus =_IQ29mpy (iq29Sin、_IQ29 (fAmpl)); // 6.
_iq29 iq29Cosinus =_IQ29mpy (iq29Cos、_IQ29 (fAmpl)); // 6.
_iq29 iq29PwmA =_IQ29mpyI32int (iq29Sinus +_IQ29 (1)、PWM_PERIODE/2);// 22.
_iq29 iq29PwmB =_IQ29mpyI32int (iq29Cosinus +_IQ29 (1)、PWM_PERIODE/2);// 22 => Summe 150个周期
Set_PWM (iq29PwmA、iq29PwmB); 

我使用计时器和 GPIO 测量了运行时间。

GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;

u32Start = CpuTimer0.RegsAddr->TIM.all;

CAL_SINCOS (fAmplTest、u16PosTest);

u32Laufzeit = u32Start - CpuTimer0.RegsAddr->TIM.all;

if (u32MaxLaufzeit < u32Laufzeit)
u32MaxLaufzeit = u32Laufzeit;

GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1; 

代码在 PWM ISR 内部运行。 此 ISR 被复制到 RAM 中执行。

此致

Rene

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

    Rene、

    最可能的解释是 IQmath 例程正在闪存中运行。   您应该能够通过查看项目的.map 文件来轻松验证这些函数的位置。 如果您向右滚动到该文件的底部、您应该会看到分配给 ROM 中地址的正弦和余弦函数符号。 如果它们不在那里、请在较高的位置查找它们并确定它们的物理位置所在的存储器类型。  您可以对照 F28035数据表第50页上的存储器映射来检查地址。

    您能否尝试一下、让我知道您找到的内容?

    如果它们位于闪存地址中、则有两种选择。  您可以将 IQ 函数加载到链接器命令文件中的 RAM 中、或使用 ROM 中的内置 IQ 函数。  

    F28035在内部 ROM 中具有零等待状态的正弦和余弦例程。 您可以通过将引导 Rom 符号库中的链接到您的项目来使用这些代码。 有关如何执行此操作的更多信息、请参阅 IQmath 用户指南文档的第17-18页。  遗憾的是、当我查看 C2000Ware 和 controlSUITE 中的 ROM 文件时、我不会看到 IQmath 符号文件所在的位置、因此我需要询问同事这方面的情况。  当我有更多信息时、我将跟踪此帖子。  

    此致、

    Richard

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

    Rene、

    请找到 IQmath 文档中所述的.lib 文件、您应该能够将其链接到您的项目中。  它应该位于 C2000Ware 下载中。  我们将把它添加到下一个版本中。

    希望这将解决您的问题。  请告诉我们您的工作方式。

    此致、

    Richard

    e2e.ti.com/.../2803x_5F00_IQmath_5F00_BootROMSymbols.zip

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

    感谢您的回答。

    我已经将该库链接到我的项目中。
    (从此处 C:\ti\c2000Ware_1_00_03_00\libraries\math\IQmath\c28\examples\bootrom_symbols)

    如果我看一下映射文件、我会发现:

    abs 003ff3f3 __IQ29cos
    0 003f6145 __IQ29mpyI32int
    abs 003ff32e __IQ29sin

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

    好的、好的。 我看到您还在使用 CPU 计时器来测量时间(u32Laufzeit)-注释中的365个节拍来自哪里? 该测量是否与示波器上的 I/O 引脚测量相符?

    我想知道器件时钟是否不正确。

    此致、

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

    是的。 该计时器测量365个周期(u32Laufzeit)、我在 GPIO34处使用示波器6.232us (376个周期@ 60MHz)进行测量。

    我使用闪存示例(example_28035_Flash)作为测试的起点、并且只启用 PWM 中断1

    (C:\ti\controlSUITE\device_support\f2803x\v130\DSP2803x_examples_ccsv5\flash_F28035)

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

    您能否将链接器命令文件中的 IQmath 分配粘贴到帖子中、以便我了解其链接方式?

    我看到上面代码的周期为176个、函数调用的计算方法与我预期的差不多。 另外、您能告诉我如何定义"fAmpl"吗?

    此致、

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

    映射文件中

     IQTABLES        003fe000 00000b50 00000000 00000b50 RWIX

     IQTABLES2       003feb50 0000008c 00000000 0000008c RWIX

     IQTABLES3       003febdc 000000aa 00000000 000000aa RWIX

    和链接器文件

    /*分配 IQ 数学区域:*/
    IQmath :> FLASHA PAGE = 0 /*数学代码*/
    IQmathTables :>IQTABLES,page = 0,type = NoLoad
    
    //如果调用 IQNexp()或 IQexp(),取消注释以下段
    库中的函数、以便利用
    引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
    1个等待状态)。 如果此部分未注释、则为 IQmathTables2
    将被加载到其他存储器(SARAM、闪存等)中并将采用
    上行空间、但0等待状态是可能的。
    //
    /*
    IQmathTables2:> IQTABLES2,page = 0,type = NoLoad
    {
    
    IQMath.lib (IQmathTablesRam)
    
    }
    */
    /*如果调用 IQNasin ()或 IQasin (),请取消注释以下部分
    库中的函数、以便利用
    引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
    1个等待状态)。 如果此部分未注释、则为 IQmathTables2
    将被加载到其他存储器(SARAM、闪存等)中并将采用
    上行空间、但0等待状态是可能的。
    *
    /*
    IQmathTables3:> IQTABLES3,PAGE = 0,TYPE = NOLOAD
    {
    
    IQMath.lib (IQmathTablesRam)
    
    }
    * 

    变量定义为中断例程之外的全局变量。

    它们在测试中保持不变、仍然为零。

    uint16_t u16PosTest = 0;
    fAmplTest = 0; 

    映射文件:

    00008c04    230 (00008c00)    _u16PosTest

    00008c0e    230 (00008c00)    _fAmplTest

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

    链接器命令文件

    e2e.ti.com/.../F28035.zip

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

    我看到的是包含浮点至 Iq 格式转换的行、是周期的发展方向。 IQ29 (fAmpl)例程在我的机器上花费136个周期、这是预期计数和实际计数之间的很大差异。 我认为优化器通过在两个相邻的代码行中重复使用此结果来提供帮助。 还有一些函数调用开销、在周期预算中未考虑这些函数。

    您能否仅测量此行的执行情况?
    _iq29 v =_IQ29 (fAmpl);

    此致、

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

    你(们)好 Richard

    您的是正确的_IQ29 (...) 需要很多时间。 我使用这行进行了测试、使用浮点和 uint16作为参数、而不使用这行。

    您可以看到、它需要158个周期。

    您是否有任何解决或避免这种情况的建议?

    //运行时常量
    //优化4,速度/大小4:207个周期(RAM 不足)
    _iq29 iq29PosRad =_IQ29mpyI32 (IQ29_INC_TO_RAD、u16Pos); // 4.
    _iq29 iq29Sin =_IQ29sin (iq29PosRad); //46.
    _iq29 iq29Cos =_IQ29cos (IQ29PosRad); //44.
    _iq29 x = 1073741824;
    _iq29 iq29Sinus =_IQ29mpy (iq29Sin、x); // 6.
    _iq29 iq29Cosinus =_IQ29mpy (iq29Cos、x); // 6.
    _iq29 iq29PwmA =_IQ29mpyI32int (iq29Sinus +_IQ29 (1)、PWM_PERIODE/2);// 22.
    _iq29 iq29PwmB =_IQ29mpyI32int (iq29Cosinus +_IQ29 (1)、PWM_PERIODE/2);// 22 => Summe 150个周期
    Set_PWM (iq29PwmA、iq29PwmB);
    
    //运行时使用浮点
    //优化4,速度/大小4:365个周期(RAM 不足)
    _iq29 iq29PosRad =_IQ29mpyI32 (IQ29_INC_TO_RAD、u16Pos); // 4.
    _iq29 iq29Sin =_IQ29sin (iq29PosRad); //46.
    _iq29 iq29Cos =_IQ29cos (IQ29PosRad); //44.
    _iq29 x =_IQ29 (fAmpl);
    _iq29 iq29Sinus =_IQ29mpy (iq29Sin、x); // 6.
    _iq29 iq29Cosinus =_IQ29mpy (iq29Cos、x); // 6.
    _iq29 iq29PwmA =_IQ29mpyI32int (iq29Sinus +_IQ29 (1)、PWM_PERIODE/2);// 22.
    _iq29 iq29PwmB =_IQ29mpyI32int (iq29Cosinus +_IQ29 (1)、PWM_PERIODE/2);// 22 => Summe 150个周期
    Set_PWM (iq29PwmA、iq29PwmB);
    
    //使用 uint16运行
    //优化4,速度/大小4:364个周期(RAM 不足)
    _iq29 iq29PosRad =_IQ29mpyI32 (IQ29_INC_TO_RAD、u16Pos); // 4.
    _iq29 iq29Sin =_IQ29sin (iq29PosRad); //46.
    _iq29 iq29Cos =_IQ29cos (IQ29PosRad); //44.
    _iq29 x =_IQ29 (u16Pos);
    _iq29 iq29Sinus =_IQ29mpy (iq29Sin、x); // 6.
    _iq29 iq29Cosinus =_IQ29mpy (iq29Cos、x); // 6.
    _iq29 iq29PwmA =_IQ29mpyI32int (iq29Sinus +_IQ29 (1)、PWM_PERIODE/2);// 22.
    _iq29 iq29PwmB =_IQ29mpyI32int (iq29Cosinus +_IQ29 (1)、PWM_PERIODE/2);// 22 => Summe 150个周期
    Set_PWM (iq29PwmA、iq29PwmB); 

    感谢你的帮助

    Rene

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

    能否将"fAmpl"定义为_iQ24? 这将避免执行类型转换、从而避免所有这些周期。

    或者、迁移到浮点器件是否可行? F28069在架构上非常相似、可带来 FPU32的优势。 该内核在指令集中内置了浮点型转换操作、因此可以在几个周期内转换数据。

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    修正:"fAmpl"可以定义为_IQ29吗?"。