嵌入式开发者社区

标题: debug时程序运行的莫名其妙 [打印本页]

作者: zhangsan1231    时间: 2017-6-8 15:50
标题: debug时程序运行的莫名其妙
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 + Z+ e( ?6 o/ }( x5 \

- c# T& D3 ^& P" w" x各位大神:( N/ o5 E6 h( B+ i- `& a
     你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
1 j5 H6 `4 O( G# {% ~' l      我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:$ [6 U$ N( i- D2 {

7 C) \( x2 ?$ k! a& S9 t7 N     [attach]2441[/attach]; F# n" y7 l% Z( @
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
' x3 e3 _- Y$ C% H; R# M) j7 U- a) Q- c0 l! \5 q
并没有其他线程) g( z7 h+ ^6 }/ Z/ g
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。' ~2 E& e# T( j3 [: }" g
也说不定是和堆栈有关系。。。。。。; c$ B# Q; g- u$ g/ H5 V0 i
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
) ?- P# `! y: N% R" @3 X[attach]2442[/attach]
5 ?7 [5 G! G/ Y) c5 @8 ?$ u4 W7 v" H( O% @' [) m
6 ?- n% h# E, O
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
4 a" ^4 @' Z) n
  |. ~6 r4 m% Q) g1 ~
: l# T) a* `: C" G: T附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组        static double usable_left_filtfilt[81000];% @/ J, B& ~$ `+ a0 b
        static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。# s$ ?. ^6 m) z. G* y" c% Q4 u% w( V

