嵌入式开发者社区

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

作者: zhangsan1231    时间: 2017-6-8 15:50
标题: debug时程序运行的莫名其妙
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
3 j2 O$ U/ h# f1 d! k) |1 G. Z3 V* M
各位大神:( K- u( J3 N: ]
     你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
* V0 |. |- C# L) E      我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:- t7 y5 `3 Z+ p$ b' f, p
0 }. t0 U' k7 _; Z+ \  b/ j
     [attach]2441[/attach]% n6 z) t: W% T* j( K
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。3 Y8 i, {6 j7 H/ w2 Y2 n
3 L- ~. v% f6 C7 v
并没有其他线程2 _* d5 M( {* P9 t' H1 Q
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
- k$ v) ?& ?0 T2 i也说不定是和堆栈有关系。。。。。。
* d, q1 I9 a7 o/ s请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
3 \9 t) y5 e/ {. C, w" K1 y& P[attach]2442[/attach]2 q8 q2 U7 T/ v4 c0 |: X5 c
) I/ `, g: |" J8 M) k0 W

. R% [) [% ?3 g1 w, Y  }9 ~1 {我也很绝望啊,希望大神能帮帮忙,感激不尽,!4 _/ z# `/ |  R5 u8 i: p, w
; j8 o6 [% Q) J5 R5 }

6 m+ Z, e8 s- [附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组        static double usable_left_filtfilt[81000];" ^" J6 s" U/ Z; p/ C1 @
        static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
! Q" y1 N# Y, p- p2 V* b6 q  s7 W& G5 r( ]8 ^* c1 `5 Y% I
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(4 W; h8 e& R% A9 D8 d" a8 ]
                const double data1000[1000]) {" T% v$ ?; X8 q  v$ I% M

7 O2 o5 b' M0 U; r! t        int myfuck;
6 g" q! X/ G$ }1 O        double yiDuanShuJu_mean;# n* ~- d  M, F/ A0 m1 X
        double yiDuanShuJu_LowMean[1000];0 m+ e/ K2 U4 z! L
        int ixstart;
& I2 b2 X* p+ G1 e4 J: V        double dv0[1000];+ x9 J5 O# R  m
        comm_AGC pAGC;$ I+ a. i% @& A$ m4 {' W5 G
        comm_CarrierSynchronizer pFineFreqCompensator;
* g% Z+ b) u, Q3 S% s( y        dspcodegen_FIRDecimator pRxFilter;
/ V+ F. ~  I5 Q6 j& ?9 C$ s        comm_SymbolSynchronizer pTimingRec;+ l2 {6 w) U9 q% Y
        comm_PreambleDetector pPrbDet;
9 j. I$ L+ J' G& @; V( y! [        FrameSynchronizer pFrameSync;4 L- z0 _- |9 o$ O' S* W/ u, |
        QPSKDataDecoder pDataDecod;, V( z$ k, U! L& W
        static double usable_left_filtfilt[81000];
% m, h) ?# I% I' L7 {        static double youXiaoShuJu_QuZhiLiu[81000];9 s+ \- D' e% ~& |
        double mtmp;. {5 i; D! c0 [. M! B9 n& r; G8 H
        int ix;
" x' x8 Y" o& o        boolean_T exitg2;, Z2 f5 |# k3 `8 D3 E
        boolean_T exitg1;
- t& b" m1 Y  ~2 f' k        double YiZhenShuJu[800];
4 F2 a4 L' w# o5 X        double dv1[800];3 I$ d* i% H9 |7 q7 j

, }: _2 z0 D; d2 e2 o+ R, a! }0 \, w% q) m9 f' z; R8 t
        double b_YiZhenShuJu[800];
% C( x( n; ~3 Q6 o% p: e+ j        double I_filtfilt[800];- F1 H9 v# S5 \& L" J8 J
        double Q_filtfilt[800];" l' T9 Y7 n" e/ O! P. w! A
        creal_T b_I_filtfilt[800];3 L, {+ k% l4 P* E1 x) ?1 Q& ~
        creal_T b[800];
) p! p0 Y% W5 T' j/ E4 \        creal_T RCRxSignal[50];. k9 B9 m! @8 z- Z) _" y1 D5 R
        creal_T fineCompSignal[50];# F. \1 Q) s8 g* R- C) |1 g& y
        double phError[50];
( [3 P5 M8 j; D6 h        creal_T timingRecSignal_data[28];2 u. d+ I( W! r9 M. J& a
        int timingRecSignal_size[1];
- \/ I2 t7 F+ `6 O& G, \        double prbIdx_data[28];
8 t  h0 V9 U% `        int prbIdx_size[1];* O3 R$ q/ x' r, @3 F& i7 g
        double dtMt_data[28];" c) j7 Y- v" b4 L  Q
        int dtMt_size[1];
" ~- U. D4 ^5 A        creal_T symFrame[25];
8 w( j9 P! q/ q! u. Z        boolean_T isFrameValid;/ R) }' u3 h2 W* H( W0 v4 M! q& a5 e, b
        double unusedU0[3];
; y* r, T& u% f: i! U6 J1 L# T) a; w8 `& t% R: H0 }
        //调试过程中的变量3 Z% {. W/ W- e/ A4 K7 f0 F
        int  enough_data;. X6 z& ]+ n& J% n' {0 t9 {

; y. V2 S  K# G8 Q; H# [, u        int enoughDataFlag;
0 P/ s' w4 ?( Q6 O3 p3 K7 C: t  O        int yiDuanShuJu_mean_int;
7 l. L  A. @; V  x+ A        int int_sum_dv0;
$ r( q8 O! Y/ W- r7 L5 g        int oo;4 Q) |' }; c5 h) \1 ?$ l4 I1 u
        int ii;9 ^1 Z' F1 Q7 N( v) @  M
        myfuck=10;
4 ~% W- y3 G. }7 e        /*  模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */0 b! r0 l& q% G. m
        /*  考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */7 t# _5 U+ c4 x( d
: T8 v/ x8 {0 W$ h9 X! }. z7 k7 r
        yiDuanShuJu_mean = mean(data1000);
! T) r/ I4 ]4 l* L, b$ ], @( @. F" J  i5 s( }! e
        yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
9 H: b% `; [! d' c/ v        UARTPutc('A');1 g; ?5 B$ F& B
        UARTPutNum(yiDuanShuJu_mean_int);
6 `( U& |5 R3 k/ I        UARTPutc('\r');# [! Y, {$ n5 S( _. Z
        UARTPutc('\n');, j- r: d4 ~9 m: ^# H8 S
* D1 |0 P- z* L
        for (ixstart = 0; ixstart < 1000; ixstart++) {
4 x5 w" l7 D2 P- Q                yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;: N/ ?# }6 d5 Z& O# p2 ?
        }* ^; ]/ k  G5 Y( k# L, U, G

. A  \1 L+ {8 c8 R5 d+ F        power(yiDuanShuJu_LowMean, dv0);
- P8 B# _6 m2 j* O/ ?3 \
- k( d# o4 t  l' A" l: b        int_sum_dv0 = (int) sum(dv0);
4 w2 p3 j; B0 I# t+ S& x  f' [" c! U0 b6 A3 {
        UARTPutc('B');/ {* H4 n9 {$ R, y
        UARTPutNum(int_sum_dv0);
$ x! c: N$ A6 `+ q) X2 ?* g        UARTPutc('\r');
, H2 S# b8 M' y6 y1 Y2 H        UARTPutc('\n');
9 A6 w! [3 n, y& Z  U3 b6 c9 a
. ~/ q) G1 E) i: Z) ]//        int compareFlag = int_sum_dv0 > 1.0E+8;8 i# ~6 d2 t. h9 j9 X
* e/ p+ ?# F  K- `% i
        if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
8 @7 L' Q9 g% c5 R: r. f                UARTPutc('C');6 S- J$ N/ v7 ]" ?) o
                /*  比较信号能量 */
6 _0 L) ^( o& I- B! ~                /*          fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
* c. q; `* }( E1 n1 M+ c//                yiDuanShuJu_mean = 1000.0 * youxiao_k;
- |! M# X! S8 u& W) _//                for (ixstart = 0; ixstart < 1000; ixstart++) {
& g: S3 z* e) X0 d; `# u//                        save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =) D5 k* h/ H2 x3 E, ~5 y. u' U, t
//                                        yiDuanShuJu_LowMean[ixstart];( S9 w8 j4 j4 K! V2 O7 `& ^1 R
//                }
* @7 X3 B! w# X* n$ W/ q//
8 D$ ^  a0 S  X$ X//                youxiao_k++;
3 i0 {8 _" m4 G( H! ?, x//                if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
& p9 \/ V% M% T1 c//                        /* 感觉要取21个数,即0-20, */
0 S- n: b6 Y4 a* t//                        enough_data = 10;//有效是10,无效是0' t  g- P; G5 C) C, M2 S" Z$ d) w
//                }
+ W( y: p* L' Y- J8 p        }: G+ \/ h, J4 W& R! @7 }8 p0 f

2 ]! W0 f+ ]9 E" G3 Y& h2 |- `' E9 Y# P
        enoughDataFlag = 100;. Z8 k4 j$ U3 M! c. S- T: L& w
        enoughDataFlag = 1000;, ^! \8 q" E" c
        enoughDataFlag = 0x02;5 S7 K" o" w* R2 K$ C
        enoughDataFlag = 200;) ]$ @/ U# Z7 n2 `" |+ m% |
+ h: [2 ]+ a( \- K. j; V' ]8 M
        int myfuvk1;
' f. T% O# e, g6 q: o  ?        myfuvk1 =11;9 |; i$ X6 r. w0 H$ ^# Z- c

* K: N: ^- x& M4 `: c
$ \1 J! S( j0 U3 R, Z2 u0 Z# {        enough_data = 0;3 B# C5 _/ t4 \9 H
! r( c1 y/ l& r/ Z9 G
//        if(enough_data>50){
9 ]/ G! H3 d$ M! h1 o- a//                enoughDataFlag=0x01;. }* _3 ^5 K4 f7 N9 |9 v* [( m
//        }else if(enough_data<50){; @- c1 R/ p( Z2 }
//                enoughDataFlag=0x00;//0x00还是不行
# [; K5 o- x; \3 p//        }
3 p  s7 [4 v- s! P' j
' ?+ W6 S& r; C2 \9 ~) _! F
6 D$ Q0 S! C5 i* V$ g        oo=10;
4 `, S* W1 X$ M& Y        oo = oo  <  5;; `) H& ]9 n0 E2 r7 A9 Z* f" b
        if(oo){' d4 j8 R5 L! v; p7 D9 H3 ~% k
                ii=0;6 b# C% I2 |- S' M. Q) `
        }/ \0 A# t7 A  u# V/ ]) `
        if(oo  <  5){' L8 ]# p+ j  T- \  A8 [" f4 _$ E
                ii=0;
# r( I8 o( ?4 f, \+ d( E2 O: c. M        }
4 p3 l1 W4 S' c7 X; ?        if(oo  >  5){
* M0 W1 @) e! Q- e  C* ]                ii=0;5 x/ f& n; Q) i+ O
        }
6 [7 z7 y0 z; n7 }- i. z  D
' [& ?6 r: S0 y8 s" E! s6 A; J        /*  save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
* P; F1 E' N% \- K. c) R8 T9 a- X        /*  如果数据足够才执行主程序 */
$ D4 |3 a# E: x1 s5 Q, V        oo = oo  <  5;
0 k! z8 {. A* i/ S        enoughDataFlag = enoughDataFlag  <  5;
  V" K: T5 h8 [# C        if (enoughDataFlag  <  5) {
& M6 \* `) I! f" \//        if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0# t4 C. p8 I0 `! @! |. h. k8 J
                AGC_AGC(&pAGC);
# [- n0 g" H& w1 q+ z# Q6 Y# |* V! _. g
                c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
: t$ f3 \6 m1 b                FIRDecimator_FIRDecimator(&pRxFilter);* ~0 n' u& B; z0 ~
+ f1 P; w- S6 M% d5 N
                /* Downsampling */
+ J/ X" Z$ y7 a" v2 V                c_SymbolSynchronizer_SymbolSync(&pTimingRec);. C! r# L! o* ]2 N5 o

8 b; ?  M( W# L( }% Q7 C3 n8 m3 N                c_PreambleDetector_PreambleDete(&pPrbDet);- i6 ]: l4 N( q2 Y( Y# P% N. {

& p. s' \$ T; G! g& j                /*   'Threshold', 8);空气信道情况下,把阈值从8改成7 */0 `$ j  h! J2 q/ ^! G8 U9 i
                /*  %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
6 v1 ^; A3 Y" s7 C                /*     %帧数量=100 *// Q4 X& |9 _1 Z5 g/ c9 S' V4 ^
                pFrameSync.isInitialized = 0;3 R3 G* Y- ~3 |. \1 l( }* M

- E7 j% d1 X3 W* K4 ?! Q  j                /*  [EOF] */- Z3 C. V+ r5 k- S- T7 J
                /* 前导码长度是13 */6 @6 w( ~6 ~1 O3 ]
                /*    %qpsk */" r& i. U6 W* g3 C4 O* b2 ]% u
                pDataDecod.isInitialized = 0;4 k- O) m5 L9 H& z

0 J% u0 P2 V4 Y% X& X2 R4 \; G  c                /*  end */$ p, Q7 [8 _  t2 @9 I2 V) d" e/ g
                /*     %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */( A" M, ~: G1 i  ^# B6 x
                /* Convert 3-dB frequency */& R% e/ Y! q) i' v# c
                /* Convert 3-dB frequency */
9 z( J; ^, D+ H" q. c                filtfilt(save_buffer, usable_left_filtfilt);
, A$ J8 O" c; @2 K$ ~+ F                for (ixstart = 0; ixstart < 81000; ixstart++) {
7 s6 \3 Q6 v. e                        usable_left_filtfilt[ixstart] *= 2.0;
! @( X! T1 T! I8 Z# e                }; u5 J4 c( H3 M7 R( B8 `; R# R. p

4 }5 H2 |/ [8 w1 F                /* 注意乘2,处理幅度 */$ `" q! X, k, M3 M( u) ~0 v6 P
                /*     %% 我发现带通之后其实就均值为0了,不用这一步了 */! T$ {! K1 l1 f8 u! ~
                /*     %% 行列转换 */. k/ w' Y, ]' b7 g8 c
                yiDuanShuJu_mean = b_mean(usable_left_filtfilt);0 u; @' \: [7 I* R6 Y. ]
                for (ixstart = 0; ixstart < 81000; ixstart++) {$ {: f  Q; r% J: y3 }5 q' \& y
                        youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]/ }# a/ L0 J* B0 v+ V+ `
                                        - yiDuanShuJu_mean;
* X8 n  h" f( E4 M                }
8 e% W2 q+ X& A+ n: H# Y+ P: M+ I8 q6 `; y
                /*     %% 应该对数据归一化,但是这一步放在哪比较好 */# {! Y0 c2 H3 p9 T' B1 B
                ixstart = 1;
  i' I3 H- R! m# Q/ b, y                mtmp = youXiaoShuJu_QuZhiLiu[0];
& a$ s6 }# ^1 G, E. e                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {3 i1 }( u  G& n) p4 U, Y
                        ix = 2;
# H/ @" `- W3 ~                        exitg2 = false;
+ P/ t  `/ [, z7 t1 P: X+ v1 E                        while ((!exitg2) && (ix < 81001)) {  o* @3 w* v$ E
                                ixstart = ix;
5 v0 ]% i! W7 l, W! u                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
: ~3 q1 T8 }! y! K                                        mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];# _8 |+ C7 j2 ~( y
                                        exitg2 = true;
: H" m, e  e( I' c3 B, h( I                                } else {- n9 [7 j0 W$ I8 z% t# ?
                                        ix++;/ B( z" D; U: ^: B
                                }
! S6 E" i$ E* a2 t4 V                        }1 r9 |, x8 B3 D  K  p; Y
                }5 ~6 W; @( Z4 D
5 ]. R  y5 w$ t, y) r  K9 K7 ^
                if (ixstart < 81000) {$ i, \5 V5 s  z- I) l
                        while (ixstart + 1 < 81001) {* s! {& F  `3 u" N4 W$ T
                                if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {8 T8 N, e9 }- ?
                                        mtmp = youXiaoShuJu_QuZhiLiu[ixstart];' Z3 E) n( Y, i# `: V
                                }
* I/ P. e; ~, E# ]* v
- Z& E% F8 h" e' z                                ixstart++;
, V- h/ B& K. [" a- z                        }
8 v" @. ^8 h6 d$ L- v/ N  L* |4 C                }
' ]1 |  p# J- S! j% y
5 n& ?& n1 r2 A: T3 s1 K2 ~$ o  d                ixstart = 1;2 g. O) n: j  h5 G
                yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
' j+ K* a; o; ~+ N) i" Z4 Z! y                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {1 s# u! S3 H2 [2 s1 T
                        ix = 2;1 _" f8 E/ w% m$ E4 }& K8 z. W
                        exitg1 = false;
6 F5 }6 `' P' C8 t# e9 o                        while ((!exitg1) && (ix < 81001)) {
) @9 U& V+ B6 n; G. P                                ixstart = ix;
7 z4 }. T! t% R                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
4 Z$ ~, _0 C! S8 z" D                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];0 C9 x) ]7 O3 O& Q$ \
                                        exitg1 = true;' o! V6 L/ b3 ?" f* h! m
                                } else {( Y% G2 W5 Z7 E6 B% J6 v$ L
                                        ix++;' q, o. ]) V. |- D0 h9 ^/ C
                                }6 h7 T: ~0 m: ~/ `6 _* L
                        }+ f4 Z- q; b7 q3 n& u
                }
