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.

[参考译文] CCS/MSP430F5529:CCS 似乎可以#39;t 返回正确的值"float"

Guru**** 2555080 points
Other Parts Discussed in Thread: ADS1118, MSP430F5529, MSPMATHLIB

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/719514/ccs-msp430f5529-ccs-seems-can-t-return-a-correct-value-of-float

器件型号:MSP430F5529
主题中讨论的其他器件:ADS1118MSPMATHLIB

工具/软件:Code Composer Studio

我编写了一个函数、用于将 ADC 采样数据格式从"uint16_t"转换为"float"。我在"返回"之前发现该值正确、但当程序从该函数跳出时、它返回一个故障值。

当我使用此函数返回另一种数据类型时、它是正确的。 似乎只有"浮点"类型才有这个问题(尽管我没有尝试"双精度")、我不知道如何处理这种情况、因此我使用指针来传输参数…尽管这样我得到了正确的结果。

但我仍然想知道为什么我无法通过"返回"获得正确的结果。

有人可以帮助我吗?谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您需要与我们分享原型和函数调用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您如何确定"故障值?"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这对我来说在 MSP432P401R 中是可以正常工作的:

    /* DriverLib 包括*/
    #include 
    
    /*标准包括*/
    #include 
    #include 
    #include 
    
    float convert (uint16_t val);
    
    int main (void)
    {
    uint16_t test = 42;
    float var;
    
    var = convert (test);
    
    printf ("test =%d、var =%f\n"、test、var);
    fflush (stdout);
    
    
    while (1)
    {
    
    }
    
    
    }
    
    float convert (uint16_t val)
    {
    浮点数分辨率;
    
    RES = val * 1.0;
    
    返回 res;
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在开始时、我的函数如下所示:
    浮点 ADS1118_ADCExchangeRaw (无符号短整型数据)

    float out = 0;
    输出=(浮点) DATA*Vref;
    out /= 32768;
    退换货;

    并将其称为 ADC_Data = ADS1118_ADCExchangeRaw (RawData);
    (ADC_Data 是"浮点"类型、RawData 是"无符号短整型"类型)
    这条语句将 ADS1118样本数据"RawData"交换为电压数据"ADC_Data"。我发现输出数据"ADC_Data"不正确,并逐步查找错误,最后我在函数 ADS1118_ADCExchangeRaw ()中找到"out"数据,然后返回正确, 但是、当程序退出此函数时、" ADC_Data"与"Out"不同、因此我会获得故障电压数据。
    我的最新函数类似这样、使用指针输出我的交换数据、它是正确的:
    void ADS1118_ADCExchangeRaw (无符号短整型*数据、浮点型*输出)

    *out =(float)*data*vref;
    *输出/= 32768;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    再说一次、原型是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在开始时、我的函数如下所示:
    浮点 ADS1118_ADCExchangeRaw (无符号短整型数据)

    float out = 0;
    输出=(浮点) DATA*Vref;
    out /= 32768;
    退换货;

    并将其称为 ADC_Data = ADS1118_ADCExchangeRaw (RawData);
    (ADC_Data 是"浮点"类型、RawData 是"无符号短整型"类型)
    这条语句将 ADS1118样本数据"RawData"交换为电压数据"ADC_Data"。我发现输出数据"ADC_Data"不正确,并逐步查找错误,最后我在函数 ADS1118_ADCExchangeRaw ()中找到"out"数据,然后返回正确, 但是、当程序退出此函数时、" ADC_Data"与"Out"不同、因此我会获得故障电压数据。
    我看到"data"值、并计算为我的代码、与输出值相比获得所需值、我可以确保是否存在故障。
    我发现计算过程没有什么问题、但返回后、我得到了一个奇怪的不同值。
    我的最新函数类似这样、使用指针输出我的交换数据、它是正确的:
    void ADS1118_ADCExchangeRaw (无符号短整型*数据、浮点型*输出)

    *out =(float)*data*vref;
    *输出/= 32768;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不在 MSP432P401R 上尝试此操作、该故障在 MSP430F5529上发生。 我不知道这是否起作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我知道您的函数是什么样子的、返回浮点值应该可以。 您没有回答两个主要问题:

    您的原型是什么样子的?

    您如何确定您具有"故障电压数据"?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、"原型"是什么意思? 我的英语很差
    我说过、从该函数返回的浮点数据与返回前该函数中的浮点数据不同、因此这是不正确的。
    例如、我向该函数传递"0x7fff":
    ADC_Data = ADS1118_ADCExchangeRaw (0x7fff);
    在返回之前可以看到"OUT"值为2.4999 (Vref = 2.5)、但"ADC_Data"不是2.4999、它返回故障数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我使用指针时、该函数可以输出一个与此函数中计算的值完全相同的值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    computer.howstuffworks.com/c13.htm
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    器件型号:MSP430F5529

    工具/软件:Code Composer Studio

    我编写了一个函数、用于将 ADC 采样数据格式从"uint16_t"转换为"float"。我在"返回"之前发现该值正确、但当程序从该函数跳出时、它返回一个故障值。

    函数如下所示:

    浮点 ADS1118_ADCExchangeRaw(无符号短整型数据)

    float out = 0;
    输出=(浮点) DATA*Vref;
    out /= 32768;
    退换货;

    我以这种方式调用它:

    ADC_Data = ADS1118_ADCExchangeRaw(0x7fff);

    返回前、我可以看到该函数中的"OUT"数据为2.4999、但 ADC_Data 不是2.4999、这与该函数中计算出的值不同。

    当我使用"return"返回另一个数据类型时、它是正确的。 似乎只有"float"类型存在此问题(尽管我没有尝试"double")、这似乎 CCS 不会返回正确的值、我不知道如何处理这种情况、因此我使用指针来传输参数…尽管我以这种方式获得了正确的结果。

    但我仍然想知道为什么我无法通过"返回"获得正确的结果。

    我问过这个问题、但没有解决、但我错误地单击了"Resolved"(已解决)按钮...所以我再次问。

    有人可以帮助我吗?谢谢。

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

    对于此函数、正确的原型为:

    float ADS1118_ADCExchangeRaw (无符号短整型数据);

    它应出现在函数的第一次调用之前。 它们通常位于.h 文件中。

    创建一个显示问题的小程序并与我们分享。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我已将此主题与您发布的另一个类似主题合并、因为它们与同一主题相关。 请继续关注此特定主题的主题。

    关于 float 类型和 MSP430,如果您使用 float 类型,我强烈建议您 使用 MSPMATHLIB ( www.ti.com/.../MSPMATHLIB )进行 float 操作。 MSP430架构没有用于浮点计算的单独单元、因此编译器必须将此类型转换为 MSP430理解的内容。 这会增加编译代码的复杂性以及其他计算资源。 MSPMATHLIB 旨在优化浮点运算以减轻这一负担。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为了放大 Keith Barkley 所说的话:我围绕这个片段构建了一个小程序、和

    1)使用原型("转发声明")时、它可以正常工作

    2)如果没有原型、则其功能不正确(-320.0、而不是2.49)。 它也会发出警告。

    #include 
    #include 
    
    const float Vref = 2.5;//我假设
    volatile float ADC_Data =-1234.0;// Init to eye-catcher
    char ADC_Data_str[31 + 1];
    
    //注释以下行以获取错误的答案。
    float ADS1118_ADCExchangeRaw (无符号短整型数据);//转发
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    
    ADC_Data = ADS1118_ADCExchangeRaw (0x7fff);
    snprintf (adc_Data_str、sizeof (adc_Data_str)、"%f"、adc_Data);
    while (1)
    {
    asm volatile (" nop");//此处的断点
    }
    /*NOTREACHED*/
    返回0;
    }
    float ADS1118_ADCExchangeRaw (无符号短整型数据)
    {
    float out = 0;
    OUT =(浮点)数据* Vref;
    out /= 32768;
    返回;
    }
    

    [编辑:固定措辞]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为了让您知道、我们假设您熟悉 C 语言。原型是该语言的基本功能。