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/EK-TM4C123GXL:sqrt()或math.h的问题

Guru**** 2563960 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/594757/ccs-ek-tm4c123gxl-problem-with-sqrt-or-math-h

部件号:EK-TM4C123GXL

工具/软件:Code Composer Studio

您好,  

我正在尝试编写代码以发送特定期间的输出,该期间由公式计算,但公式涉及平方根计算,因此我需要使用sqrt函数。

部分代码:

unsigned long结果;

unsigned long freq;

unsigned long b;

double k;

double a;

结果= freq *(unsigned long)(k *(sqrt (a/(double) b))); 

代码编译时没有错误,调试正常,但不会向输出发送信号。 在"表达式"选项卡中,我可以看到结果的值是正确的(平方根已计算)。 如果我删除了我的代码的sqrt部分,并这样编写:  

结果= freq *(无符号长)(k *(a/(double) b)); 

一切正常(我正在接收输出信号)。

我已包含"${TIVAWARE_INSTALL}"和 "${CG_TOOL_ROOT}/INCLUDE",并且包含了<math.h>文件到代码。 铸件长度到双倍是否有问题,或者我错误地包括了收割台? 或者可能是其他的事情? 感谢你的帮助

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

    我怀疑您发送信号到输出的方式有问题。  这个问题一直存在,但使用sqrt会触发它。  要查看此猜测是否正确,我们需要有关如何将信号发送到输出的更多详细信息。

    谢谢,此致,

    -George

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

    这是否:(K *(sqrt (a/(double) b))小于1? 如果是这样,则强制类型转换将其设置为零。

    您能给我们变量的典型值吗?

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

    为了进行试验,我使用的是TM4C123G LaunchPad Workshop Workbook实验4中的代码,因此现在 它应该只在特定时间内闪烁内置LED (它使用计时器中断)。 中断功能:

    Void Timer0IntHandler (void)
    {
    
    TimerIntClear (TIMER0_BASE,TIMER_TIMA_TIMEOUT);
    
    IF (GPIOPinRead (GPIO _PORTF_BASE,GPIO PIN_2))
    {
    GPIOPinWrite(GPIO_PORTF_BASE,GPIO _PIN_1|GPIO _PIN_2|GPIO PIN_PIN_3, 0);
    
    }
    其他
    {
    GPIOPinWrite(GPIO_PORTF_BASE,GPIO PIN_2,4);
    
    }
    计数器++
    ;} 

    然后,我有一个功能可更改计时器值(计时器设置为定期):

    void Speed()
    {
    IF (计数器>预备)
    {
    结果=结果1;
    TimerDisable (TIMER0_BASE,TIMER_A);
    TimerLoadSet(TIMER0_BASE,TIMER_A,Result);
    TimerEnable (TIMER0_BASE,TIMER_A);
    prev =计数器;
    }
    
    } 

    speed()处于while (1)循环中。  

    a = 1.2 ;b = 10;k = 0.5 ;freq = 4000万;所以是, 数字小于1。 这是我的错误,但如果我尝试以下操作:

    结果=(unsigned long)((double) freq * k * sqrt (a/(double) b)); 

    我得到了相同的结果(LED不闪烁)。

    编辑:我不明白为什么在调试视图的"表达式"选项卡中,值和类型显示正确

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    计数器是否易失?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不是,应该是吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,它应该是。voltatile告诉编译器,变量的值可以随时更改,并且需要始终访问。也就是说,它不能存储在寄存器中或优化离开,因为没有明显的方法可以更改其值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    那么“结果”也应该是挥发性的,因为我在递减它,每一个脉冲,对吗?
    我将计数器,预电压和结果更改为易失性,但LED仍然不闪烁。

    编辑:实际上它现在就可以工作了。 起初,我创建了新项目,但当它不起作用时,我尝试使用来自车间实验室器件的项目文件,它是在较旧的CCS版本中创建的。 现在我在我创建的项目中试用了它,它很有效! 情况似乎很不稳定。 感谢你的帮助

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

    在中断服务例程中未设置AfaICT结果,因此不需要volatile。只有当值以编译器不知道的方式更改时,才需要volatile。 只有ISR和内存映射I/O中设置的变量需要易失性。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果函数中有setjmp,并且需要在longjmp函数从setjmp返回时变量有效,则还必须声明局部变量volatile。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢,这是一个新的问题。 但有人使用longjmp()吗? 8^)我经常提到它是一种无需重置的重置方式,但人们看着我很有趣。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯...如果它在那里,有人会使用它。 另见 en.wikipedia.org/.../Law_of_the_instrument