嵌入式开发者社区

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

作者: zhangsan1231    时间: 2017-6-8 15:50
标题: debug时程序运行的莫名其妙
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 ' B, B" u, ]( I, L
7 p, h; K1 V) |1 v- V8 G$ z* \
各位大神:
! D- m. y  z) f; |7 i     你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)- \  Y6 j6 g+ U  N8 I3 y
      我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
3 l. b3 y& |. g; P& ^
  u& V& R) Y  d3 |, W$ c, m) h+ \     [attach]2441[/attach]( J9 ?) D1 d, ^' `* H0 v
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。% w! u6 I' k. U' N. \0 p0 P/ S

/ H, j1 A  Q+ B3 Q并没有其他线程' n/ U) v. h9 k2 O/ x/ ]7 R
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。7 _! ?5 w  J: r& j) {
也说不定是和堆栈有关系。。。。。。
5 E( _' n; N  h. w7 G. e请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
9 |4 W/ Z9 @! l$ b[attach]2442[/attach]
  J9 y4 d% M, S8 ?
0 V0 U9 q! Q( m8 r) U/ f
9 F4 }  h& _* x6 ^! t$ m1 c我也很绝望啊,希望大神能帮帮忙,感激不尽,!5 C( S: @( e& p0 `
& U0 Z4 f  x7 N' W3 d

, k) {2 w9 Q( D5 H9 @+ N' ?. ?+ k8 e附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组        static double usable_left_filtfilt[81000];
6 p) m% z' B7 {, _  G5 H: L        static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
9 E' ~- o0 w! I
0 ]( F' l1 x4 U( Y! N7 hboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
$ @+ t, B; Q- Y2 j# I                const double data1000[1000]) {% [/ P4 W) M% s; E+ L- w$ I

$ W" S7 Y3 w) [  Q, A4 I        int myfuck;7 d% e  b" I" K7 C- w0 q( o
        double yiDuanShuJu_mean;7 |3 c0 o" u" `
        double yiDuanShuJu_LowMean[1000];
0 s3 q& i& i$ u! h% f# L7 c        int ixstart;: Z. g$ v3 T% e" h5 W
        double dv0[1000];
; y( p5 I+ _' v7 h        comm_AGC pAGC;
8 H, A/ W4 b9 \        comm_CarrierSynchronizer pFineFreqCompensator;
4 G7 g6 J0 K- E) _$ h  V: H        dspcodegen_FIRDecimator pRxFilter;( o4 C' m2 ]) V, R. s" r
        comm_SymbolSynchronizer pTimingRec;
; P' [' O; g0 `        comm_PreambleDetector pPrbDet;; ~/ w! w1 @9 `3 \0 Y/ r2 O
        FrameSynchronizer pFrameSync;- I5 z; |4 f5 z- l0 w1 Y  V2 U
        QPSKDataDecoder pDataDecod;" ]5 Y/ y8 ?/ e1 u
        static double usable_left_filtfilt[81000];7 W# G% c9 ^& x
        static double youXiaoShuJu_QuZhiLiu[81000];
, B( {  S' T* @$ B4 Y$ I6 O6 e2 }7 p        double mtmp;
& S3 ^( r5 o& p        int ix;; `( C7 ^- p) A) i2 `
        boolean_T exitg2;
  z- i1 k  Z) K( p+ W        boolean_T exitg1;
. D! P+ }9 z+ R        double YiZhenShuJu[800];. y- L5 O- x; Z
        double dv1[800];
# Y! M1 O" J' j2 e" {) f- j; @6 s* O8 Z
+ g1 u3 g6 Q8 D  t2 F
        double b_YiZhenShuJu[800];
  R% M3 Z" A# R        double I_filtfilt[800];
9 p/ |( K2 ]) S7 G4 Q* v; g        double Q_filtfilt[800];) Z& Y  o) ]' F9 K% L1 k
        creal_T b_I_filtfilt[800];
. ?; n* p6 @' a+ n        creal_T b[800];8 `! y$ a5 D) t. M
        creal_T RCRxSignal[50];9 s, M; y# d5 D( p
        creal_T fineCompSignal[50];
- r  i, L, e- I+ [        double phError[50];0 Y9 J4 O! L# t6 T
        creal_T timingRecSignal_data[28];  P; g! Q6 E0 z& M$ Q% l
        int timingRecSignal_size[1];
  j4 T) e. |5 S        double prbIdx_data[28];
: K6 w% |7 n4 d1 p8 f        int prbIdx_size[1];, y: }8 U" {/ e$ I4 `/ b' b
        double dtMt_data[28];
6 |8 c4 }& @9 S+ r6 G: H/ \6 i( A7 U        int dtMt_size[1];  V: [' Z; R( Q8 N. T. N5 l
        creal_T symFrame[25];
* j2 k3 E6 l* K5 j4 _  I        boolean_T isFrameValid;
8 `% G8 s4 a3 n( U" b0 `        double unusedU0[3];
* C% t& l. _5 k4 l3 V; P/ }2 O4 f5 o6 i! X) G
        //调试过程中的变量
