嵌入式开发者社区

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

作者: zhangsan1231    时间: 2017-6-8 15:50
标题: debug时程序运行的莫名其妙
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
  H! }; g! u7 j( o$ Y5 }5 v$ g& }, }* _7 _1 R4 o/ b: W
各位大神:1 j7 d+ Y+ n$ M! g! N' B: k
     你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
$ v0 A: d6 M. s( f# X      我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
. d; Z. V/ X* m- r' Z* C
% b8 X) N  {$ j     [attach]2441[/attach]! }/ N5 u7 q' p, r8 U6 g
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
% d- p- c' [' ]" T2 Q& y% S. n) q3 @+ y& {5 v, ?1 s
并没有其他线程! o! U4 C# ^$ Y$ H+ U
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
4 v7 G' I1 ^8 D6 V也说不定是和堆栈有关系。。。。。。5 h, p6 i4 g. j+ d/ v  f, x
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....; C% y$ p6 R6 s* k
[attach]2442[/attach]( S; C* v) B& r" j. |7 B* I; P7 }

  b/ Y8 V8 w5 w* B  u! O6 T/ J* u' Z; M) q' H0 @
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
: v8 t4 e. H( e3 c: x; t1 D
8 \$ ^% j" `- @: _9 g! I& |
( r( M& s# j" D# [6 J5 a3 {附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组        static double usable_left_filtfilt[81000];
9 J0 U! M* l# Y# R+ `        static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
5 w( n; p# ]3 N
0 [$ D, r, N: `! Z! [boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
9 w/ j" G: {" K8 A7 G) E( @# Y0 l5 u                const double data1000[1000]) {/ d0 q4 Y: i% }4 y, F& p7 B

, n8 [% k" Z6 W4 A        int myfuck;* @2 T8 Y2 M# s# a. m  y9 w
        double yiDuanShuJu_mean;
0 V2 ]$ x, _6 k4 o; C        double yiDuanShuJu_LowMean[1000];+ `+ z2 r" v, d) D1 K  N
        int ixstart;
- ?# Q7 X' u# s+ N        double dv0[1000];
8 u' d+ z+ n3 h8 }8 a3 l+ X% a        comm_AGC pAGC;
1 }, E9 t9 {% B9 w        comm_CarrierSynchronizer pFineFreqCompensator;
$ c1 {% x8 B% F' F- Z& ~        dspcodegen_FIRDecimator pRxFilter;$ V4 l% K9 G2 r
        comm_SymbolSynchronizer pTimingRec;
- B, p5 @+ o) v7 U' i0 r        comm_PreambleDetector pPrbDet;
" Y, ^6 k1 n( l; J; \1 P: b2 h6 \( @        FrameSynchronizer pFrameSync;
( F8 U7 n6 i( Q5 i- K6 ~        QPSKDataDecoder pDataDecod;8 g5 h4 d2 k8 a4 a6 [- `. H
        static double usable_left_filtfilt[81000];
, I" e4 D6 i8 D) h6 E! Y4 j        static double youXiaoShuJu_QuZhiLiu[81000];
! M0 M& \8 L/ S5 j4 y        double mtmp;& P2 T3 b( |: D# Y
        int ix;
! {- V, C& ?+ p, F1 s        boolean_T exitg2;( g& o8 J+ p5 L& _! }5 k
        boolean_T exitg1;
9 w7 m9 [' ~" W' J0 m9 k  f! k% E6 l        double YiZhenShuJu[800];( Y0 A1 V6 N8 R- q( N
        double dv1[800];+ i/ O8 c0 u' k/ ^

: x* {2 g; P3 l  m4 N8 }- y
# G" s8 e& b8 O/ F/ j  e        double b_YiZhenShuJu[800];3 N9 g& n, h6 A" U
        double I_filtfilt[800];, M: U+ l6 v% t, y
        double Q_filtfilt[800];8 o; t& N* f4 y" i# b+ H& b6 g
        creal_T b_I_filtfilt[800];
' N" d9 h- a& K5 o        creal_T b[800];
' W4 U) |) ^: Y" U% ?6 v) f& |        creal_T RCRxSignal[50];
: I9 _: [' L1 b        creal_T fineCompSignal[50];
- y; N% g4 y! [" F+ B) b6 f# j        double phError[50];
' D( F  Y0 o" A- e' ?+ y        creal_T timingRecSignal_data[28];
& R1 X9 }6 ~& A6 B  r        int timingRecSignal_size[1];, y- D/ _7 [9 @$ H5 Z
        double prbIdx_data[28];
; x% ?7 [% X2 o2 X( ~+ t" ]        int prbIdx_size[1];: d- M$ K, z3 v! D, `6 I) p
        double dtMt_data[28];
3 [. F1 ]& c! p4 n8 `8 w+ B        int dtMt_size[1];( y2 s: C8 U: [5 [
        creal_T symFrame[25];2 v: s* c! y* ^$ {6 X) I# h
        boolean_T isFrameValid;; c& c1 b5 Q! b6 ]7 U+ s5 U+ z# K& v# B: _* q
        double unusedU0[3];/ i7 \9 R3 \9 K* p5 f% c
) t; H0 n1 x3 s. w( r" {6 s$ |: g4 j
        //调试过程中的变量' s3 F+ [! P* j7 ^
        int  enough_data;9 J. p& S4 ~6 m6 |5 y& k4 ~! L

3 h" v8 p; X8 j' u& x        int enoughDataFlag;) x4 y; O8 e% N* d4 f" d
        int yiDuanShuJu_mean_int;6 n! |. z0 w: Y; p/ O2 t2 d* A
        int int_sum_dv0;
5 N. T- z8 }3 S+ B9 m) N- h. C        int oo;  ]- q+ m- t2 W: K* L2 n3 _" L
        int ii;4 _6 O' B# |' ?" l) Q. i
        myfuck=10;/ a; c! K: P6 W$ R2 P  `& m5 Z
        /*  模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */% V* {: F& R& P; A" o' {
        /*  考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */# c1 {3 M9 d" Y
* ~; M( V5 P% r, ?
        yiDuanShuJu_mean = mean(data1000);2 x) O: G) Z6 D6 h0 C9 J
. ^& d0 O# X# A0 A) m: X
        yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
/ c% E& L$ ^7 O( a! g. o0 M        UARTPutc('A');
1 @" [* \7 @0 {% U  b. @* Y) I        UARTPutNum(yiDuanShuJu_mean_int);5 X6 U! k: h- B5 ~# m; ~
        UARTPutc('\r');
  T" c4 x4 b5 U- u        UARTPutc('\n');7 N, ^. X/ |+ e2 e9 ?* D! r$ p% T# b

& R# P# S/ L) @, V7 h4 c. O& V7 C        for (ixstart = 0; ixstart < 1000; ixstart++) {! k$ K& x: S$ k- _" y6 m
                yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
  z# `: X3 m% ?  t/ j% V' Z' C/ ^        }
' y. D+ N0 `9 C0 f4 t  O  t( A, z- w" W  }4 `7 o) _% ?
        power(yiDuanShuJu_LowMean, dv0);$ p" B4 z# x  P1 M! Q; x
5 g/ \+ N1 m3 k8 h9 x. o
        int_sum_dv0 = (int) sum(dv0);
& ~5 ?1 ^% a5 l: }- f5 f# O
+ e: a$ u# [$ [        UARTPutc('B');- q4 _' p3 Q& ?% z: |$ }
        UARTPutNum(int_sum_dv0);! C$ a+ e! h4 f: _
        UARTPutc('\r');9 I: v+ v$ B: T6 `2 ?$ u
        UARTPutc('\n');
5 @' @- U, a% Z: a
; L5 i) m2 _' q4 `0 W3 t//        int compareFlag = int_sum_dv0 > 1.0E+8;
' h" ~$ X& u+ n/ P% n. ]; S$ n5 ?: a+ q" H& f; J
        if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?  w' G/ r" u: i1 x
                UARTPutc('C');
( n- V4 d9 k& n! @- T: \: T                /*  比较信号能量 */% @. A6 t3 ^5 U5 d: B
                /*          fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */6 V. M% o- B3 z2 T- Z
//                yiDuanShuJu_mean = 1000.0 * youxiao_k;
7 I2 {% m9 q# L  B) a0 j! V, u//                for (ixstart = 0; ixstart < 1000; ixstart++) {
9 Z; q: A# `, ?$ f- v# H//                        save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =! W- _8 k( f8 N' {) g* G) `" j
//                                        yiDuanShuJu_LowMean[ixstart];
4 P" Z/ i1 X1 u  O//                }
& t7 m3 y5 ^& o: t% a//0 |) U$ P% S/ s+ C9 R# f4 p
//                youxiao_k++;$ t7 h: V0 y& L) J. ?8 S
//                if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
% D4 b8 l1 H, a$ @//                        /* 感觉要取21个数,即0-20, */: x. `+ t- ]% L
//                        enough_data = 10;//有效是10,无效是0
. e/ E0 f1 l/ P& u2 V+ V) F//                }
: z# q" x8 O" b        }5 Y" E  B- k% C! w
* I( s  ]1 B) o3 o/ F

2 y$ ]/ Y# L% n9 o, h% Q6 ?3 K  }        enoughDataFlag = 100;
7 b% W7 F7 r, j& A1 a+ H        enoughDataFlag = 1000;- H5 J& f% X& w6 Q, l; b  n1 k  \
        enoughDataFlag = 0x02;
: f0 {/ r' H/ n$ D& }! a$ M7 y        enoughDataFlag = 200;9 ?; t2 ^# l2 l' P; e

- o. }& @4 z  {1 _2 Q& {$ A# p7 X3 ~        int myfuvk1;' ^" G# q& m( _4 q$ U
        myfuvk1 =11;
  x% {9 H' ~4 V1 \: K* d# l- e$ f2 T3 n4 \
9 i' `0 t$ @) k) l# Q# o7 C3 j6 Z
        enough_data = 0;
7 b; A6 a8 @' q' A! R. T- u. y6 q. Z9 q- H; H/ I- ], |
//        if(enough_data>50){
' N) t$ v: i% t# h! E: U# e& H//                enoughDataFlag=0x01;
& n/ }. C( [" }& _//        }else if(enough_data<50){
" M( }; J4 o# R6 u; A7 O//                enoughDataFlag=0x00;//0x00还是不行0 J" u/ ]( \+ ]* d- u1 v0 W- T* N
//        }# j, ~2 d/ v" d8 L  b/ O$ @9 Q  U$ ~

" E) K' g  e& S# m
2 f$ e) w) v1 j0 f; m& n4 _        oo=10;
4 j% e  S: X, t: e8 q5 h3 Z, g        oo = oo  <  5;% p9 ~  x8 b# j# {) t
        if(oo){$ k& j3 Y* B" m
                ii=0;  q, G7 E' C3 ?* L
        }  A# |8 u9 t, u- W2 V
        if(oo  <  5){7 N, b. q% H* Z
                ii=0;
# ^+ R5 d3 C+ I1 H' C        }
6 `3 A, k& c5 C: Z        if(oo  >  5){8 N1 e; j/ \; t4 y+ H
                ii=0;
7 @3 ?# }) X8 N0 Y) z        }8 W% y7 |5 w1 @. k) d7 q

& i, E! K& d( g+ K        /*  save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
& {2 G( k1 [) j4 e3 j3 {4 m2 r: f: F3 B* _        /*  如果数据足够才执行主程序 */! S: T6 i& N& M0 p6 B  h& ]
        oo = oo  <  5;
% j2 H7 P$ n  H        enoughDataFlag = enoughDataFlag  <  5;
8 A; O  w3 y/ y( [4 r) B- U        if (enoughDataFlag  <  5) {
$ V7 C; t5 F0 E) Z//        if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是03 X3 Z$ A. I2 N. `2 v# y4 e3 O
                AGC_AGC(&pAGC);
2 r4 A' S( c( ^8 Q- o4 E; r  H; ]; x& S/ A0 F# R/ g/ f
                c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
, ?2 j8 {2 d, c6 f                FIRDecimator_FIRDecimator(&pRxFilter);
. U6 X4 [% s0 s9 Y9 c
6 [3 F5 U7 e$ k% u' Z, ?4 S                /* Downsampling */
) y5 r6 Y( E& ?) m: V, ^. F                c_SymbolSynchronizer_SymbolSync(&pTimingRec);% e2 J- i6 A! r9 X$ s

- C. Y- i6 R+ @; O                c_PreambleDetector_PreambleDete(&pPrbDet);' o4 z7 L# z0 ~! D8 }* R
, D* s& l& [5 e- z' w$ R' y6 H2 X
                /*   'Threshold', 8);空气信道情况下,把阈值从8改成7 */
+ G9 X6 ?* R2 p  ~( ]; u                /*  %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */. B4 c4 C0 S8 ~# {2 e. {5 x
                /*     %帧数量=100 */: W' s9 n; I; |9 D9 n9 h$ f
                pFrameSync.isInitialized = 0;8 r. ~$ W- ^+ q4 D: ?% s# {, P4 |

/ {& G7 W( N9 `$ x                /*  [EOF] */8 U# n5 L* y* h1 V' t
                /* 前导码长度是13 */
2 G2 Z) b/ H1 ?: c+ Q                /*    %qpsk */3 }2 S5 ?  A3 m# R
                pDataDecod.isInitialized = 0;
# P8 I& o. z5 T% V  P2 ]! r3 _
  l. V1 x' N  }+ t+ A                /*  end */, G2 T+ b  q" R+ C% H: V# N
                /*     %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */0 i: E0 W, l1 C  Y0 n' v
                /* Convert 3-dB frequency */* U8 E4 F  W0 u- Q' |
                /* Convert 3-dB frequency */
' {3 |  p, q  n$ g7 D                filtfilt(save_buffer, usable_left_filtfilt);
' d, e$ z" ~- C$ [! N                for (ixstart = 0; ixstart < 81000; ixstart++) {) E3 }, A' g5 H8 C2 L) }. a
                        usable_left_filtfilt[ixstart] *= 2.0;
) d" N; h. e* S% }4 ^0 m                }, v) R, u- g, g& U1 }0 z& Q4 k

8 @* k$ ^0 d; q8 r! L( w                /* 注意乘2,处理幅度 */3 n* r# q' Q: A+ \) @9 u0 X
                /*     %% 我发现带通之后其实就均值为0了,不用这一步了 */& o0 I, f" `% Z
                /*     %% 行列转换 */8 U- a, y+ V$ _9 T' z. F5 [
                yiDuanShuJu_mean = b_mean(usable_left_filtfilt);; O  M8 H( N- g) ], u
                for (ixstart = 0; ixstart < 81000; ixstart++) {
  C3 h4 U$ q$ ]& @: R9 d) Q                        youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
# Q' b7 G1 ?& _- v8 t                                        - yiDuanShuJu_mean;5 N1 B& s% f/ F# P
                }8 @. H) c" M+ l5 v. d7 t

/ [/ R$ w+ k7 k; j* Y! w  @                /*     %% 应该对数据归一化,但是这一步放在哪比较好 */* f, t5 R, I& u4 H
                ixstart = 1;
" ~% }0 L0 z' q/ q- W                mtmp = youXiaoShuJu_QuZhiLiu[0];
' \) Q1 _  I2 ^- J                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
8 P& a: ]' c5 D& @  Q0 t% W                        ix = 2;
* n& P+ x6 F1 j2 s  O4 C) [                        exitg2 = false;# F, g0 x8 U: A: t, N% s6 ?
                        while ((!exitg2) && (ix < 81001)) {7 Q5 }- X8 O  A! W6 P# M: t: w3 F  G
                                ixstart = ix;
: X- I. h5 j5 V% }: J$ W                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
- s! O& V0 e) g                                        mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];" N9 E& x. g1 ?! H; X- }4 b
                                        exitg2 = true;& ]  v& k( X3 u0 R& t
                                } else {% a) j, l# O" S: A2 T
                                        ix++;8 X. P  l% ^) Z+ a# c
                                }; ^0 i( o% Z/ L0 O
                        }
& t- t& a/ v: ~2 K                }2 ^; G: @4 d) c! J1 ^+ w4 `
) n" W) B$ B, q4 n" C" {! M9 g0 g
                if (ixstart < 81000) {
4 f8 C9 ~3 `, P: v                        while (ixstart + 1 < 81001) {
0 V  S# j" _( |- S$ ~2 Y" }7 y                                if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
! j) N; Q1 g) E5 b2 D                                        mtmp = youXiaoShuJu_QuZhiLiu[ixstart];& s! h5 l! U9 V
                                }4 n6 t8 t3 p' U# Z7 W; G

. [2 j9 }, a9 q% X& @, y                                ixstart++;
  B2 v8 H$ Y8 X, C9 S0 Q                        }
' P- u! o& B& O, x! T) l                }, m" \+ v6 C0 Y, q& k, E% p" j
9 O1 t7 `& A4 N+ V% D) d8 o% ]/ g; }
                ixstart = 1;6 k9 \, Y! `3 K7 A
                yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];; ~( b3 l$ Z! [: f$ V
                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
+ ~) ^/ a2 n9 t) Q* F" g                        ix = 2;
. v7 u7 ?* P' J  f. k2 }                        exitg1 = false;
+ O# B- ]" N! ]1 L                        while ((!exitg1) && (ix < 81001)) {
2 d# v7 `. ~3 Y5 n' t6 o# L                                ixstart = ix;  d1 m' |9 u; t# d0 {% x0 W5 J
                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {- T: b/ {- s+ t  c2 }" \3 o# O
                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];3 y/ ]* f) f. j5 C
                                        exitg1 = true;) P. `4 Q# Y4 S6 `% b8 F* f( v
                                } else {) [6 G  I& ]! _3 m7 }" _
                                        ix++;5 q6 x  M1 K0 E1 y- E
                                }
