嵌入式开发者社区

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

作者: zhangsan1231    时间: 2017-6-8 15:50
标题: debug时程序运行的莫名其妙
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
, {9 d" h0 [5 K! X( R
# T6 d6 T$ j% G各位大神:! C! l9 i6 Y- g
     你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)# q2 m& r" z  R$ E" N: x. z1 M+ L
      我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:3 L5 u( u9 H' V
4 `/ q% N0 p* [7 f6 w# Y! H
     [attach]2441[/attach]0 o1 r' H2 O+ |
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
( W% g$ v3 x7 Z4 q9 D- R) t1 {
+ ]* y: r9 I+ e3 @3 U: U并没有其他线程. N( n, ]6 p3 G
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
$ k. k/ t& U' C9 j  U; |也说不定是和堆栈有关系。。。。。。* |( _5 W# o4 @! o5 Z4 R
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
  ~1 ]/ ^. ^- S/ i' Y[attach]2442[/attach]
. U2 A/ t/ V  J' W# n- h& g
+ G$ z* u4 g9 X3 p/ X9 Y8 p
3 i6 }; e2 `! Z/ h! Y* p, Y1 N6 i我也很绝望啊,希望大神能帮帮忙,感激不尽,!
5 k9 V# |( d" O6 A% _" m+ D  j6 e
" W1 _! ^0 U' ?1 |7 i6 L
7 c/ C2 L, b- X' E1 U附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组        static double usable_left_filtfilt[81000];2 W% [& d9 q+ c4 D2 K) I" ]2 W  E! A
        static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。6 U, v1 _- `2 t$ v& y+ |* z
- ^2 }% i. U1 W5 k3 `
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(/ ?3 P  _' B+ C: w; T- V! T  m
                const double data1000[1000]) {" g* t  @; ]* ?# P! f6 L

# l: D) H9 c3 V- p% @+ z        int myfuck;
1 s) y. e- k$ E6 C        double yiDuanShuJu_mean;4 I. [- F" j, ?! V9 U
        double yiDuanShuJu_LowMean[1000];
# X) q, X; L  |6 T. A6 {        int ixstart;
+ ~1 o% h  j4 R        double dv0[1000];$ Z! x0 ^: U1 k$ w, N2 A! g
        comm_AGC pAGC;
' U3 o6 ?: ?! P7 x5 `        comm_CarrierSynchronizer pFineFreqCompensator;
2 V) q" K1 A8 O6 B        dspcodegen_FIRDecimator pRxFilter;
2 q% M- W6 c6 g; }        comm_SymbolSynchronizer pTimingRec;. D6 i& ?8 a+ a8 y3 y7 ]6 J, `
        comm_PreambleDetector pPrbDet;
: g9 o" y% a3 F  Z; W' V4 z        FrameSynchronizer pFrameSync;
- d2 e+ J: v/ R$ f) v        QPSKDataDecoder pDataDecod;, n/ Q6 n) N0 ^8 e# G( [# q0 H( D
        static double usable_left_filtfilt[81000];
6 m2 O( |$ o' X( U6 |        static double youXiaoShuJu_QuZhiLiu[81000];5 {) N+ o  y; L6 a
        double mtmp;7 C, ?4 H6 O3 [3 U. o
        int ix;7 o9 ^: q' K1 }/ l
        boolean_T exitg2;2 S3 m+ ^8 `2 z/ }2 j8 ]6 \3 k5 P
        boolean_T exitg1;5 c- H6 Z% W5 K  f5 J0 [6 ~
        double YiZhenShuJu[800];
# C, |( m4 j6 Z3 _9 H2 I" V        double dv1[800];
/ ?8 W, a- K  t" t* |
0 l% d- p' k  ?9 \; P* m5 s+ m2 Z* V* `! g) J( G" j& y7 ]
        double b_YiZhenShuJu[800];$ ]8 G, D$ y& |
        double I_filtfilt[800];- i- Y2 W; m( d! Y
        double Q_filtfilt[800];
4 W  X0 V1 Y2 M6 b/ ]; O; d        creal_T b_I_filtfilt[800];
) {  O3 O( x- ?: J9 i        creal_T b[800];
8 X) {8 M; j0 m4 B, o        creal_T RCRxSignal[50];
- x1 v  Y& k9 q8 A. m        creal_T fineCompSignal[50];
- T% |) j; W7 Y- a9 u/ A3 c: r        double phError[50];: R1 L! w  [6 ?3 d4 M, q
        creal_T timingRecSignal_data[28];
5 Z1 ]. A! e( c        int timingRecSignal_size[1];
& f: r; B, N2 y5 u% `, c        double prbIdx_data[28];
7 ^9 m& Z  G. Q9 \' h        int prbIdx_size[1];
- h+ f% V. p1 X: R8 c% f) d! s. [        double dtMt_data[28];2 J9 f9 o0 t4 J/ z/ l. _1 ?5 k
        int dtMt_size[1];
/ ^3 @9 ?1 }! A        creal_T symFrame[25];9 r- E8 q1 n: A' M# D+ c
        boolean_T isFrameValid;5 ?$ o( Z5 L0 ]* [+ e9 }
        double unusedU0[3];8 H5 a# P. q3 O4 I7 j( x# S
$ Q: H$ v- Z, Y& O2 Q- x
        //调试过程中的变量2 m% J7 G6 I: T
        int  enough_data;) Q/ J* b# X( p1 S0 `/ q% M& |
5 }) @( ^& `$ \  Z
        int enoughDataFlag;# ]0 L+ Z" d, f" b
        int yiDuanShuJu_mean_int;
2 F; M% f) y' k        int int_sum_dv0;" I1 C1 G5 g' L/ M: e$ E5 R
        int oo;
: M9 \5 ^6 n/ B3 T- A. R        int ii;
/ O- F: e, Y) w: {$ n! D9 J" X        myfuck=10;
3 e# a2 f, U+ k6 |4 N% H3 l! s& L        /*  模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
+ ]' C6 D9 g) I+ [' R0 N        /*  考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
% E& L6 }9 v4 f' C  K$ H5 \* P3 }0 }* B& [: i+ C& V
        yiDuanShuJu_mean = mean(data1000);: p- X# ~6 x$ A9 S
8 P2 B* N7 Z3 B# K7 B. j' V, {
        yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;  e4 m' Z! v# P6 A) n" M
        UARTPutc('A');
2 c/ a* G! ~4 ]9 a2 Y7 \( R        UARTPutNum(yiDuanShuJu_mean_int);7 O4 I, ^, h+ I& s/ J
        UARTPutc('\r');
+ A# Z; D' O) Q0 @& w8 r# ~        UARTPutc('\n');
( W. [  V0 B/ z3 M/ i# J
; F; z* i/ |0 a* `        for (ixstart = 0; ixstart < 1000; ixstart++) {
# P1 [! c2 F8 k* d/ X                yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;, H7 y2 u. f# ]
        }
- F5 [( r% \/ W
* e; t0 w0 O; W# C: w        power(yiDuanShuJu_LowMean, dv0);
# B' q/ U6 q' S: Q  X4 M5 m% B/ p+ Y, j! h3 B0 [7 Q8 D
        int_sum_dv0 = (int) sum(dv0);. J  X" F) s. f) D8 X1 v$ k
4 y- a4 @: L# d; F
        UARTPutc('B');
# y$ ^! J- e" P( M: z! K        UARTPutNum(int_sum_dv0);
- G- J- O: m) s; ^1 d        UARTPutc('\r');
0 g' J, _5 X! e2 q4 m        UARTPutc('\n');
3 _+ B7 L: Y* }- I8 V
( A1 S# J1 e$ D//        int compareFlag = int_sum_dv0 > 1.0E+8;8 a0 P7 Y7 F' N/ C8 e! m
( r5 i4 B* m5 _$ j( Y! O
        if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
8 {# K0 W9 N7 j: w  E                UARTPutc('C');# `% q; W; g, C- E3 l+ N5 b
                /*  比较信号能量 */
( o+ R5 p) n8 I3 `4 C                /*          fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
$ K4 K# M& v: _* N- o2 S//                yiDuanShuJu_mean = 1000.0 * youxiao_k;
# _% ]1 J/ G4 V5 B' |$ Q//                for (ixstart = 0; ixstart < 1000; ixstart++) {* I. R( G- b6 d  v4 ^+ \  E& V( v
//                        save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =) P% d' }+ h# \, B2 T
//                                        yiDuanShuJu_LowMean[ixstart];
  D4 v$ M7 n8 ~* E1 Q9 N( E//                }
1 [: r& _8 D3 p( y//
1 D% R+ t/ M; |3 _: e8 m# l//                youxiao_k++;
2 d" k7 N- W! T& T//                if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
; y$ e7 X5 Y# [; u8 p4 D9 e//                        /* 感觉要取21个数,即0-20, */
0 l# x, |/ u- X# ~" k//                        enough_data = 10;//有效是10,无效是0: T" v. m5 a4 |( f: X  m/ B
//                }  l1 d- ~' o& u
        }7 w& I1 m6 B$ k. Q# I- L2 A

% O( E3 x0 U( Y/ Y! L
; p: M0 h- A0 J- E. ~# Q" a$ j1 @        enoughDataFlag = 100;2 l% o. P" ]' z3 F
        enoughDataFlag = 1000;- X: @% y; K) `+ |7 z1 N! S4 ]
        enoughDataFlag = 0x02;+ ~& Y/ w8 Q5 B6 l1 E$ T
        enoughDataFlag = 200;
8 U  z- V: Z7 K, E( V1 p
5 }) P5 i8 r+ L) b! ~" H3 ?- i        int myfuvk1;
# i' F* z. n, p) C$ @        myfuvk1 =11;* p6 X- q4 v- Y. f# z/ z  _) l

6 K) U" L* B8 a  v, V! |/ M- Q+ F0 h7 E/ m' |/ S8 N2 j
        enough_data = 0;
7 S7 C' x- T  A- D. F# C# Q+ H
//        if(enough_data>50){( U  ~& ^/ J5 J9 y. Y2 J9 j
//                enoughDataFlag=0x01;, U3 y) }9 x& D' s$ N# w! L$ w
//        }else if(enough_data<50){0 ~" ^8 ~3 r2 y/ u9 D! g
//                enoughDataFlag=0x00;//0x00还是不行7 k. n5 H$ v$ Q: x2 J
//        }- b- a6 L0 [  `& i$ J
0 Z2 p; T* r5 }  K: r6 i

