mengheli 发表于 2015-1-4 09:52

为什么28027会跳过函数执行下一条语句

在调用语句的时候不会进入函数,直接进行下一条语句
fft(ceshi,R,zm,zinv);
input=_IQ20(alfa);
例如,在上面两句附近分别设置断点,正常应该是在fft调用时进入子程序,但并没有进入,而是直接进行了input语句
这是为什么

函数语句如下
void fft(float sr[],float sx[],int m0,int inv)
{
        int i,j,lm,li,k,lmx,np,lix,mm2;
        _iq t1,t2,c,s,cv,st,ct,sri,srk,srj,sxk,sxi,sxj;

        if(m0<0)
                return;
        lmx=1;
        for(i=1;i<=m0;++i)
      lmx+=lmx;   //form 2**m0

        cv=_IQ20div(_IQ20(PI),_IQ20(lmx));
    //cv=2.0*PI/(double)lmx;
        ct=_IQ20cos(cv);
        //ct=cos(cv);

        st=_IQ20sin(cv);
        st=_IQ20mpy(_IQ20(-inv),st);
        //st=-inv*sin(cv);

        np=lmx;
        mm2=m0-2;

        for(i=1;i<=mm2;++i)
        {
                lix=lmx;lmx/=2;
                c=ct;s=st;
                for(li=0;li<np;li+=lix)
                {
                        j=li;k=j+lmx;
                        srj=_IQ20(sr);//dingyi
                        srk=_IQ20(sr);//
                        sxj=_IQ20(sx);//
                        sxk=_IQ20(sx);//
                        t1=srj-srk;
                        t2=sxj-sxk;
                        //t1=sr-sr;t2=sx-sx;
                        srj=srj+srk;
                        sxj=sxj+sxk;
                        srk=t1;
                        sxk=t2;
                        sr=_IQ20toF(srk);
                        sr=_IQ20toF(srj);
                        sx=_IQ20toF(sxk);
                        sx=_IQ20toF(sxj);

                        //sr+=sr;sx+=sx;sr=t1;sx=t2;
                        ++j;++k;
                        srj=_IQ20(sr);//dingyi
                        srk=_IQ20(sr);//
                        sxj=_IQ20(sx);//
                        sxk=_IQ20(sx);//
                        t1=srj-srk;
                        t2=sxj-sxk;
                        //t1=sr-sr;t2=sx-sx;
                        srj=srj+srk;
                        sxj=sxj+sxk;
                        //sr+=sr;sx+=sx;
                        srk=_IQ20mpy(c,t1)-_IQ20mpy(s,t2);
                        sxk=_IQ20mpy(s,t1)+_IQ20mpy(c,t2);
                        //sr=c*t1-s*t2;sx=s*t1+c*t2;
                        sr=_IQ20toF(srk);
                        sr=_IQ20toF(srj);
                        sx=_IQ20toF(sxk);
                        sx=_IQ20toF(sxj);
                }
                for(lm=2;lm<lmx;++lm)
                {
                        cv=c;
                        c=_IQ20mpy(c,ct)-_IQ20mpy(st,s);
                        s=_IQ20mpy(st,cv)+_IQ20mpy(ct,s);
                        //c=ct*c-st*s;s=st*cv+ct*s;
                        for(li=0;li<np;li+=lix)
                        {
                                j=li+lm;k=lmx+j;
                                srj=_IQ20(sr);//dingyi
                                srk=_IQ20(sr);//
                                sxj=_IQ20(sx);//
                                sxk=_IQ20(sx);//
                                t1=srj-srk;
                                t2=sxj-sxk;
                                //t1=sr-sr;t2=sx-sx;
                                srj=srj+srk;
                                sxj=sxj+sxk;
                                //sr+=sr;sx+=sx;
                                srk=_IQ20mpy(c,t1)-_IQ20mpy(s,t2);
                                sxk=_IQ20mpy(s,t1)+_IQ20mpy(c,t2);
                                //sr=c*t1-s*t2;sx=s*t1+c*t2;
                                sr=_IQ20toF(srk);
                                sr=_IQ20toF(srj);
                                sx=_IQ20toF(sxk);
                                sx=_IQ20toF(sxj);
                        }
                }
                cv=ct;
                ct=_IQ20mpy(_IQ20(2.0),_IQ20mpy(ct,ct))-_IQ20(1.0);
                st=_IQ20mpy(_IQ20(2.0),_IQ20mpy(st,cv));
                //ct=2.0*ct*ct-1.0;st=2.0*st*cv;
        }

        if(m0>=2)
        for(li=0;li<np;li+=4)
        {
                j=li;k=j+2;
                srj=_IQ20(sr);//dingyi
                srk=_IQ20(sr);//
                sxj=_IQ20(sx);//
                sxk=_IQ20(sx);//
                t1=srj-srk;
                t2=sxj-sxk;
                //t1=sr-sr;t2=sx-sx;
                srj=srj+srk;
                sxj=sxj+sxk;
                srk=t1;
                sxk=t2;
                sr=_IQ20toF(srk);
                sr=_IQ20toF(srj);
                sx=_IQ20toF(sxk);
                sx=_IQ20toF(sxj);
                //sr+=sr;
                //sx+=sx;
                //sr=t1;sx=t2;
                ++j;++k;
                srj=_IQ20(sr);//dingyi
                srk=_IQ20(sr);//
                sxj=_IQ20(sx);//
                sxk=_IQ20(sx);//
                t1=srj-srk;
                t2=sxj-sxk;
                srj=srj+srk;
                sxj=sxj+sxk;
                srk=_IQ20mpy(_IQ20(inv),t2);
                sxk=_IQ20mpy(_IQ20(-inv),t1);
                //t1=sr-sr;t2=sx-sx;
                //sr+=sr;sx+=sx;
                //sr=inv*t2;sx=-inv*t1;
                sr=_IQ20toF(srk);
                sr=_IQ20toF(srj);
                sx=_IQ20toF(sxk);
                sx=_IQ20toF(sxj);
        }

        for(li=0;li<np;li+=2)
        {
                j=li;k=j+1;
                srj=_IQ20(sr);//dingyi
                srk=_IQ20(sr);//
                sxj=_IQ20(sx);//
                sxk=_IQ20(sx);//
                t1=srj-srk;
                t2=sxj-sxk;
                srj=srj+srk;
                sxj=sxj+sxk;
                srk=t1;
                sxk=t2;
                //t1=sr-sr;t2=sx-sx;
                //sr+=sr;sx+=sx;
                //sr=t1;sx=t2;
                sr=_IQ20toF(srk);
                sr=_IQ20toF(srj);
                sx=_IQ20toF(sxk);
                sx=_IQ20toF(sxj);
        }

        lmx=np/2;j=0;
        for(i=1;i<np-1;++i)
        {
                k=lmx;
                while(k<=j)
                {
                        j-=k;k/=2;
                }
                j+=k;
                if(i<j)
                {
                        //t1=sr;sr=sr;sr=t1;
                        //t1=sx;sx=sx;sx=t1;

                        srj=_IQ20(sr);//dingyi
                        sri=_IQ20(sr);//sri 记得定义!!!
                        sxj=_IQ20(sx);//
                        sxi=_IQ20(sx);
                t1=srj;srj=sri;sri=t1;
                t1=sxj;sxj=sxi;sxi=t1;
                sr=_IQ20toF(sri);
                sr=_IQ20toF(srj);
                sx=_IQ20toF(sxi);
                sx=_IQ20toF(sxj);



                }
        }

        if(inv!=-1)
                return;
        //t1=1.0/np;
        t1=_IQ20div(_IQ20(1.0),_IQ20(np));
        for(i=0;i<np;++i)
        {
                sri=_IQ20(sr);
                sxi=_IQ20(sx);
                sri=_IQ20mpy(sri,t1);
                sxi=_IQ20mpy(sxi,t1);
                //sr*=t1;sx*=t1;
                sr=_IQ20toF(sri);
                sx=_IQ20toF(sxi);
        }

}

