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.

[参考译文] 编译器/LAUNCHXL-F28069M:从 UINT16转换为浮点时出现问题

Guru**** 2580295 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/646944/compiler-launchxl-f28069m-problem-with-conversion-from-uint16-to-float

器件型号:LAUNCHXL-F28069M

工具/软件:TI C/C++编译器

(二

uint16 conv[6];
PHASE_1_GAIN=3.3f;
PHASE_2_GAIN=3.3f;
PHASE_3_GAIN=3.3f;


while (1)

AdcConversion_run (conv);
Phase1_CURRENT=((((float)(conv[0]-conv[3]))/4096.0f)* PHASE_1_GAIN;  
Phase3_current=(((float)(conv[1]-conv[4]))/4096.0f)*PHASE_3_GAIN;  
Phase2_current=(((float)(conv[2]-conv[5]))/4096.0f)*PHASE_2_GAIN;  

(小部分 +

上面的代码具有 conv={1500、1500、1500、0、0、0}调试功能 (在变量或表达式中)、给出了 phase1_Current=0.0、Phase2_Current=0.0和 Phase3_Current=0.0

似乎(float)(conv[0]-conv[3])等于0.0并且必须为(float)(1500-0)/4096.0f*3.3f

请查阅包含的库。 调试中是否有缺失或错误?

 

 

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

    尊敬的所有人

       您是否需要样片项目进行验证?

    请告诉我、我将在私人消息中提供一个链接

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我有线索。 也许不能从 uint16中减去 uint16、因为不能取负值(????????)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    UINT16中的结果不能为负、计算结果可以为负
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们需要一个我们可以构建的测试用例。  它不必运行。  我确信、检查编译器生成的汇编代码将足以确定发生的情况。  对于包含此代码的函数...

    [引用 user4957458]while (1)

    AdcConversion_run (conv);
    Phase1_CURRENT=((((float)(conv[0]-conv[3]))/4096.0f)* PHASE_1_GAIN;  
    Phase3_current=(((float)(conv[1]-conv[4]))/4096.0f)*PHASE_3_GAIN;  
    Phase2_current=(((float)(conv[2]-conv[5]))/4096.0f)*PHASE_2_GAIN;  
    }[/报价]

    (笑声) 请按照文章 How to Submit a Compiler Test Case 中的说明进行操作

    谢谢、此致、

    乔治

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

    我无法使用您提供的选项重现 C2000 16.9.6.LTS 的问题;据我所知、代码是正确的。  我附上了一个截止测试案例、演示了编译器的工作方式是否正确。  您说您已观察到"(float)(conv[0]-conv[3])等于0.0"。  您如何做到这一点?  您是否使用 printf 语句或 CCS 监视窗口?

    /*
    -v28
    -ml
    -mt
    --cla_support=cla0
    --float_support=fpu32
    --tmu_support=tmu0
    --vcu_support=vcu0
    -off
    --opt_for_speed=5
    --fp_mode=relaxed
    --advice:performance=all
    -g
    --c99
    ---wrap_warning=225 -display_error=225
    
    
    
    
    
    #include 
    
    float PHASE_1_GAIN=3.3f;
    float PHASE_2_GAIN=3.3f;
    float PHASE_3_GAIN=3.3f;
    
    void try_signed ()
    {
    int16_t conv[6]={1500、1500、1500、0、0、 0};
    
    float phase1_current=(((float)(conv[0]-conv[3]))/4096.0f)*PHASE_1_GAIN;
    float Phase3_current=(((float)(conv[1]-conv[4]))/4096.0f)*PHASE_3_GAIN;
    float Phase2_current=(((float)(conv[2]-conv[5]))/4096.0f)*PHASE_2_GAIN;
    
    printf ("p1c:%f\n"、phase1_current);
    printf ("p2c:%f\n"、Phase2_current);
    printf ("P3C:%f\n"、Phase3_current);
    }
    
    void try unsigned ()
    {
    uint16_t conv[6]={1500、1500、1500、0、0、 0};
    
    float phase1_current=(((float)(conv[0]-conv[3]))/4096.0f)*PHASE_1_GAIN;
    float Phase3_current=(((float)(conv[1]-conv[4]))/4096.0f)*PHASE_3_GAIN;
    float Phase2_current=(((float)(conv[2]-conv[5]))/4096.0f)*PHASE_2_GAIN;
    
    printf ("p1c:%f\n"、phase1_current);
    printf ("p2c:%f\n"、Phase2_current);
    printf ("P3C:%f\n"、Phase3_current);
    }
    
    void main ()
    {
    try_signed ();
    try_unsigned();
    }
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、变量在调试模式下出现在"Expressions"中。 如何在不显示的情况下执行"printf"? 它是否也处于调试模式?

    谢谢

    Luis Gonçalves ó n
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您在 CCS 下调试系统、并且可以在器件上设置断点、并且有一些堆可用、那么您应该能够在器件上使用停止模式 printf 支持。 请访问 processors.wiki.ti.com/.../Tips_for_using_printf

    至于表达式窗口、调试信息可能已损坏、并导致 CCS 显示变量内容的错误值。 如果您愿意、我们可以进行探索。 在其中一条语句之后的 while 循环中设置断点、并查看表达式&phase1_current 的值。 这将是存储器中的地址。 打开存储器浏览器窗口、找到该地址并告诉我存储器中的接下来的32位。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果"conv[0]-conv[3]"为负"phase1_curry=-inf"、则更多。 如果为正、则"phase1_curry=0"。

    到了一段时间、CCS 不允许我创建断点。 您可以使用我提供的项目进行确认

    "如果你愿意,我们可以探索这个",--- 请,一定要来!!!! 请与我发送的项目一起使用。

    从浮点型转换为整数型的过程中、我也遇到了一些问题、我使用编译器的 FPU 内在函数指令解决了这些问题。 我确认它可以使用板上闪烁的 LED。 它也在调试模式下运行、但程序将自由运行。 但该代码未包含在所提供的项目中
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在模式下、Release 起作用。 我用“if…… 然后"

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

    您是否已解决问题?
    如果不是、您能否陈述您当前的问题或疑问?

    此致
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    目前、版本似乎可以正常工作。 稍后、我添加了更多堆和堆栈。 似乎我现在可以执行断点、这可能是由于堆/堆栈更多。 我还没有对"printf"进行实验。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很好!
    我将关闭此帖子、如果您遇到另一个问题、请启动新帖子。

    此致
    Chris