5 T- s2 Q; ?2 i& a        oo=10;
) y1 {) O: q/ E  u- V! [        oo = oo  <  5;# }6 J& w3 Z- `6 x
        if(oo){! L* C& @: p/ A( U) `  [0 ^  i# t
                ii=0;
& h* V- T9 y) d9 u2 s        }% o  v7 C) D4 ?3 o( y1 h
        if(oo  <  5){  A9 P: x' _8 M2 z) B9 h+ W( ^4 x0 W8 ^
                ii=0;
2 y0 r1 N% w; H        }
( `  M, i2 x8 [5 h" F2 W+ w4 u1 v3 [        if(oo  >  5){9 K# O" [- p. V* y) g
                ii=0;
$ n- C6 _$ Q4 l6 v2 G        }  Q5 N- D' ?) y. G2 ?1 A  A+ n

: A0 }6 K) T5 J4 z7 C5 y9 Z4 k        /*  save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
$ E! H! p& @8 J. T, ^2 [        /*  如果数据足够才执行主程序 */8 _/ `% Z: v- f, o1 c/ J
        oo = oo  <  5;
9 z5 [& C9 c2 q' F0 s( y        enoughDataFlag = enoughDataFlag  <  5;  }1 e* [- Q; x% ]
        if (enoughDataFlag  <  5) {
$ A0 Z  j6 U6 U1 X# z, f//        if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0, g7 {" C8 {: q+ h
                AGC_AGC(&pAGC);
+ ?+ _1 \4 b$ p9 r* i
0 x& ?+ F4 j+ ?! c                c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);, Y+ j" ], f2 p6 W" Q2 ?; E6 N
                FIRDecimator_FIRDecimator(&pRxFilter);  W# u/ W8 }  m* A3 _; s4 Y6 S

$ w4 A4 m; M! ]$ `7 h! r* P                /* Downsampling */
: w3 v2 C/ T2 T* D/ v                c_SymbolSynchronizer_SymbolSync(&pTimingRec);; }! B9 J" t) S2 v. O$ `" ?
* O# M$ H. I7 H
                c_PreambleDetector_PreambleDete(&pPrbDet);# f$ J" g1 t2 f) v4 H  T1 E! W

