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.

[参考译文] TMS320F2.8075万:FPU/TMU:快速IQN分数到浮子聚合

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/580058/tms320f28075-fpu-tmu-fast-iqn-fraction-to-float-converion

部件号:TMS320F2.8075万
主题:controlSUITE中讨论的其他部件

您好,

我正在寻找一种快速的方法,将IQ样式长整型数的分数转换为浮点,用于后续的__cospuf32() TMU内部调用。

我怀疑F2.8075万中有多少IQ数学支持(没有ROM表,对吗?)。 我尝试了以下操作:

#include "IQmathLib.h"
#include <mathing.h>


typedef float  float32_t;

float32_t  x,y,z;
int32_t    lq16val = 0x0003c000;/* 3.75 */
Int32_t    t0,T1,T2,T3;

float32_t  (*lq2f)(Int32_t)=_IQ16toF;/*如果Q更改*/,使用指向右侧IQxxtoF函数的函数指针

#define LQ16_mask_fraction (1L <<16)- 1)

无效
TEST_TMU()

   T0 = CpuTimer0Regs.TIM.all;
   x = ldexp ((float32_t)(lq16val和LQ16_mask_fraction),-16);
   T1 = CpuTimer0Regs.TIM.all;
   Y =_IQ16toF (lq16val和LQ16_mask_fraction);
   T2 = CpuTimer0Regs.TIM.all;
   z =(* lq2f)(lq16val和LQ16_mask_fraction);
   T3 = CpuTimer0Regs.TIM.all;

   t0 = t0 - t1;// 70个周期
   T1 = T1 - T2;// 32个周期
   T2 = T2 - T3;// 37个周期

   x =__sipuf32 (z);//等
}

我使用C:\ti\controlSUITE\libs\maturity\IQmatht\V160\lib\IQmatht_fpu32.lib链接,我在生成时收到警告:

警告#1.6002万-D:“J:\workspace\firmware\c2000\libc2000\lib\IQmatch_fpu32.lib<IQ16toF.obj>”2000”中缺少Build属性供应商部分TI:无法确定兼容性
警告#1.0247万-D:创建不带书帖规范的输出书帖"IQmath "

计算的结果正确(x == y == z = 0.75)。

我的问题是:

2.8075万上的IQ数学如何?

是否有更好的想法来完成工作(更快!)? 我搜索了表7-[6-8]。 SPRU514L TMS320C28x优化C/C++编译器指南中的TMS320C28x C/C++编译器内部函数,但未找到任何合适的内容。

谢谢!

弗兰克


  

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

    您好,Frank,

    fmdhr 说:
    2.8075万上的IQ数学原理是什么?[/QUOT]

    IQMath表已从ROM中取出,因此您必须将其加载到此设备上的闪存中,但除此之外,IQMath可用于此设备

    是否有更好的方法(更快!)? 我搜索了表7-[6-8]。 SPRU514L TMS320C28x优化C/C++编译器指南中的TMS320C28x C/C++编译器内部函数,但未找到任何合适的内容。[/QUOT]

    你可以试试这个

    ((float)(lq16val和LQ16_mask_fraction))*(1.0 /(1UL<16))

    它应屏蔽分数部分,转换为浮点,然后乘以2^-16。 编译器应预计算值2^-16,这样就不会浪费它的运行时周期。

    或者,您也可以尝试此操作

    ((float)(((UINT32_t) lq16val << 16)>16)*(1.0 /(1UL<16))

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

    感谢您的快速回复。 有时很难找到简单的方法。 以下是我的测量值,并附有您的建议,包括固定值和可变Q值。 我已将代码放入单独的函数中,以防止出现大量的编译器优化(-O2),这些优化混合了多个语句的操作。

    此致,
    弗兰克

    #define LQ16_mask_fraction (1L <<16)- 1)
    #define LQ12_mask_fraction (1L << 12)- 1)

    Volatile Int32_t mask16 = LQ16_mask_fraction,mask12 = LQ12_mask_fraction;
    挥发性Int16_t shft16 = 16,shft12 = 12;
    挥发性浮点32_t标量16 = 1.0 /(1UL <<16);
    挥发性浮点32_t标量12 = 1.0 /(1UL << 12);

    //使用CPU周期(CPU计时器周期)
    #if fix_q
    void f1(){ x = ldexp((Float32_t)(lq16val & LQ16_mask_fraction ),-16);}// 80
    void f2(){ y =_IQ16toF(lq16val & LQ16_mask_fraction);}// 43
    void f3(){ z =(*lq2f)(lq16val & LQ16_mask_fraction;}// 44.
    void F4(){ x =((FLOW)(lq16val & LQ16_mask_frer))*(1.0 /(1UL<16));}// 27.
    void F5(){ y =(FLOW)(((UINT32_t)lq16val <<16)>>16)*(1.0 /(1UL<16));}// 26.
    void f6(){ x =((FLOW)(lq12val & LQ12_mask_frer))*(1.0 /(1UL<12));}// 28.
    void F7(){ y =(FLOW)(((UINT32_t)lq12val <<12)>>12)*(1.0 /(1UL<12));}/26.
    #否则
    void f1(){ x = ldexp((Float32_t)(lq16val & mask16),-16);}//81
    void f2(){ y =_IQ16toF(lq16val & mask16);}//42
    void f3(){ z =(*lq2f)(lq16val & mask16);}//44
    void F4(){ x =((Float)(lq16val & mask16))*标量16;}// 26.
    void F5(){ y =(FLOW)(((UINT32_t)lq16val << shft16)>> shft16)* scale16;}// 29.
    void f6(){ x =((Float)(lq12val & mask12))*标量12;}// 26.
    void F7(){ y =(FLOW)(((UINT32_t)lq12val << shft12)>> shft12)*标量12;}// 29.
    #endif
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为如果您将这些函数内联,您可以从每个周期中减少8个周期(调用LCR和RETR返回)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Vishal,

    当然,代码将在最终版本中内联(或内联)。 我将代码放在几个函数中,只是为了获得不同版本的可靠和可比测量值。 优化器似乎使用了FPU管道中的延迟时段,因此产生了奇怪的结果。

    再次感谢,

    弗兰克