打印

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

[复制链接]
1102|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mengheli|  楼主 | 2015-1-4 09:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在调用语句的时候不会进入函数,直接进行下一条语句
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[j]);//dingyi
                        srk=_IQ20(sr[k]);//
                        sxj=_IQ20(sx[j]);//
                        sxk=_IQ20(sx[k]);//
                        t1=srj-srk;
                        t2=sxj-sxk;
                        //t1=sr[j]-sr[k];t2=sx[j]-sx[k];
                        srj=srj+srk;
                        sxj=sxj+sxk;
                        srk=t1;
                        sxk=t2;
                        sr[k]=_IQ20toF(srk);
                        sr[j]=_IQ20toF(srj);
                        sx[k]=_IQ20toF(sxk);
                        sx[j]=_IQ20toF(sxj);

                        //sr[j]+=sr[k];sx[j]+=sx[k];sr[k]=t1;sx[k]=t2;
                        ++j;++k;
                        srj=_IQ20(sr[j]);//dingyi
                        srk=_IQ20(sr[k]);//
                        sxj=_IQ20(sx[j]);//
                        sxk=_IQ20(sx[k]);//
                        t1=srj-srk;
                        t2=sxj-sxk;
                        //t1=sr[j]-sr[k];t2=sx[j]-sx[k];
                        srj=srj+srk;
                        sxj=sxj+sxk;
                        //sr[j]+=sr[k];sx[j]+=sx[k];
                        srk=_IQ20mpy(c,t1)-_IQ20mpy(s,t2);
                        sxk=_IQ20mpy(s,t1)+_IQ20mpy(c,t2);
                        //sr[k]=c*t1-s*t2;sx[k]=s*t1+c*t2;
                        sr[k]=_IQ20toF(srk);
                        sr[j]=_IQ20toF(srj);
                        sx[k]=_IQ20toF(sxk);
                        sx[j]=_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[j]);//dingyi
                                srk=_IQ20(sr[k]);//
                                sxj=_IQ20(sx[j]);//
                                sxk=_IQ20(sx[k]);//
                                t1=srj-srk;
                                t2=sxj-sxk;
                                //t1=sr[j]-sr[k];t2=sx[j]-sx[k];
                                srj=srj+srk;
                                sxj=sxj+sxk;
                                //sr[j]+=sr[k];sx[j]+=sx[k];
                                srk=_IQ20mpy(c,t1)-_IQ20mpy(s,t2);
                                sxk=_IQ20mpy(s,t1)+_IQ20mpy(c,t2);
                                //sr[k]=c*t1-s*t2;sx[k]=s*t1+c*t2;
                                sr[k]=_IQ20toF(srk);
                                sr[j]=_IQ20toF(srj);
                                sx[k]=_IQ20toF(sxk);
                                sx[j]=_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[j]);//dingyi
                srk=_IQ20(sr[k]);//
                sxj=_IQ20(sx[j]);//
                sxk=_IQ20(sx[k]);//
                t1=srj-srk;
                t2=sxj-sxk;
                //t1=sr[j]-sr[k];t2=sx[j]-sx[k];
                srj=srj+srk;
                sxj=sxj+sxk;
                srk=t1;
                sxk=t2;
                sr[k]=_IQ20toF(srk);
                sr[j]=_IQ20toF(srj);
                sx[k]=_IQ20toF(sxk);
                sx[j]=_IQ20toF(sxj);
                //sr[j]+=sr[k];
                //sx[j]+=sx[k];
                //sr[k]=t1;sx[k]=t2;
                ++j;++k;
                srj=_IQ20(sr[j]);//dingyi
                srk=_IQ20(sr[k]);//
                sxj=_IQ20(sx[j]);//
                sxk=_IQ20(sx[k]);//
                t1=srj-srk;
                t2=sxj-sxk;
                srj=srj+srk;
                sxj=sxj+sxk;
                srk=_IQ20mpy(_IQ20(inv),t2);
                sxk=_IQ20mpy(_IQ20(-inv),t1);
                //t1=sr[j]-sr[k];t2=sx[j]-sx[k];
                //sr[j]+=sr[k];sx[j]+=sx[k];
                //sr[k]=inv*t2;sx[k]=-inv*t1;
                sr[k]=_IQ20toF(srk);
                sr[j]=_IQ20toF(srj);
                sx[k]=_IQ20toF(sxk);
                sx[j]=_IQ20toF(sxj);
        }

        for(li=0;li<np;li+=2)
        {
                j=li;k=j+1;
                srj=_IQ20(sr[j]);//dingyi
                srk=_IQ20(sr[k]);//
                sxj=_IQ20(sx[j]);//
                sxk=_IQ20(sx[k]);//
                t1=srj-srk;
                t2=sxj-sxk;
                srj=srj+srk;
                sxj=sxj+sxk;
                srk=t1;
                sxk=t2;
                //t1=sr[j]-sr[k];t2=sx[j]-sx[k];
                //sr[j]+=sr[k];sx[j]+=sx[k];
                //sr[k]=t1;sx[k]=t2;
                sr[k]=_IQ20toF(srk);
                sr[j]=_IQ20toF(srj);
                sx[k]=_IQ20toF(sxk);
                sx[j]=_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[j];sr[j]=sr[i];sr[i]=t1;
                        //t1=sx[j];sx[j]=sx[i];sx[i]=t1;

                        srj=_IQ20(sr[j]);//dingyi
                        sri=_IQ20(sr[i]);//sri 记得定义!!!
                        sxj=_IQ20(sx[j]);//
                        sxi=_IQ20(sx[i]);
                t1=srj;srj=sri;sri=t1;
                t1=sxj;sxj=sxi;sxi=t1;
                sr[i]=_IQ20toF(sri);
                sr[j]=_IQ20toF(srj);
                sx[i]=_IQ20toF(sxi);
                sx[j]=_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[i]);
                sxi=_IQ20(sx[i]);
                sri=_IQ20mpy(sri,t1);
                sxi=_IQ20mpy(sxi,t1);
                //sr[i]*=t1;sx[i]*=t1;
                sr[i]=_IQ20toF(sri);
                sx[i]=_IQ20toF(sxi);
        }

}