: F2 v9 R! k; ~9 n+ v& {, _4 q8 i8 @                /*   'Threshold', 8);空气信道情况下,把阈值从8改成7 */7 z$ W3 ?6 K, k
                /*  %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
. k5 i3 Z/ D# `) |+ W5 R                /*     %帧数量=100 */5 }' a, ~( w9 E
                pFrameSync.isInitialized = 0;# E" K/ ]9 {* O5 h8 f) k9 m7 ]4 |

- i/ k/ q* R3 y. J- V$ l                /*  [EOF] */$ W  o1 `) o  l! M5 j3 I9 J4 c  t& Y
                /* 前导码长度是13 */- D# v( \7 w' o- A# l
                /*    %qpsk */
) e$ y5 L/ r. p- O                pDataDecod.isInitialized = 0;* k& b6 R* _/ a
* l; k, z/ r4 p/ x& f5 g
                /*  end */7 z* `1 e3 p4 y- E
                /*     %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */( _2 y0 S' D. f, z
                /* Convert 3-dB frequency */
, h: W8 \% }# w                /* Convert 3-dB frequency */
+ z% }% X& n; s6 ^' o* ]; ?                filtfilt(save_buffer, usable_left_filtfilt);
9 v- O% I0 f% k7 m0 D                for (ixstart = 0; ixstart < 81000; ixstart++) {
% f. p7 e8 V) C                        usable_left_filtfilt[ixstart] *= 2.0;) r% z+ C; H, S2 ~7 G/ P
                }