- N& l3 n) ]  E" _" jboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(5 A- u% }% f4 L
                const double data1000[1000]) {; ^$ w6 @) f! N( t$ K6 t2 A$ z

7 b0 r5 [' h( O% {1 c2 j0 ^        int myfuck;
  ~3 B1 j8 a6 [/ \6 E+ {, B+ O        double yiDuanShuJu_mean;
" o  T! `. h, ?        double yiDuanShuJu_LowMean[1000];# {% I, ~2 p' u
        int ixstart;
) P4 i! j4 o- z6 @" ?1 k        double dv0[1000];* M. z. @: o) i  H
        comm_AGC pAGC;
7 U* |7 k7 w& \) j& b8 w8 a        comm_CarrierSynchronizer pFineFreqCompensator;2 ?6 Q. u, v8 L8 a
        dspcodegen_FIRDecimator pRxFilter;& p% I7 V0 Z. M# S/ ~
        comm_SymbolSynchronizer pTimingRec;
) ^# ~% j4 W( ?4 Q; V7 f7 ]5 M        comm_PreambleDetector pPrbDet;
5 p0 X3 o: G% ]- H        FrameSynchronizer pFrameSync;9 D! `' S' k) s2 I1 \) ^% Q
        QPSKDataDecoder pDataDecod;) O* N! F  H4 N2 l$ n
        static double usable_left_filtfilt[81000];
* k) Y, I  @' `6 p        static double youXiaoShuJu_QuZhiLiu[81000];
( r( z; E# U+ H3 D8 j8 m        double mtmp;
5 @: g! M' n8 M) Q; U        int ix;! A6 r; I8 z3 Z( U, F+ p3 E  V# x
        boolean_T exitg2;
& C, [: r: f; \        boolean_T exitg1;
8 R5 k- [# H( K5 z        double YiZhenShuJu[800];
. E& h: z4 Q( w( Y' ?3 `4 Z' r7 w        double dv1[800];
0 v/ e& E" B* _% Z7 G9 q3 W4 }. J' h' G
, C" B% t" f- S
        double b_YiZhenShuJu[800];/ ~" m% O1 f( \. K! o& Q
        double I_filtfilt[800];# ^$ E1 c7 @4 y3 U& s3 ^
        double Q_filtfilt[800];
! q4 r; k! P4 V        creal_T b_I_filtfilt[800];
) ]7 W$ V" w* ~! V9 |        creal_T b[800];- p: Z" ~1 ?% d! o+ m( B& @- P
        creal_T RCRxSignal[50];
: Q: C1 e9 {1 S% o% N8 j        creal_T fineCompSignal[50];+ G) S1 r: S5 t( S3 Y/ |8 ~, `! @
        double phError[50];; |) D7 r9 n8 G
        creal_T timingRecSignal_data[28];
3 N9 o2 v3 W$ B3 l# [' F  J        int timingRecSignal_size[1];$ F% x" L1 c  S% S2 D) g
        double prbIdx_data[28];0 n3 [4 U" ]& G) z$ A  N& p
        int prbIdx_size[1];3 R( }8 L1 n' X. |
        double dtMt_data[28];
. d5 `/ D! ]4 }$ {1 }' K/ W9 e) S        int dtMt_size[1];
! W7 ?8 K, Q1 Q+ a# v+ u        creal_T symFrame[25];) E  E' u0 f. D/ M, J9 k
        boolean_T isFrameValid;
: c+ w9 P4 ~! i; b) V, f        double unusedU0[3];
) g  g4 ]0 M9 _; n/ u' b
% F. n  [$ m' V6 N: p8 q, Z5 v        //调试过程中的变量' m3 [7 q8 M8 G, G& E2 D: C
        int  enough_data;
8 u. {2 c* {7 O, ~! S0 m0 p+ M7 h3 Y
        int enoughDataFlag;) d9 p5 r7 t  h5 n2 L
        int yiDuanShuJu_mean_int;( n; H* m( U$ @- M% ?+ k
        int int_sum_dv0;
5 F5 \1 K' E: Q4 P) y        int oo;8 _" E) b4 u: e
        int ii;
+ b1 ^0 O! b* C0 q        myfuck=10;( N% V$ k  H3 Q' v
        /*  模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */" k5 I" [, {- C; m  L0 d1 X1 t" L
        /*  考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */7 X' A/ ^: H) Y+ x$ A+ W
3 G. ^/ n9 ^; i2 _! s8 s" c3 s
        yiDuanShuJu_mean = mean(data1000);
% N; p* V8 `8 m5 q. ~# e2 t
6 v! k9 `$ _( V' r% o5 G        yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;4 r4 c" _* q% h+ c+ g6 N3 ?5 N
        UARTPutc('A');
0 l* ]- o2 w; n; Y3 _        UARTPutNum(yiDuanShuJu_mean_int);
: S* B8 b" D/ {' t        UARTPutc('\r');, w' r$ a5 Z5 G
        UARTPutc('\n');
9 @2 B6 }& S9 y4 _1 A! m3 M
! {( ^. r; {6 U+ `" L! [1 m6 K8 h        for (ixstart = 0; ixstart < 1000; ixstart++) {  i) u% c% f/ S5 `
                yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
4 R+ d8 A" I; k# }- s; E        }
" u; T$ w$ \. C$ H! o- v. v. F  t$ p( t; I# q0 [: ?
        power(yiDuanShuJu_LowMean, dv0);
1 Q& v& n' s8 J' j+ C& X
7 A0 I2 }0 `2 |. Q& i( E8 D4 S2 M        int_sum_dv0 = (int) sum(dv0);
+ P' [9 ]1 f5 b1 w% u+ ?& [/ N6 D$ q  `4 Q
        UARTPutc('B');
$ {5 o. [+ ~6 G6 E* [        UARTPutNum(int_sum_dv0);
+ f2 y' ~& T& v0 Y1 [        UARTPutc('\r');
; V! s/ n% o" Z5 i* y% v5 t        UARTPutc('\n');6 D( K- Y) w5 \- ?2 c0 L+ V* P' V0 p

+ b/ n: f- S) c8 J9 b//        int compareFlag = int_sum_dv0 > 1.0E+8;
; N0 k! ?9 g% _2 ^' `5 \& D' {# b- ]$ u  z: U! K
        if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
: z+ b! a& {* l! y  \. E                UARTPutc('C');9 v' T( r, U* u% N, \
                /*  比较信号能量 */. \6 w- h/ S$ m/ v) Z& D
                /*          fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
; H0 ^* O; _$ p# ]2 p% c//                yiDuanShuJu_mean = 1000.0 * youxiao_k;
* ]4 H% Y0 [; j1 K, ]) z//                for (ixstart = 0; ixstart < 1000; ixstart++) {6 H0 f! E0 x, K' K2 |  I
//                        save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =3 ^6 F3 W* p; u$ b$ k) B: c
//                                        yiDuanShuJu_LowMean[ixstart];( j' ^* g. Z/ v
//                }) {, k: [" L4 N& i; }8 h
//% `, U+ D7 @& g; n+ B
//                youxiao_k++;- C8 J  g$ T& Z. e4 h
//                if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==4 B3 n( ~+ z0 s+ [0 Q5 h% q
//                        /* 感觉要取21个数,即0-20, */
$ s9 T# S: X$ d. K//                        enough_data = 10;//有效是10,无效是0- J/ _" p! s! W1 I( B3 J+ z" _4 c
//                }
. }, j! ^7 A$ ]        }
2 k% i" J0 ]- g! S
' S3 y& d# v7 n1 n5 c5 g, ~4 O. F4 R* W
        enoughDataFlag = 100;
4 J3 S  }( u/ c5 j1 y; m; ^1 J        enoughDataFlag = 1000;* s0 c. u2 V* E& A% C
        enoughDataFlag = 0x02;+ k4 w0 `+ J. F* h
        enoughDataFlag = 200;+ V$ {8 c9 S0 Q* t  C, N
& [" ?0 `( T" |( T' t
        int myfuvk1;7 b4 t* }, v2 j7 o, u
        myfuvk1 =11;
& g) \' Y. P- f) W# Q" Z+ g
1 H) I# H8 z) q- t8 {  D* g. F9 q# w! h7 S
        enough_data = 0;
$ q, }! {/ P  Z+ n; F* q0 \/ {# ]
+ ?0 W! d; Z% M/ {' T3 \//        if(enough_data>50){
! u  A' b: h6 c" q1 u7 g//                enoughDataFlag=0x01;2 @  v( q" l, T
//        }else if(enough_data<50){3 ~: V% O- ]) E% w( \
//                enoughDataFlag=0x00;//0x00还是不行6 e3 z( d. H, q( {. A5 u
//        }% H4 J( K) d" B" Y0 k

/ G4 h5 M/ B- K) b) F. C! C* t8 c, r, S* K! i8 U
        oo=10;
4 f3 e7 e2 K3 b. _        oo = oo  <  5;
) ?/ B8 y8 j9 k+ B  H& {        if(oo){* J7 \1 `9 }7 J. f. A
                ii=0;: q( K8 V. J. `0 s
        }
8 m( r2 X# c3 s5 s9 m/ e3 i  y        if(oo  <  5){9 G7 r; h  _. e7 o. a% E
                ii=0;9 D8 [: |3 x/ w- q9 P: X3 B
        }( z9 v& Y' J0 P$ I; s4 ]% u0 T
        if(oo  >  5){6 l. I% ^! x. R. ]# L  S
                ii=0;
0 m7 F, ?+ G) b1 u( n2 h        }# x8 ?; z7 F2 m9 B
4 S- m7 s, F- k) j1 N5 h
        /*  save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
; v: n; [, k, z' T        /*  如果数据足够才执行主程序 */& b9 V* ]3 T5 d( n. P* u4 ^6 M
        oo = oo  <  5;+ ^9 S9 A; l3 k4 o) Q' T+ F
        enoughDataFlag = enoughDataFlag  <  5;8 {2 ]; w3 t  u* t- U; N: w" `
        if (enoughDataFlag  <  5) {
% x; A! e: j5 ^/ a& @//        if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
1 d) r% j& V. L; `                AGC_AGC(&pAGC);+ o: P5 b9 H+ s; \% ?

% o1 U  w' v1 j/ p- r/ k  X                c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
1 g0 k/ b& c1 x  d1 h" M                FIRDecimator_FIRDecimator(&pRxFilter);( I$ e2 t5 r+ `- G

7 d# Z2 ?+ J( E% p& j- _                /* Downsampling */
  O- R: u$ m9 O- V6 S8 @" f                c_SymbolSynchronizer_SymbolSync(&pTimingRec);
4 Y) C7 n" A/ J7 ]
+ ~& K* I- l( N- t( `/ ?                c_PreambleDetector_PreambleDete(&pPrbDet);
/ ~( F1 B0 f; j  x& [% k+ P& H. W
8 ^1 F0 _% B9 j! T$ ~                /*   'Threshold', 8);空气信道情况下,把阈值从8改成7 */; i: {! u1 p( Q: D
                /*  %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */- c2 K5 X' Z' R- V/ I) Y
                /*     %帧数量=100 */
2 c7 f+ G) k8 P! Y& F                pFrameSync.isInitialized = 0;
! ?% j4 D* d3 @, s) _% F6 J$ n6 i
                /*  [EOF] */5 e- D  M/ d& G3 b# u
                /* 前导码长度是13 */
3 J/ y5 ~  B0 z8 [, G3 E2 L                /*    %qpsk */- i0 L& K4 m$ {* D# U
                pDataDecod.isInitialized = 0;
. V; \3 P8 O. A* T1 T$ L9 ?" H3 q. z# \% d: u: m
                /*  end */& J3 g* _, V) n$ d' a
                /*     %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
1 O7 B. [& U- t% b, g                /* Convert 3-dB frequency */
. r0 x1 R# b. j( [                /* Convert 3-dB frequency */$ r# p- l% c4 w3 ?  W
                filtfilt(save_buffer, usable_left_filtfilt);5 [, ]* {2 U- K3 S
                for (ixstart = 0; ixstart < 81000; ixstart++) {; F' a$ \! n' I# `' [8 G
                        usable_left_filtfilt[ixstart] *= 2.0;
+ g5 x  t6 J% F3 b- I                }' C2 S2 T% V5 i. W6 E1 S* n
  F6 K9 i# O6 a  o( h
                /* 注意乘2,处理幅度 */
$ T( @. r7 O3 q1 [: ]2 ^# e9 B                /*     %% 我发现带通之后其实就均值为0了,不用这一步了 */8 Z- s5 |: v0 p6 W4 }9 G- K7 p
                /*     %% 行列转换 */
' F! I% S( a1 m0 n                yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
9 o% K" e+ {) U$ B                for (ixstart = 0; ixstart < 81000; ixstart++) {
+ {) Z: N  O6 e* H; P$ `$ h                        youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]0 w) [( Q, A3 R
                                        - yiDuanShuJu_mean;
5 W! d$ L7 x: s" Y3 l$ W                }" G# c! J" K  J
7 n) r+ m2 b; @! c) v$ k
                /*     %% 应该对数据归一化,但是这一步放在哪比较好 */
+ y/ N4 _$ q, N7 j, g7 s                ixstart = 1;# L! z/ j) l4 G3 v5 r4 `/ k
                mtmp = youXiaoShuJu_QuZhiLiu[0];2 K& w) o% s+ S* L
                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
  |; g  ^! b% F! a; f                        ix = 2;
' `7 ]9 t+ e; O& g: n+ |3 c                        exitg2 = false;
+ L% L; [) Z$ L2 s% z. Q                        while ((!exitg2) && (ix < 81001)) {2 i8 e$ H% h$ `! ?: a
                                ixstart = ix;" ^* g( h2 H7 ^9 r5 G' ^9 V9 O) X
                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
" A' r5 I) y" h1 Q% I, Z5 Y, G  U0 o                                        mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];5 |2 O0 J8 W# ]0 M" c5 Z% J
                                        exitg2 = true;
! b6 V* r6 C! _! O) G: H                                } else {
8 M4 T& l) t) x- G+ U0 g6 T  k9 i                                        ix++;. V' Q4 n5 v6 ]
                                }
" ~3 p6 f( L" i* @3 \                        }
) `$ Z! f/ J# T7 b; ?% f3 f/ @                }
* f+ @# e2 O. a, U5 N8 ]! M/ m+ Q1 a. K
                if (ixstart < 81000) {+ H- `, A% {6 m& R: K$ [" X0 k
                        while (ixstart + 1 < 81001) {- L1 q5 g8 [) p# t! _. f4 }" u
                                if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {& `) R9 t, P4 g/ U+ O' ]  W
                                        mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
2 N% d6 e/ m# p# D! l8 k                                }
- T+ O/ z3 Q/ c: C
0 n; Z7 q: f7 P, o4 X2 K% t                                ixstart++;
$ `7 T$ U5 U. S4 [                        }
3 `  t! k" a& n$ K$ t0 m0 d                }
. X% }7 z3 t) Y8 o+ l9 s* I4 j
& {/ u+ D9 N% B* f4 N1 u9 k, A                ixstart = 1;% K8 A! p; k- Q( W# D" K( q6 Z
                yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];. F0 q9 ]. e9 L& _5 ^
                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
) S* t2 z: l( E6 E9 T$ [- z7 t                        ix = 2;& y( x: q( C8 W! Z! u% E* X( m1 Z
                        exitg1 = false;
/ K1 U6 e0 u! S1 ^+ y* J* i9 k                        while ((!exitg1) && (ix < 81001)) {
/ m" l7 Z" c) E- e9 K$ |                                ixstart = ix;
5 K6 v  `9 I- D1 J( [                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {2 a2 k: U2 D2 W$ ]3 Y
                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];, A4 t7 l  y- V" c
                                        exitg1 = true;. f9 X, |* ]- t4 a9 c& m
                                } else {
/ y) r+ Q3 I4 I( ]                                        ix++;- ]8 N7 u: u* H: c( R8 _/ _  \& n+ ~
                                }, `. w5 m2 \2 i9 @1 r4 W
                        }: ]8 G# m  z: V
                }* T. t  T9 P6 g( U
* q0 J3 X- T0 F# b  ]8 ~( F
                if (ixstart < 81000) {7 @! j8 _4 }' B2 v5 h
                        while (ixstart + 1 < 81001) {
0 Z( H* G. Q5 T# |                                if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {( s& ^2 e! T, k$ C) d
                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];% m# Z* y$ I; E) _* W) C5 R
                                }
7 `/ D/ v3 m6 \' K. r0 s" L8 {8 D( h$ f( D  i1 U; h
                                ixstart++;
0 d/ t( N) ^3 B4 ?6 t3 M2 g* u                        }
' ]. O( A9 o4 X; q; h- `. k* f                }- J- H8 f' ]- `" l% B, N
; n6 F0 M3 s. S2 h- [! i
                yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);2 w2 W1 A' o9 z; z) p4 S  y4 C; q
                if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
) n# q/ }2 S" a7 K                        yiDuanShuJu_mean = mtmp;
# g. k, H* r( U) n$ b                }1 `0 c" I: u" }, |3 [1 U) f

, I& I* \5 Z; F2 y0 m, B. U$ q                /*  找出极值 */
7 y3 o4 w. A& q3 @7 w% o                for (ixstart = 0; ixstart < 81000; ixstart++) {6 A7 ^; z7 ]& U% S( l% S
                        youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;" Z  i/ Y. @5 e5 z4 I
                }. q& |, h2 p9 g* g$ M
3 U0 b) X/ M" W* @6 r% M/ m% H
        --------------帖子字数限制------------------5 x5 {' t3 ?* A, ]; i% }; p
}
2 w% q3 N) B6 \$ e0 i, J+ Y0 U# u0 k6 \9 Y
/ v" N8 ]" g, {' N4 w3 C3 F
3 [; b3 T/ ^+ }
作者: tenny    时间: 2017-6-8 16:37
会不会有其它并行的线程修改到了它




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4