/ c: b6 O0 y2 a& N2 @3 N        int  enough_data;4 ^( |' w: V1 y8 I  \  f, `
. o. V3 L1 m0 I! Y
        int enoughDataFlag;+ U7 S& d2 F, f7 d
        int yiDuanShuJu_mean_int;
( |2 r, r, v: O# S        int int_sum_dv0;
5 h9 [' R: G! y        int oo;3 g0 _* q6 R- b1 l( ]3 q4 Q) h
        int ii;
1 X. q' P( K) H        myfuck=10;1 Q7 i$ @5 r9 B- h
        /*  模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */+ ~1 Y1 ~0 `1 o; a; C- V' a: A
        /*  考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */3 v+ W2 e" Q1 P9 L1 \& Y' h. g
' l. Y, w; C- f' y  }9 m% K5 i
        yiDuanShuJu_mean = mean(data1000);
" j8 {+ a+ q! J$ k2 P1 a  C$ U/ x0 U  U% h  ]( K7 u' _$ h( _/ @
        yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;% d. }3 n9 @2 u7 j! }5 ^1 ?' l" L  Z
        UARTPutc('A');
" A% E8 H) @4 g7 M        UARTPutNum(yiDuanShuJu_mean_int);/ V& r0 _* S2 O- Z! t: p3 [
        UARTPutc('\r');) z, q. `% K0 d7 V  a; g
        UARTPutc('\n');
) [3 V) _/ y; A  f( b
$ R6 ^; s+ r; y$ i' y) Q1 R$ e7 F        for (ixstart = 0; ixstart < 1000; ixstart++) {6 a* E& d7 D; H8 ~: z$ d$ n
                yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
" Z+ {8 G& s2 j3 y# ^- r        }( T+ z+ v/ E& k7 g0 L( e

: N6 a3 n% H( J1 j- Y        power(yiDuanShuJu_LowMean, dv0);
. y3 \' m( r7 l7 C3 E, S1 A; ?8 W3 U- `; K
        int_sum_dv0 = (int) sum(dv0);
/ a& f1 a8 l1 P+ J9 j/ I
1 d' @( Q9 o3 w$ \        UARTPutc('B');
  b. Q5 i, d* u( B0 `        UARTPutNum(int_sum_dv0);' Y; z. K6 l. E, A* ~
        UARTPutc('\r');1 U/ H2 q- {  W
        UARTPutc('\n');
. z, A$ ?7 G! C( `, S( s. C2 `" l" R- m
//        int compareFlag = int_sum_dv0 > 1.0E+8;! O! `! [' o+ i' E* Z/ G5 [
+ }$ Y4 f% h/ U; M; x4 p- j0 T/ @$ p! Y
        if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
; r! w% j' N: l0 j                UARTPutc('C');8 f" o1 Y. H% ~+ |6 n; W
                /*  比较信号能量 */
! {6 y* X, x9 X, r                /*          fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */- h5 ~  I6 M0 R$ y; H
//                yiDuanShuJu_mean = 1000.0 * youxiao_k;( r, l+ z7 \# O" m) x, G* d
//                for (ixstart = 0; ixstart < 1000; ixstart++) {
/ i+ V+ `$ U3 u//                        save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
0 C8 b+ T3 X4 A//                                        yiDuanShuJu_LowMean[ixstart];) N' h; m' j& |# D* ^
//                }
7 M* R$ b3 N5 C- R//
: K: W6 q8 R. w# e" B//                youxiao_k++;9 P0 E) t5 a* d/ O
//                if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
5 q0 b: F' J9 I( T. F+ g//                        /* 感觉要取21个数,即0-20, */
  K: L- Q; ^* p0 M0 y' O; w//                        enough_data = 10;//有效是10,无效是0( L2 S8 U- a# Y9 p
//                }
- y* c" L, O, p, T        }
8 O) ?: p# m2 |; |2 O# F* f& j: R  j7 k# X+ P, Q* J0 X: K, X
: x- X/ |3 K* Z3 B0 E$ ]! g
        enoughDataFlag = 100;1 A/ Z1 F3 ?& o7 N
        enoughDataFlag = 1000;! ?! S, _0 ~4 T
        enoughDataFlag = 0x02;4 ^8 j' d2 b: Q
        enoughDataFlag = 200;
- n- k/ L* N, c" {; T3 H' X  S
$ {8 v$ ?' |. X) d- D  J        int myfuvk1;
, y$ `- z' G; B7 E        myfuvk1 =11;
' V' ^6 C: ?7 d( T
; J" O7 Y5 h; p( `' L( A. B9 Q  L/ G/ G9 ^6 V
        enough_data = 0;7 D3 H$ }& z/ P& ~. H) ]3 B
* r$ r+ M# x' \- T
//        if(enough_data>50){. t% t3 V0 ]; A
//                enoughDataFlag=0x01;0 Y& P9 e+ x  R5 t' [. z
//        }else if(enough_data<50){1 M, Q7 H1 \2 ?' F8 q5 s
//                enoughDataFlag=0x00;//0x00还是不行8 C" x4 H2 F  c8 u! |
//        }$ a8 F% u" h5 q

: Z! o: {: y' ]2 F: k
0 @) n( @5 j7 d; g/ N3 Y        oo=10;: H2 @' N, m1 D' N* E
        oo = oo  <  5;/ V' Q8 l& c( R. h$ O2 }
        if(oo){# X$ E( {- m, [
                ii=0;* S( a/ P) V4 a8 X( |
        }
/ o- B$ M9 Q# Z3 r# m/ i" K7 a        if(oo  <  5){
+ J/ _+ m. f) Q9 ~' n( s. r& p                ii=0;1 L2 _% K8 t$ Y2 r
        }
8 o4 m. f+ D  }- L- b        if(oo  >  5){
/ B* e% H; M; X5 f. r. P% w                ii=0;9 q. R. P6 X. ^& Z) L  r& L; @
        }8 S  K4 ~# i- x9 v# \
! x4 h  X! P; |" d+ v* ^/ I4 n: z
        /*  save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */! l' x( T1 _, U4 u' {
        /*  如果数据足够才执行主程序 */6 h, J, t) q% }
        oo = oo  <  5;* a( t3 y* x& x4 u: ?/ ^$ j! v
        enoughDataFlag = enoughDataFlag  <  5;4 n. B* D0 V7 D0 v. A
        if (enoughDataFlag  <  5) {3 G0 u* @  n5 {7 q: X$ H
//        if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0* [" Y1 F5 A5 |
                AGC_AGC(&pAGC);
' K2 ~/ C6 e) Q+ D- v* H0 ]4 e; q+ x& K5 o
                c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
7 I+ Z, X5 ?$ r, L2 \                FIRDecimator_FIRDecimator(&pRxFilter);
' P8 z$ o+ d4 e! I( J/ X" g! Y8 j, j2 @3 u/ z
                /* Downsampling */5 q# \6 o: e+ d. }
                c_SymbolSynchronizer_SymbolSync(&pTimingRec);, Y5 v2 V5 a# P

5 }, `- g( @& j2 N0 z1 N                c_PreambleDetector_PreambleDete(&pPrbDet);; J% ]3 }, K- U' p2 G, l% ]
  W8 D; o# Q7 w$ T! ^) {$ e) e- f
                /*   'Threshold', 8);空气信道情况下,把阈值从8改成7 */: X- H* }5 T0 m- [' I- y! T' d
                /*  %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
4 V; L9 I" U) h' A- r+ I8 K' J                /*     %帧数量=100 */" B9 b8 _9 Q* r
                pFrameSync.isInitialized = 0;; y0 T2 J: d5 f2 v  V7 j5 E
0 q0 B* B8 Y6 e; g
                /*  [EOF] */( d3 I8 A8 A8 o8 M" s* Z) [, h0 F9 U0 X
                /* 前导码长度是13 */; I/ K- E7 M6 n5 D9 A$ p- ~0 R
                /*    %qpsk */
6 ^7 n! ^0 s, c+ C7 W                pDataDecod.isInitialized = 0;
+ G$ l) D% \3 _1 ?7 Y) D! \
  W. f) }3 D0 x2 d! F$ o6 R                /*  end */+ u; [4 ~4 h0 `0 B% t' {
                /*     %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */+ E3 k7 `7 M# b0 f' u
                /* Convert 3-dB frequency */% j6 @/ S) B& F1 ?* n/ W3 q  y6 V
                /* Convert 3-dB frequency */. Z- z( t4 H6 Q
                filtfilt(save_buffer, usable_left_filtfilt);
! _8 O. v; c& R- l- y) T- L                for (ixstart = 0; ixstart < 81000; ixstart++) {
+ k  p/ T  C+ g; p) I- l& q( w                        usable_left_filtfilt[ixstart] *= 2.0;" Q: m: V, N3 T: {; {( M
                }
5 H: L" L  Y9 w( S; ^+ O* m
$ ^) v% t" j8 E  Z- q. p                /* 注意乘2,处理幅度 */% k  g! d( y% r: s/ @: A3 a
                /*     %% 我发现带通之后其实就均值为0了,不用这一步了 */
; y  G7 {$ I- Q9 x2 t) a                /*     %% 行列转换 */: h# R5 M6 n" r) S
                yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
3 F+ f3 B& W+ _- V0 d                for (ixstart = 0; ixstart < 81000; ixstart++) {. m* }& J5 T; U
                        youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
! {. I# b- w: ]& D# ^# `                                        - yiDuanShuJu_mean;3 `4 {7 O0 K9 J5 b  _
                }
# E. g. J# l1 _, b# Z' k' C/ [) G
  P7 a" \: |' t  l                /*     %% 应该对数据归一化,但是这一步放在哪比较好 */
  ?( N4 Z1 S. [3 ]2 c* Y) c/ c+ i                ixstart = 1;7 i* e+ B  W" K. F4 f
                mtmp = youXiaoShuJu_QuZhiLiu[0];
8 N" Q" |) |/ ]7 u" j: ^" y3 }; H                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {0 x, [* w4 l/ v
                        ix = 2;
5 M$ G7 Q* j7 x* T2 q0 b2 q                        exitg2 = false;( F6 N, {1 B2 W2 r
                        while ((!exitg2) && (ix < 81001)) {
& G$ A/ p6 m2 z. R. g                                ixstart = ix;
: i4 d9 ]2 T  w" Y3 |0 ]                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
* S2 P% w" t7 p  a4 c. a                                        mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
) k9 {3 P: g4 [4 A0 a0 z                                        exitg2 = true;% W) s1 b* b4 S: {7 G
                                } else {, g% W  P" D! w" W  `
                                        ix++;8 Z, J9 y7 o2 q6 {
                                }& O( `% R+ |/ A. @
                        }5 [- W' ?* e9 j. T. ]
                }
3 v1 v% _- x- n: a8 u, z5 x- X" Z9 a$ l
                if (ixstart < 81000) {- U+ d8 }  I# v. X9 F
                        while (ixstart + 1 < 81001) {  C2 s8 s! [, u% z; J
                                if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {  _4 {% m; n9 P4 z
                                        mtmp = youXiaoShuJu_QuZhiLiu[ixstart];6 O, W  q2 o9 h5 T' K1 y
                                }
+ u2 ?, }+ v+ W4 ^% t, B5 B
! @1 X( @; P, v  J6 V( H3 F9 b                                ixstart++;3 h. V4 t8 P& E7 b9 j  g
                        }  ?3 W0 f; M, X' }+ |. U+ g. ^$ C
                }7 V4 P% W% u- v- i" ~3 m

0 C$ [2 }7 N3 A9 E8 m" Z+ j4 ]                ixstart = 1;
; t, y0 p5 i0 S) S0 h                yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
0 N( s3 I. I; u) |+ P/ [+ ]                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
) W3 g! T& x8 T" j  Y, l* |3 J! h                        ix = 2;- O2 d* M2 A4 N* V! S& f8 _
                        exitg1 = false;
9 T1 m0 R& F4 W- x+ }                        while ((!exitg1) && (ix < 81001)) {! T& S( h) I8 v: ]
                                ixstart = ix;
' l  L2 o1 X. n- O/ e0 _4 e                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {, T& m) ^+ S0 j; E
                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];0 i; X* n# R$ e! s- h4 O
                                        exitg1 = true;0 ]2 ]% e- O. k
                                } else {0 @) G4 X, D% [" l9 g
                                        ix++;8 X1 U7 P9 _+ [  w0 i6 T6 t
                                }$ Q1 C) ^: e6 c$ T3 @) t
                        }4 _& w3 N; o& r
                }
  b$ ~7 ^/ v+ p- v7 n# B
, {7 h. x; M/ J) }                if (ixstart < 81000) {+ Z0 Q9 S4 j# s/ \, U: a
                        while (ixstart + 1 < 81001) {1 W% v3 L3 x+ h+ [- j
                                if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
; O  b! l8 X& f# `                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];4 s: Z' ^% P  v( f! k' U+ ?/ m, ~
                                }
# p+ h% Q2 y% H/ I1 `; S) B5 v% ?6 ~. M5 Q, H8 K5 ^/ b) H9 H
                                ixstart++;
, h* Z1 N- A! S                        }
) ^' j, v& S& _+ n2 ]: d                }
, ]2 q# p4 w/ T4 H0 y+ g# G& J1 @* N6 {* v
                yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);. g& P# N; v2 T, z1 ^
                if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
% A5 h8 D9 P& `+ m7 n) r2 L" w                        yiDuanShuJu_mean = mtmp;
7 t0 s. \5 J" z                }" C& N0 Z; c3 j
/ M4 h" \3 }5 ]
                /*  找出极值 */
  @1 }/ M, q1 J                for (ixstart = 0; ixstart < 81000; ixstart++) {
& X- o% [; w0 U8 i                        youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
# L3 F- N. ~  ^! N7 O8 i6 R                }
. @6 K7 I( k3 j- ]) b7 N* t
. C' L+ Y; W+ P% z" c        --------------帖子字数限制------------------
* [2 B% _8 G$ F9 j' m' x4 h}  ~9 p& D4 E: q( X

3 L+ M% v2 z6 E' t' q+ y- [( ~8 Q
0 t9 i  C5 ^$ T* ~# F- ]! {
作者: tenny    时间: 2017-6-8 16:37
会不会有其它并行的线程修改到了它




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