( v. s; O& a6 H
9 L# ]- W" k. b; n! y- c8 R0 ^                /* 注意乘2,处理幅度 */, F+ O* \  ^" X" a) R
                /*     %% 我发现带通之后其实就均值为0了,不用这一步了 */
! Q7 m2 Z0 I/ {* c                /*     %% 行列转换 */
0 x& ~- c# ?2 X. D! ?0 `, _9 ~                yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
* ~1 U& ]+ F4 O: D! K* E                for (ixstart = 0; ixstart < 81000; ixstart++) {
+ K5 z" _% s  f/ y  [/ w                        youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
% O- G7 q4 ]. _( e# N3 }                                        - yiDuanShuJu_mean;
3 B$ q# K8 C! s! n( q/ h                }1 C2 J: ~; V7 X% o

6 K  P- L- j, T" w+ Z7 g                /*     %% 应该对数据归一化,但是这一步放在哪比较好 */
$ y) I1 C7 o; v& p4 H                ixstart = 1;
4 z9 x1 q; p/ v) q                mtmp = youXiaoShuJu_QuZhiLiu[0];- w/ M) K7 g, c8 N+ i' l( d
                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {. K1 I& R$ s! V. I4 m3 I& Q; U; F
                        ix = 2;
3 F+ V9 G; K$ W1 K+ V                        exitg2 = false;
  n$ n* T+ {9 R' V                        while ((!exitg2) && (ix < 81001)) {6 N1 u7 D) o. w4 r  J3 a* r- `) a/ ?
                                ixstart = ix;6 c6 v4 }+ i5 r
                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {6 L' W3 T/ W3 U- e8 c4 Y
                                        mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];: c8 U! Y- \3 W( y! v/ V  _, g$ e
                                        exitg2 = true;" e, u, Q+ Y6 L5 ]
                                } else {
) S3 g# M4 Q* ^9 P! q+ n+ \9 j- K# f                                        ix++;  |; l, h& ?; l' G8 t7 @
                                }
