#define FFTPOINT 32
int main(void)
{
for(i=0;i<FFTPOINT;i++)
{
Vin[i].real=sin(i*14.0*3.14159/180.0)+5.1;
Vin[i].imag=0;
}
在CC430F5136中进行硬件仿真,当i=8的时候,执行到Vin[i].real=sin(i*14.0*3.14159/180.0)+5.1; 这一句时i=8变为i=0,这样导致for循环进入了死循环,程序无法往下运行,麻烦各位高手帮忙解决一下。
在CC430F5137中运行这样一段程序,在for循环执行到
Lina Lian:
long li4,
请问你的代码中 FFTPOINT的值究竟是多少?是不是代码不全?另外,请问你所谓的
long li4导致程序陷入死循环,这样for循环进入了死循环,
是什么意思?是一直在for循环里不出来吗?
最后部分,你是不是也没有写完?
麻烦您将描述添加完整,我们好看看有何建议并最大限度帮助你!O(∩_∩)O谢谢!
BR,
Lina
long li4:
回复 Lina Lian:
您好:
我重新整理了问题,不知道您是否看的懂?是因为i值在在还未满足循环条件时又被初始化为0,导致一直停留在for循环当中。
由与外接晶振只有32.768KHz。我怀疑是时钟频率过低导致运行不正常。随后通过倍频将频率提高,以上问题得到解决。
但是我还是得不到合理的解释,是因为在进行浮点数计算时时钟频率达不到要求从而导致i值被复位为0?还是别发热什么原因造成的?
Lina Lian:
回复 long li4:
long li4,
有以下几点建议:
1. MSP430的特点是超低功耗,它并不擅长进行浮点乘法,尤其是除法运算。故建议 i*14.0*3.14159/180.0 进行一下优化。另外sin()函数也可调用math library来进行运算,这样可提高运行效率。
2. 请问你的主频MCLK从哪里来?值为多少?你倍频后又将主频提高到了多少?一般而言,32.768KHz应该不会直接用为MCLK的,毕竟它太低了。
3. 另外请问你用的是CCS还是IAR, Complier是否是最新版的, 如果不是的话,升级看看。
希望对你有帮助!O(∩_∩)O~
BR,
Lina
Shi JianHua:
回复 Lina Lian:
会不会是浮点溢出,提供个参考。感觉你的意思就是想移植一个功能。
Triton Zhang:
检查下你的RAM空间,从现象描述可能是因为你空间不够,造成溢出更改了i的值.
long li4:
回复 Triton Zhang:
您好:
RAM空间总共4K,我检查了一下用了大约2k。要是RAM溢出的话,应该报错的。
long li4:
回复 Lina Lian:
您好:
1.关于 i*14.0*3.14159/180.0 优化的问题没有理解您说的是以哪种优化方式优化。sin()是不是调用(math.h)头文件中的sin()函数。
2.主频MCLK是由DCOCLK来的,DCOCLK是以XT1为参考倍频得到的。主频现在是5.37MHz。在为倍频之前timer、uart、RF都正常运行。
3.用的是IAR,是5.5.2版本的,查了一下最新版本时5.6的。这个应该差不多吧!
long li4:
回复 Shi JianHua:
您好:
不调用sin(),单独赋值一个浮点数就可以正常运行。
Triton Zhang:
回复 long li4:
你把变量 i 定义成初始赋值的静态变量试下呢?
如果不能解决,尝试把堆栈定义大点,你调用了数学库的函数,有可能会有堆栈损耗造成堆栈溢出。