相关帖子

沙发
JY-DX-JY| | 2015-1-4 11:03 | 只看该作者
是不是堆栈空间太小?

使用特权

评论回复
板凳
mengheli|  楼主 | 2015-1-4 12:25 | 只看该作者
JY-DX-JY 发表于 2015-1-4 11:03
是不是堆栈空间太小?

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

使用特权

评论回复
地板
wellhao2004| | 2015-1-4 16:33 | 只看该作者
是不是堆栈空间太小?

使用特权

评论回复
5
mengheli|  楼主 | 2015-1-6 09:12 | 只看该作者
顶上去,有没有人知道原因

使用特权

评论回复
6
海中水| | 2015-1-6 09:34 | 只看该作者
你是单步执行的吗?执行到此处,点击进入函数。

使用特权

评论回复
7
mengheli|  楼主 | 2015-1-16 13:53 | 只看该作者
海中水 发表于 2015-1-6 09:34
你是单步执行的吗?执行到此处,点击进入函数。

什么叫点击进入函数

使用特权

评论回复
8
NWPU_CHEN| | 2015-1-16 16:17 | 只看该作者
估计你没有单步调试,单步执行不可能不可能出现这样的情况,非单步执行就很正常了

使用特权

评论回复
9
aresc| | 2015-1-17 19:45 | 只看该作者
在fft那一行设断点,停不下来吗?要是不行,会不会是被编译器优化掉了?把编译优化的选项全部取消试试先。

使用特权

评论回复
10
海中水| | 2015-1-19 09:18 | 只看该作者
mengheli 发表于 2015-1-16 13:53
什么叫点击进入函数

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

使用特权

评论回复
11
mengheli|  楼主 | 2015-1-22 12:28 | 只看该作者
海中水 发表于 2015-1-19 09:18
单步执行到哪一行或者前一行的时候,在调试里面有一个进入函数选项。

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

使用特权

评论回复
12
海中水| | 2015-1-22 14:52 | 只看该作者
mengheli 发表于 2015-1-22 12:28
原因好像是这个函数太长了,如果注释掉一部分,就可以正常调用了,是因为28027这个芯片不行吗,可是我还 ...

有这种状况吗?不应该的,函数调用的时候参数不要定义太多。哈有就是中断的时候的时候一般不要调用函数,其他的就没有什么要求的。应该不是这方面的问题。可以再仔细分析一下。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

31

帖子

0

粉丝