嵌入式开发者社区

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

作者: zhangsan1231    时间: 2017-6-8 15:50
标题: debug时程序运行的莫名其妙
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 6 C/ Q$ U; g7 k* l- p
# N- t# o! O. u9 S; b7 n
各位大神:2 X# B) C1 v& z/ [
     你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~). b- f, V7 O+ W6 l0 l: c* x; Y$ h; M
      我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
- P5 r  }. p% G+ G- b& Y+ J0 Q! X: G2 L7 e% C1 o2 _+ E. W
     [attach]2441[/attach]
2 }4 Y- S1 m; a! O5 W# W这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。' i0 S; ?9 U& a$ d
  D2 L, v+ ?: r8 d" ^4 j- \: J
并没有其他线程: g# s1 [. \8 r; A$ m
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
% C( I1 b% E5 g3 {也说不定是和堆栈有关系。。。。。。' A. i8 M; |3 y0 ]. a
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
; r1 \  t0 c, s: W9 A[attach]2442[/attach]: G- P3 Z+ X. l
; L* C- _: G" u- b' t/ u
6 L, s& v: p6 s- a6 ^0 L
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
2 i; w& U, D0 n- j" t3 G
7 g! E( W; B" ^
' X" W& [7 \- A  f) _' |附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组        static double usable_left_filtfilt[81000];+ e- a, z) [2 |
        static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
) Z8 L$ _* y9 F, g# e+ u$ O$ O( K3 y# W  m
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
0 h2 [2 g/ M# W3 ^9 B                const double data1000[1000]) {+ A# j5 Q) ~$ V: O; Z0 y0 U# w) d( f

4 S  d. U# G: H2 X        int myfuck;3 C+ x) h5 q# A" Z. U! R
        double yiDuanShuJu_mean;
" t1 [! S) ?8 d        double yiDuanShuJu_LowMean[1000];
% y" e: x, K5 [2 b, x        int ixstart;+ m  q# z: q. ~! l1 P; J+ f
        double dv0[1000];
1 B& {- \" F6 A, p. p        comm_AGC pAGC;
) L# n* [4 X. J        comm_CarrierSynchronizer pFineFreqCompensator;
# s" v7 R% ?9 k        dspcodegen_FIRDecimator pRxFilter;) H+ j( y  M: J7 G! ^" i  d! t
        comm_SymbolSynchronizer pTimingRec;
2 H0 q3 _1 Y, o. z1 t  I        comm_PreambleDetector pPrbDet;
- N: z' M; w$ |/ E0 G        FrameSynchronizer pFrameSync;
6 e5 }- |' W; N2 W3 h" c        QPSKDataDecoder pDataDecod;
% C  w. L1 Q( ]1 g8 C. H        static double usable_left_filtfilt[81000];
9 ]- J0 n3 C/ o5 O& F3 M2 {1 j1 [        static double youXiaoShuJu_QuZhiLiu[81000];7 X* w& e( H* ]; H  c
        double mtmp;$ d% d* r5 d, v+ c  d& _' r! a
        int ix;* V: |. E7 @; V
        boolean_T exitg2;0 {+ [( y  Q* u2 |
        boolean_T exitg1;
) C% b8 m# M) y- `# X: L' |        double YiZhenShuJu[800];
8 v' F( y- m5 M/ U0 Z; J        double dv1[800];  }+ a7 s2 l) \- x

! k, Z6 N( x' C' H) l3 C' f! K$ [. H+ q" K, D+ `
        double b_YiZhenShuJu[800];
- W( l  L! Y5 O! ^" p# y        double I_filtfilt[800];
. d2 A6 [) d. \; c        double Q_filtfilt[800];4 D; O9 M+ t) ~8 g( Y
        creal_T b_I_filtfilt[800];
4 u" C: p! ~1 n+ f0 a% p$ d9 N        creal_T b[800];4 E& t& y7 W# D, H' H& e
        creal_T RCRxSignal[50];5 L3 P( R" m" Z/ ?, @7 Y- u( T
        creal_T fineCompSignal[50];$ t% Y5 d3 O" r
        double phError[50];
/ R6 g6 x% D; n8 f. W8 V9 Q7 m        creal_T timingRecSignal_data[28];
/ ^. `/ x# |' ]4 B        int timingRecSignal_size[1];$ F5 M3 A0 i1 h( e5 H/ l6 Y$ D
        double prbIdx_data[28];
& e7 Z. N& u: F* [, W7 o        int prbIdx_size[1];. u$ a# ?' j- x
        double dtMt_data[28];0 G( z3 a# D4 E3 {
        int dtMt_size[1];
1 ?  C4 S4 N  o. Z! X* b3 {9 }        creal_T symFrame[25];: k- _  V! X- n2 p9 V
        boolean_T isFrameValid;3 w  \, A# A" B
        double unusedU0[3];
0 W4 n% O9 ]2 Z0 z: _, R) R# x1 \8 ?
        //调试过程中的变量9 p5 Q: [* Y/ p0 _$ I% g
        int  enough_data;& Y& P- l3 O' J  G$ S2 i
0 r8 _" C' I% ^
        int enoughDataFlag;
4 S" n. F( U5 W7 {        int yiDuanShuJu_mean_int;
) X+ m- d& s7 I& ^- h        int int_sum_dv0;# l3 k2 @5 t8 Z# t  a
        int oo;
3 I# \+ C$ ]& Z5 T9 F. l' W& I        int ii;
4 U/ n" [& s1 Z4 N2 @+ W0 m6 G        myfuck=10;4 `4 F; n9 X3 A3 J& B: X: O
        /*  模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */% a1 \- b7 a8 M
        /*  考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
+ @5 Q5 k' }" |3 a
3 H! C' J; N: W0 m        yiDuanShuJu_mean = mean(data1000);
" }4 @8 I- i7 f
. n1 U- V" a) H/ j        yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;9 D' v( t# ~" c$ W, ?
        UARTPutc('A');
% X9 Z' x% t  a1 z        UARTPutNum(yiDuanShuJu_mean_int);! n/ r0 Z3 z  S% F$ Q2 G9 e
        UARTPutc('\r');
; N# b+ r4 f6 w3 G: _        UARTPutc('\n');/ @# ?) _: a  E& }6 q
3 f: _; {8 u# s1 l7 e- b( C
        for (ixstart = 0; ixstart < 1000; ixstart++) {' w% c: q% F0 N0 b$ i, T
                yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;* H- t* q% K! I& D
        }. m- e; E# A2 E$ ^7 L5 E' }. l' [
7 m; O( s: |" D4 o1 J( Q0 U% v
        power(yiDuanShuJu_LowMean, dv0);
. S* {" @5 Z/ n6 F( \9 {
* D& t  q' \! T- R2 p. e6 \        int_sum_dv0 = (int) sum(dv0);
, [. v4 ]' d0 K6 L7 C6 a( M
" ]+ K5 D+ d3 ]& u4 l        UARTPutc('B');( L) K6 C. q( f/ p& J
        UARTPutNum(int_sum_dv0);9 `* d% i9 l  C! }' r
        UARTPutc('\r');
+ W0 n+ k3 T3 H( I. Y- n5 y# X        UARTPutc('\n');0 U/ {  E4 m1 [4 W3 }

) m7 k7 l9 H& u  ]//        int compareFlag = int_sum_dv0 > 1.0E+8;
! I8 Q/ ?$ g, }/ P( ]% d3 Q
# j, `7 D& ?8 U        if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
; z1 n: Y: |. R3 p+ ^                UARTPutc('C');- g  D& A, m& C( ^- v0 |3 s# I
                /*  比较信号能量 */3 r8 S/ j! T- j( k0 a6 D& V+ a) `. f, o
                /*          fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */: {; }* G9 V+ E, u
//                yiDuanShuJu_mean = 1000.0 * youxiao_k;5 f  Y: f7 `1 X- ?% H* b
//                for (ixstart = 0; ixstart < 1000; ixstart++) {
; H: w  C: C8 v1 i* p: S2 ^$ [//                        save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
. g) ~# v' {$ Y! z! f//                                        yiDuanShuJu_LowMean[ixstart];
' y& f$ K7 A; _& |1 R/ Y6 B//                }) ^0 E, ?# Q6 m& t" y7 L
//4 ~% p" R- j6 w' p: ~8 S$ L
//                youxiao_k++;3 ?% h4 u; S  F
//                if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==- q8 h7 x) ~( q9 _5 m  n8 A7 r/ ^/ a" a
//                        /* 感觉要取21个数,即0-20, */
4 x) [% Y$ U  O$ l: h//                        enough_data = 10;//有效是10,无效是0! |! v( {  r2 h' g8 s
//                }
. W" e' L  |/ c7 w        }
1 W! |0 W' y+ \! h% c
. B* e" m$ h& s7 e) Y1 \
) x2 C. Q; P1 E% b7 @/ B+ a( D        enoughDataFlag = 100;: S7 \! H1 _$ n9 V  @1 j! {
        enoughDataFlag = 1000;
; h7 V$ ?' `8 R$ Y1 S        enoughDataFlag = 0x02;
3 v9 j' n# H* K1 X        enoughDataFlag = 200;# J/ X( ?' S7 [+ Y% S- x6 p" Y6 m

5 [! i4 W, W. F' F        int myfuvk1;: v1 B4 C9 F  j: B. e6 h
        myfuvk1 =11;9 k$ c- s2 C% R. G7 D0 k7 Y

, b* b. q+ }8 G- j
- i. h5 \4 D4 L7 M( @( `& J$ S$ P        enough_data = 0;) P" v6 a5 N8 m% H

( i7 y1 G  V$ z1 g; k$ q) Y//        if(enough_data>50){9 y; D* X& p8 b5 D6 t9 {/ c
//                enoughDataFlag=0x01;1 S8 }- x! \6 w6 t3 G7 T& [; J
//        }else if(enough_data<50){6 q% y  q$ Z0 q# ]& _  O3 a
//                enoughDataFlag=0x00;//0x00还是不行
5 }4 ~! u% p/ m, g//        }
' s# F" O, U( H/ X/ @9 p4 Q  d! d8 N
6 q- l, N) P1 I  O- x
( L" S3 q0 Z! l+ U9 i) ~        oo=10;
" ]  |. t; F' Y4 W( G: D( Q        oo = oo  <  5;
3 i* c: l! q8 O8 e8 B' W1 J        if(oo){
( R9 @/ I' ~( |, W                ii=0;
$ p* r- q5 T  b: X" z( ]  r        }
8 ~* k$ l% i) F/ V9 s0 r& O        if(oo  <  5){
6 ]0 x2 |' r' y8 X                ii=0;  u2 J5 O+ v; h$ D
        }
% T+ W. S; ^: x9 e/ Y. R        if(oo  >  5){
: q+ F, K' `" J8 y                ii=0;" d" b9 V( V  b5 P. r. h
        }
, z" Y( k) r* v3 \0 o: {3 _9 J# A6 _$ l2 E: v; m( |/ H" l7 Z
        /*  save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
7 j2 X( b5 O1 v; n" F& {        /*  如果数据足够才执行主程序 */
- q" @9 F0 z6 S+ m        oo = oo  <  5;
4 Y4 `8 L- ]$ Q: P        enoughDataFlag = enoughDataFlag  <  5;
* D6 }# p1 H- `) O, R- Y        if (enoughDataFlag  <  5) {: U9 k$ b- c+ w, H
//        if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
& ^/ e- y# z! y                AGC_AGC(&pAGC);
) K$ T2 f7 I, ^6 m6 T7 z; W0 U! D& E) v/ e
                c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);- A% `2 r! ?$ J% c% L
                FIRDecimator_FIRDecimator(&pRxFilter);+ Y+ ]9 v$ M" w. J

% U4 U( w! h! W5 M: q9 I8 @0 K9 O                /* Downsampling */8 F. ~) _1 P. c- h1 Y
                c_SymbolSynchronizer_SymbolSync(&pTimingRec);
2 M+ r0 x) v( j* \9 z  ]
& W4 g! R6 i$ y                c_PreambleDetector_PreambleDete(&pPrbDet);- E# v! \9 D5 A2 K( R+ _
/ h$ O" E/ {) ?9 m& j
                /*   'Threshold', 8);空气信道情况下,把阈值从8改成7 */
4 v9 o" T7 P! v5 @) O+ ~8 f                /*  %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
1 R" V9 K" D" O5 n2 ?7 _1 z/ `                /*     %帧数量=100 */
2 m8 K+ Z4 ~  J' R0 o                pFrameSync.isInitialized = 0;
4 y* `0 T6 C- ^3 L' T  I. y) x, p$ u. x
                /*  [EOF] */
9 U0 e; i/ ^( f& Z6 K4 P9 s                /* 前导码长度是13 */
1 {' c( C) p  J4 x+ q0 f& d                /*    %qpsk */4 n; M- C) x2 Z2 F
                pDataDecod.isInitialized = 0;
9 p- k4 H0 t, u+ B& C% c& ]
4 B4 E; P) b4 X1 q6 C# w1 J$ E* x                /*  end */. f, D8 i4 |4 o
                /*     %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
" x& b, U& m9 q& r2 R                /* Convert 3-dB frequency */5 y' K7 W& O$ E# n" }! _- a
                /* Convert 3-dB frequency */
  Y3 z, W" c7 T# J* o+ R+ u                filtfilt(save_buffer, usable_left_filtfilt);) c; C5 [8 @& t1 h) U
                for (ixstart = 0; ixstart < 81000; ixstart++) {" s: ~* `8 \6 y
                        usable_left_filtfilt[ixstart] *= 2.0;
8 d4 Q3 N1 ~0 l                }
( R6 V7 @7 }4 c7 Z" g! L
1 L- o9 y2 ]# v: L8 V5 T                /* 注意乘2,处理幅度 */
: u: D# N, j4 A5 q! w1 Z! o                /*     %% 我发现带通之后其实就均值为0了,不用这一步了 */
% z' a- d4 f1 y5 x1 [! c9 `                /*     %% 行列转换 */
9 D: O7 @* R# q( E1 Y# [2 W6 e                yiDuanShuJu_mean = b_mean(usable_left_filtfilt);/ Q8 z8 t$ k+ s: ~4 `, H0 k! j
                for (ixstart = 0; ixstart < 81000; ixstart++) {/ `. O% e' g: I9 `- f
                        youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]" y5 d+ f/ h8 B5 n6 V
                                        - yiDuanShuJu_mean;) J) l) L' I% D0 h$ a+ H0 q! ^
                }
, y' L, {  y1 @' ~6 F' p; P8 O& k! O0 V: l- Y
                /*     %% 应该对数据归一化,但是这一步放在哪比较好 */4 o. l- v, J% r& U0 B
                ixstart = 1;$ x9 n: o' h; ^& W' \
                mtmp = youXiaoShuJu_QuZhiLiu[0];1 i7 V, \, y  G7 x: {
                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {' k6 u6 U1 D% Y  p" N
                        ix = 2;$ q$ N% R9 Q; g' |+ B) X
                        exitg2 = false;3 J3 l& M. e1 K# ^4 A, I7 l2 @9 _
                        while ((!exitg2) && (ix < 81001)) {
$ e( x/ \4 V1 e                                ixstart = ix;1 s0 k- _1 N9 p: T
                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {. W6 [; B/ R7 r0 M. k& N  O: F
                                        mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
6 \; V/ H9 W5 _4 J9 v; q                                        exitg2 = true;
3 H7 [4 H# G& }2 _9 p                                } else {
( V$ d4 a4 }/ v- W2 y                                        ix++;
% K- r+ E6 T( }" O                                }
/ i: g4 `9 W& O8 `                        }
% H  J5 n  R/ D. k* X                }
% r# U' k( g6 T7 [
4 F; m& K' c: R; T                if (ixstart < 81000) {0 [3 x" f. F3 u3 y/ \3 U, ^
                        while (ixstart + 1 < 81001) {6 `9 l8 n  u1 V
                                if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {. [1 t, b6 I& H+ C
                                        mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
4 v! [% o2 _6 v( B, W$ `                                }
. [! j4 l; N  R& a% |- g+ a6 G  f4 `5 L: i# R
                                ixstart++;% _5 D  B8 U: a
                        }
, p: Z; y0 J, L+ t                }
9 D' `1 l, E% ?
6 m# d8 _+ r, J                ixstart = 1;" W' p. ?* x0 e' d4 W
                yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];8 L; [, U2 `3 V
                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {( B2 w2 o2 ~8 b
                        ix = 2;) J6 |. b6 |3 y; z$ C
                        exitg1 = false;
, {# Q0 }% ^! j                        while ((!exitg1) && (ix < 81001)) {/ R/ _* m( f; B8 e# B5 Z3 i
                                ixstart = ix;
, T* g- V2 j# S& ]. c                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {, X% x- P! q4 T- a7 f
                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
2 r+ C* o, w% y) X                                        exitg1 = true;1 v0 u* D  |9 l) z
                                } else {6 V6 k" o" s6 [( g7 z
                                        ix++;, F0 _' h. [: M' C. c
                                }
  e8 T4 H4 t! r$ r/ O7 F                        }
/ U0 M7 a, J' B                }
8 G: I4 X. r+ y0 B5 \2 [
7 r6 I2 o6 O' j1 c; ]                if (ixstart < 81000) {
  V& \' o, F! X8 W                        while (ixstart + 1 < 81001) {
1 W- o# K0 S- T                                if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
. [2 W  M0 u9 L* a* B, _                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];5 U: y: q/ Y0 {$ `" I" N+ W
                                }
& ?& q6 m( N. k3 M% J
0 H: {, i# z! v, u" s                                ixstart++;
9 _6 U8 T; b5 E0 y0 d+ l9 V                        }) g5 P1 R* B6 c1 ?$ u
                }+ X  g# [( u* ?
& P% o% k- M2 I# J8 n* C% S
                yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
( Y  r( c3 o0 O                if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {* u( ]  h0 s7 ?( U# p3 x# M
                        yiDuanShuJu_mean = mtmp;
# a  t7 U6 @; x9 k+ p5 o                }
( d3 `& Z0 Q( O2 L" ~: C
* g0 |: D; r) [. ?1 _1 [                /*  找出极值 */
; ?; i2 M) |' g/ {, P6 D                for (ixstart = 0; ixstart < 81000; ixstart++) {
  I0 ?$ v% p* z! u/ R5 L2 l                        youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;. i, P$ B8 K$ G: |" `
                }/ G3 H8 e/ P# C' ^5 ]0 S- X
- d* O% i% {, g% U  J0 J
        --------------帖子字数限制------------------/ m- p* B, q* ~9 _# O
}* r! ?( `7 m5 x3 j9 l- q, Q* H4 X
3 Z/ }9 Q; Q* n4 v. K2 ]) x
0 `9 G; v4 m& L$ ]/ S. F+ c

作者: tenny    时间: 2017-6-8 16:37
会不会有其它并行的线程修改到了它




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