3 t3 ?/ B; E  }. P. [* c1 ^0 g$ N                        }
. E6 P7 p: Z3 S                }
7 K' x/ y. I6 |0 q
: m5 z! ?. i+ D4 F                if (ixstart < 81000) {* \, `5 p* \# L
                        while (ixstart + 1 < 81001) {
6 E6 |6 E' ?# {                                if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {8 w, X! W+ f; k6 H# \
                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];% s$ R) `& ]( ?! {5 c; c# T
                                }. S8 h& t3 M" B- y9 g9 r

8 r7 Y) t6 |2 d3 Y                                ixstart++;3 k  B6 w+ K; V5 y
                        }0 I6 x! ]7 U3 P2 c9 \8 v
                }4 S. z& ~1 C( ?

3 p& t( H7 {% W" E6 o+ Z                yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
$ p; o# ?8 n0 ]9 U' ?7 y                if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {# S4 c) Y0 _+ s( T8 G1 _+ `
                        yiDuanShuJu_mean = mtmp;# ^, c6 @" o$ q2 V) E- L7 q5 B
                }+ X& z$ Z: `& E, a" g

/ M1 }; k9 b1 l% J( W                /*  找出极值 */; d8 F' n1 @& X( \) D' A
                for (ixstart = 0; ixstart < 81000; ixstart++) {
2 O2 J$ B6 k* B2 T, q                        youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;, B- |- [1 h9 b4 b
                }
; I* @, v( L$ D. C' L  G/ i  x( p7 i& Q# p" s; ~
        --------------帖子字数限制------------------
8 ~) a1 _# Y; A}
$ e6 c6 ]1 z, @  _
$ z( O* `0 L, W
$ J2 \, e! l% i* ^1 k* a. F8 j& o! Q2 B
作者: tenny    时间: 2017-6-8 16:37
会不会有其它并行的线程修改到了它




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