1 d7 p& l5 H3 h+ k9 o7 _. p$ \6 G( I; @, E6 Z& T
                if (ixstart < 81000) {- f0 b! q9 B5 s/ T1 m# B8 E/ e$ V3 w
                        while (ixstart + 1 < 81001) {
8 v: E' {% S% o& @& c9 d                                if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {7 z% C& i8 B! ?3 r& F
                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
1 ^/ b7 }- `" e2 U5 f$ E                                }
/ O& S- f6 \( Y+ Y
6 {1 ]' u! K0 g* M                                ixstart++;
& f4 V; O( D. N- u$ a4 \3 X                        }: a$ G; l8 n! ~# l- ]
                }
" a0 T! t6 S6 o! Q: b
# c5 M2 v" |) X9 w0 r                yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
) b2 S5 o0 Y6 ]8 s& n+ L                if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {! T5 z" `) i7 b: r# Y, W3 X
                        yiDuanShuJu_mean = mtmp;
6 B) l5 _" A1 Y- k5 U0 c                }+ I+ a% F/ j: B# f8 X- L
+ K6 i+ j. @7 g8 G8 B
                /*  找出极值 */
9 [- C/ ^  ?9 e, n, h. M0 H                for (ixstart = 0; ixstart < 81000; ixstart++) {
' l! p& Z. f: l8 ?                        youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
$ i" O. u* v/ H8 P; D3 s                }$ W$ _8 C" _8 t( ]/ V

! y: Z( C7 u1 r5 H, j        --------------帖子字数限制------------------5 ~* p2 _. Q8 c; B% L% ^
}7 a# u% h& `2 M& _2 ~; c! P* c+ X7 a  T

* \3 t; G/ d1 j( {: S
2 ~6 n  K4 g# g4 v7 [* c' f
作者: tenny    时间: 2017-6-8 16:37
会不会有其它并行的线程修改到了它




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