' s/ k+ n0 c- Y                        }
+ f! B6 {/ `! J4 ?( R                }
$ B' q4 d+ b. g1 r! U$ K' q: K2 j$ s5 ^) ?
                if (ixstart < 81000) {* l! ^  \0 [& o+ c, ~1 `/ R
                        while (ixstart + 1 < 81001) {
+ L6 W6 N+ H. T0 R                                if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
9 F. h0 k$ N: H- Z' j" I3 r: Q                                        mtmp = youXiaoShuJu_QuZhiLiu[ixstart];% A, A  ?6 g3 M5 p# L0 ~5 A
                                }: H& q( m* `, m$ E/ }0 R

, N' N* w2 u& a! _1 Z( d7 l! x: u6 D                                ixstart++;* m0 X5 ?: y# ^
                        }2 u. y- ]/ Z2 j+ z$ D
                }) g5 i1 q3 v  \1 U

. W2 T  _' A3 y                ixstart = 1;4 J* ]: f5 y- C8 j
                yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
3 ]' `1 t; k& g: m, M' h                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {% N# w& O! D  D! M: Q
                        ix = 2;
$ ]2 T5 j1 n5 M3 X                        exitg1 = false;/ {9 o0 L1 V4 ?0 P; v; k
                        while ((!exitg1) && (ix < 81001)) {
+ T8 J5 T, r* R, B                                ixstart = ix;
4 Z1 L, g. c8 d8 m* e1 ], V+ f% [1 v                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {0 E0 C0 i% V; L* a+ b- K
                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
  K* y$ C) n6 L                                        exitg1 = true;
& [  d  m) \" E8 ~0 X                                } else {
  A6 v! w, {6 N. p! T                                        ix++;9 w! F) ], b& i5 o3 R0 W6 E6 j' P
                                }7 [8 I! v  p, K, a
                        }& M: B& @4 A: f" P
                }! q  O" j* }: M5 P& T. G9 O% `/ B
+ Z3 \4 L. h% c  r% m
                if (ixstart < 81000) {
. w& p* H$ U: B+ x8 u7 H: j  \1 a  A                        while (ixstart + 1 < 81001) {
* @. V* l, E8 x7 n- v+ A+ [" x                                if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
: O  w% |$ n0 B                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
. v% ~* u( |  ], H* B, W  s! J                                }
- c0 R) a5 ^9 W$ R- O% f/ r7 f1 H" c( Y& ]2 E
                                ixstart++;
. @! u4 d  C. ^  ~                        }
& `$ c& ?0 K9 I, x* n                }% V& `- x! E( s# [9 q" |* A" F

4 m$ C6 V: V3 c" o                yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
, \+ J2 I2 [, x                if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {2 M+ k! T* {6 F  Y
                        yiDuanShuJu_mean = mtmp;
! s* ^  h# B9 a% Q                }+ d/ v* z% R( V

! i- Y0 r4 p5 M" [# A                /*  找出极值 */
9 ~, P# _. g. h  c% n& K                for (ixstart = 0; ixstart < 81000; ixstart++) {7 A+ T. `, t3 V
                        youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;( d. J+ C5 R5 l* T9 |, z
                }
& {, _0 g7 ^6 `
; n7 U  I& ]- r- Y5 L7 L        --------------帖子字数限制------------------
: W+ |) t" i) I2 a9 x) m; g}. w0 a! Q1 K! Y+ v
( D5 L  J. Q* Z1 y9 ?9 j# H

; y) a, r" r3 c4 y- ?
作者: tenny    时间: 2017-6-8 16:37
会不会有其它并行的线程修改到了它




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