JY-DX-JY 发表于 2015-1-4 11:03

是不是堆栈空间太小?

mengheli 发表于 2015-1-4 12:25

JY-DX-JY 发表于 2015-1-4 11:03 static/image/common/back.gif
是不是堆栈空间太小?

没用到堆栈啊貌似,如果堆栈地址过小引起的是对什么而言堆栈过小,我写的程序所需要的运行空间太大28027无法满足吗

wellhao2004 发表于 2015-1-4 16:33

是不是堆栈空间太小?

mengheli 发表于 2015-1-6 09:12

顶上去,有没有人知道原因

海中水 发表于 2015-1-6 09:34

你是单步执行的吗?执行到此处,点击进入函数。

mengheli 发表于 2015-1-16 13:53

海中水 发表于 2015-1-6 09:34 static/image/common/back.gif
你是单步执行的吗?执行到此处,点击进入函数。

什么叫点击进入函数

NWPU_CHEN 发表于 2015-1-16 16:17

估计你没有单步调试,单步执行不可能不可能出现这样的情况,非单步执行就很正常了

aresc 发表于 2015-1-17 19:45

在fft那一行设断点,停不下来吗?要是不行,会不会是被编译器优化掉了?把编译优化的选项全部取消试试先。

海中水 发表于 2015-1-19 09:18

mengheli 发表于 2015-1-16 13:53 static/image/common/back.gif
什么叫点击进入函数

单步执行到哪一行或者前一行的时候,在调试里面有一个进入函数选项。

mengheli 发表于 2015-1-22 12:28

海中水 发表于 2015-1-19 09:18 static/image/common/back.gif
单步执行到哪一行或者前一行的时候,在调试里面有一个进入函数选项。

原因好像是这个函数太长了,如果注释掉一部分,就可以正常调用了,是因为28027这个芯片不行吗,可是我还要用这个程序,有什么解决办法

海中水 发表于 2015-1-22 14:52

mengheli 发表于 2015-1-22 12:28 static/image/common/back.gif
原因好像是这个函数太长了,如果注释掉一部分,就可以正常调用了,是因为28027这个芯片不行吗,可是我还 ...

有这种状况吗?不应该的,函数调用的时候参数不要定义太多。哈有就是中断的时候的时候一般不要调用函数,其他的就没有什么要求的。应该不是这方面的问题。可以再仔细分析一下。
页: [1]
查看完整版本: 为什么28027会跳过函数执行下一条语句