嵌入式开发者社区

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

作者: zhangsan1231    时间: 2017-6-8 15:50
标题: debug时程序运行的莫名其妙
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 ! v) p# n. `4 a. m8 b4 G* X
) A8 R/ [0 u" V' l5 |- [
各位大神:
0 T/ S3 K6 a* F5 M$ E     你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)0 r, g, w" y. `2 [
      我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:" Y: T) M  r8 k: @/ \" \0 `

2 |, d) j# ]: c$ J' |+ A! |2 d8 r     [attach]2441[/attach]
- x8 K9 I4 Q; `7 l这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。; D0 ]. H4 M' m8 J
1 U  p: @( M4 B; ?$ x
并没有其他线程% n' i% I7 H; c; Q6 _) f
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。/ P& J, l+ a4 e0 t, Z( Z
也说不定是和堆栈有关系。。。。。。
. C. l& `" z( \4 U3 o6 {请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....) }, W# `5 Z& x: n9 R8 D
[attach]2442[/attach]
7 `; e2 k' e! S& F/ X# R; a  V' c' g
; U. n) X7 e* r/ U& s
7 _  {9 r3 O2 E! \' g2 R8 M我也很绝望啊,希望大神能帮帮忙,感激不尽,!' b, h! Y+ W2 D- a8 z" S
4 V- o9 _9 i( d& y' M1 v; B

7 S3 Y# r/ t- J* Q! d- }- z附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组        static double usable_left_filtfilt[81000];
# }+ U7 Q8 p9 H5 {' n& n        static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
" N% v, f0 w  B- }# ^& r* z3 r" d' j1 ]
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
* O" \" ^/ g: U3 x+ z5 S                const double data1000[1000]) {. W: Q$ ^/ A# T) M1 P' I  a

( v: G& v3 a9 w8 S6 d$ b5 H# t        int myfuck;+ |4 ], P& c# T5 c6 b
        double yiDuanShuJu_mean;6 F; t' N/ `; n$ _6 W
        double yiDuanShuJu_LowMean[1000];
" C7 a7 P& g1 O0 [4 w$ ^. R' [        int ixstart;
# t4 L3 M/ \5 A( k* Q2 q' y  n        double dv0[1000];( i  ?  {+ H7 @' M( N. s
        comm_AGC pAGC;) u: S( y1 g( ~. d& [/ M8 H- h; W
        comm_CarrierSynchronizer pFineFreqCompensator;6 n/ T  v& G0 B* C4 h% o7 }
        dspcodegen_FIRDecimator pRxFilter;
! V) j& L* [/ U: H1 P        comm_SymbolSynchronizer pTimingRec;+ }2 d/ z$ a6 j9 y3 t% B
        comm_PreambleDetector pPrbDet;  Q1 m: K7 R1 Q  n4 w
        FrameSynchronizer pFrameSync;$ H7 z% G+ A/ ]; ]4 K$ `
        QPSKDataDecoder pDataDecod;
0 p) h; ]) U4 p. X2 `        static double usable_left_filtfilt[81000];
  D$ ~" i9 B! V) W9 N/ N$ n0 _4 _# B        static double youXiaoShuJu_QuZhiLiu[81000];
. ^$ e6 O$ B. H; E) O3 x9 E* p        double mtmp;0 F( b$ z9 Z6 s. l; L# A4 s
        int ix;
" G/ k  j; p4 L! ]8 r; g* t        boolean_T exitg2;* h% z* r, B7 y% [9 v$ E6 ^' u5 O4 d3 G
        boolean_T exitg1;
  m5 T$ t( I; d( O1 `* `        double YiZhenShuJu[800];9 J  I+ T( V% J3 W! H$ ^( v  }8 r- k3 ?
        double dv1[800];
0 I! ~4 ~& R- F7 @. N- `, T2 q: j& ~* D- E9 j

0 e: `) {4 x4 g3 G        double b_YiZhenShuJu[800];
& |; y7 [+ u( F) f8 s5 i        double I_filtfilt[800];+ v4 @2 G! c4 M$ t
        double Q_filtfilt[800];
/ d) M; q4 _# y% N        creal_T b_I_filtfilt[800];
& l4 ]3 u6 Q; h        creal_T b[800];
0 d  R" u% V1 @6 @) b) r+ n. M        creal_T RCRxSignal[50];
$ t' m- c, @. z1 }        creal_T fineCompSignal[50];
4 o  O& c& j+ O1 a8 `9 D9 q        double phError[50];. e* W0 O& A* m9 k5 h/ T5 q- u. H
        creal_T timingRecSignal_data[28];
+ x. V9 q, Q1 d$ b! m# @7 B$ _) ~        int timingRecSignal_size[1];
/ V+ u4 ~- K% _, Y$ d3 v        double prbIdx_data[28];% H9 `* G" V( S- w1 d. L: V
        int prbIdx_size[1];, A: ]2 v7 S* j
        double dtMt_data[28];) {% D( A3 `, N/ b
        int dtMt_size[1];4 w9 p7 e: p4 @$ p) r
        creal_T symFrame[25];, Y9 n  h' @; R+ ~
        boolean_T isFrameValid;2 s# A1 J7 j/ V7 w! y. k: l
        double unusedU0[3];: S9 `2 {6 a  Z

4 l# x& C5 U1 ?- V+ T4 V        //调试过程中的变量! O" ~8 x- l) c; ]' p' Q
        int  enough_data;
- a* t5 X3 p+ _, X0 W5 Z. E0 N* f* X, a+ r
        int enoughDataFlag;0 n  o: M1 F. S5 e* N; |0 x, H
        int yiDuanShuJu_mean_int;9 C* J) l; |4 N. Y0 P  I4 Y9 x
        int int_sum_dv0;
; L. Q) M1 t/ z        int oo;, I7 _# N, t) _* L2 x2 W
        int ii;+ p$ |6 B3 E; E- [. X9 p
        myfuck=10;9 I9 o( [. T4 \1 U  u4 ?6 ]# n
        /*  模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */# {2 J! u. r; B3 S. U/ P5 @9 t; _
        /*  考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
, P5 I: N# V7 ^
; A! O; D: z  f2 D        yiDuanShuJu_mean = mean(data1000);' T8 X# r: w% g$ q

) P+ G4 r( @7 }( b" ?        yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
5 w$ V5 a  F/ k* P* F% ^2 M        UARTPutc('A');" @2 ~  I7 H, ~1 J2 ]
        UARTPutNum(yiDuanShuJu_mean_int);
$ g0 _$ F: N4 Z' h        UARTPutc('\r');
1 s5 M& q' ^- V& I/ M        UARTPutc('\n');
  j! f. V& R% p8 ^& k4 i( v
) L# F& \5 O9 Z. \( L        for (ixstart = 0; ixstart < 1000; ixstart++) {9 ]+ Y& a; m9 Y7 E* H5 }+ }# w
                yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;, M9 C: K9 w  Y  b
        }
# Z5 K+ J& r8 a0 S9 z6 X4 ~5 A+ i( E: E. v9 C$ y. I! b0 J
        power(yiDuanShuJu_LowMean, dv0);
: r& @- H. R4 g& D: ~/ v; t: q. }! \: u
        int_sum_dv0 = (int) sum(dv0);9 f3 L, s& ?, |% s

7 h% `1 }; j3 L: z$ W        UARTPutc('B');
* _& c! M: v4 \3 E( c* l# m# h        UARTPutNum(int_sum_dv0);( D- m1 U7 E$ a0 I6 C; @  k
        UARTPutc('\r');8 c) P: Z+ Q! ?8 e; k
        UARTPutc('\n');
& ^7 _% O5 e' m' D0 L' |3 [4 k
5 Q2 F  E7 b/ K4 l, T" S$ T  t//        int compareFlag = int_sum_dv0 > 1.0E+8;
, p7 z' ~  E# T- ~! t4 U0 _" d: P( \: f5 b
        if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
3 [  t# b& Q$ c- }5 R                UARTPutc('C');# r" G* q" A$ D
                /*  比较信号能量 */1 [  o7 v7 u3 y5 C1 G% r- i
                /*          fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
, P! R; @0 }) u4 n$ G1 t" Q//                yiDuanShuJu_mean = 1000.0 * youxiao_k;
* I2 I, e/ W! \' F; P) n4 q//                for (ixstart = 0; ixstart < 1000; ixstart++) {
. p/ I$ G! H0 _//                        save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
/ V* _) c# P$ g( |//                                        yiDuanShuJu_LowMean[ixstart];
; L/ t9 a+ R( A//                }+ o0 J% G$ s- E
//
' z: a/ r5 B! Y3 H# Y$ q( s3 w( ]//                youxiao_k++;8 D3 P3 ~/ q, M0 P) U0 f2 T
//                if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
! @0 L) b% b8 O8 {" B//                        /* 感觉要取21个数,即0-20, */) g: w9 c5 s/ }. a5 S) }* L
//                        enough_data = 10;//有效是10,无效是0& i6 Z9 _" R, b, U% D
//                }1 ?1 k" V4 ^- f- @( u; v
        }: e1 ]* j% m+ R. g
# ]$ Z* k" r1 c# j+ u( j* Z

1 k0 n2 u0 N/ W+ r" `  H& f        enoughDataFlag = 100;. `( y* ?  c* i, S0 ^+ ~
        enoughDataFlag = 1000;
& }9 s0 s8 P! _$ L8 v        enoughDataFlag = 0x02;
, y  o# A7 j% ^. p        enoughDataFlag = 200;
# ]( h$ |6 u4 A8 k5 ?1 m; Q; }" {! q" J( L* X4 ?/ j
        int myfuvk1;
$ q4 a$ @$ _4 O4 i        myfuvk1 =11;, F3 z" s7 Q. c
- s3 l6 \- U0 q4 ~& Z; m8 [

. P; m6 d; q6 x* m. M) g        enough_data = 0;
* t/ ^/ {. R* F7 Z: o2 A' l; x4 |9 ?( X0 M9 U
//        if(enough_data>50){
: u$ s' |- Y" r) ^4 z5 b& P4 S//                enoughDataFlag=0x01;
/ N/ Q; B6 A5 ^/ O+ ^//        }else if(enough_data<50){6 ?- f/ [" e0 w; x( D
//                enoughDataFlag=0x00;//0x00还是不行& H. M! ?: F0 F% b3 X; z
//        }9 ?: P# y6 I2 y: \9 e
. d3 W  D! ~1 s6 M  \6 U  H0 K

5 T5 D: f' ~$ ]& r9 D" u2 R        oo=10;
. ~# }# p; J& K4 F2 n, W        oo = oo  <  5;
. u$ ?9 {0 |3 F4 p6 H1 e" S        if(oo){
% k6 x8 k2 C% A$ m) l                ii=0;
# [9 |, s7 x7 P+ p7 u: F2 P3 C        }  P, ]4 b) I: z5 o# ?5 x& |3 D
        if(oo  <  5){
2 x' c& f% }3 J0 u7 u6 t3 I                ii=0;
: x) g3 O3 M9 F0 M+ W4 ]' [        }& ~: Q+ P9 n+ e: E1 m' f  B  i3 p
        if(oo  >  5){
7 h" t; ~  H1 Y+ l. {                ii=0;
, D1 X% |# l9 a- m        }
  H1 r6 L5 ]- b  I- g7 o. [+ `0 r0 R. Z+ B" n) A4 W
        /*  save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
$ n# j, }$ r  ^: D5 ?        /*  如果数据足够才执行主程序 */
0 P9 _' [- a  J4 }/ ~$ }. A+ H2 O        oo = oo  <  5;
, {. W* v$ F. m8 G# d6 N        enoughDataFlag = enoughDataFlag  <  5;. W3 ?9 g$ c% u8 E" \  F. b
        if (enoughDataFlag  <  5) {
$ t5 E! N+ U7 D) C//        if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0, N* X* ]& V8 S9 T
                AGC_AGC(&pAGC);( N5 f6 m5 D- c+ P5 s# G/ @& _/ Z8 e% c

% n; y+ N9 u5 O/ M/ }( l8 g2 J                c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);1 W( B. o6 o( g" O$ R! F0 e
                FIRDecimator_FIRDecimator(&pRxFilter);. R/ e- p) ~- z, \) |5 `
9 k' S* I6 S3 |+ Q) F4 b$ z
                /* Downsampling */2 d3 w5 h! Q$ ?/ v. M1 E
                c_SymbolSynchronizer_SymbolSync(&pTimingRec);
' B# ?% h8 a0 Y7 D& w  t0 v. z6 X. U' C& l$ ?' q
                c_PreambleDetector_PreambleDete(&pPrbDet);, ~  c  h1 ]3 l  K5 i" R0 W5 N

' ~* W& |3 o% `                /*   'Threshold', 8);空气信道情况下,把阈值从8改成7 */. K6 {" b% y2 J: j/ `* ?
                /*  %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */1 G* H" D1 w: p7 a
                /*     %帧数量=100 */4 a% s' \& @1 d8 R
                pFrameSync.isInitialized = 0;
9 F+ w, A" n8 x. i/ N/ E1 ?. {
- W/ ?* w1 k& o! @3 b                /*  [EOF] */
+ @8 [% y) O, x3 _4 U                /* 前导码长度是13 */: M4 L: F1 c' c5 D
                /*    %qpsk */
2 L" r0 P. x. n$ v" [                pDataDecod.isInitialized = 0;
. q5 x0 s! `! r( X6 a6 ?9 [3 i2 I" ]7 M& I" B2 T
                /*  end */1 P4 H: g% n  N. V" S" T+ O% X
                /*     %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */2 U- [9 ^: h+ G. }8 v
                /* Convert 3-dB frequency */! z2 _) C) f6 V8 A2 H$ `. q
                /* Convert 3-dB frequency */8 U) {1 F  S9 t
                filtfilt(save_buffer, usable_left_filtfilt);$ H3 e+ a2 Z' X/ @5 q7 v
                for (ixstart = 0; ixstart < 81000; ixstart++) {( o- I# @* G# y' i( M2 k
                        usable_left_filtfilt[ixstart] *= 2.0;  ^( o' Q! q2 }" @) w
                }
, s$ i+ t) y; M/ z0 z0 o! g' |% G' y4 h+ `/ A6 Q. K% T
                /* 注意乘2,处理幅度 */
3 {( [  q$ T, t0 \- i9 `                /*     %% 我发现带通之后其实就均值为0了,不用这一步了 */6 f4 E, R8 |' |$ E0 u; l! Y- _
                /*     %% 行列转换 */
: K, l, }; X. X0 K                yiDuanShuJu_mean = b_mean(usable_left_filtfilt);6 s( M' G. e7 `1 e/ W
                for (ixstart = 0; ixstart < 81000; ixstart++) {
5 M# u% m, C5 e, e2 [                        youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]% X# S' _* ^6 s& ?, |/ m
                                        - yiDuanShuJu_mean;
$ @6 e. k# g" e# s6 M) f3 B                }3 Q) M* N$ R/ L$ C
/ I" E" `, P# [9 S+ {# H  n
                /*     %% 应该对数据归一化,但是这一步放在哪比较好 */
. N7 i3 x. q' e" |- k" i                ixstart = 1;
2 n% i7 T, h$ s! |- |3 m: w; u7 o0 z                mtmp = youXiaoShuJu_QuZhiLiu[0];
; L! z' G! M7 o5 }& q                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
% R. y7 ]5 J; m$ C6 _# i                        ix = 2;
1 L- f3 D  U* g                        exitg2 = false;' N  w( T" p7 w7 ?
                        while ((!exitg2) && (ix < 81001)) {
: y' ~) Z7 s5 r5 R& J: X5 Q* L' G. b                                ixstart = ix;
$ c8 y* l( H% E. h/ Y5 B                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {# Z; d( |/ f/ V0 B% q8 ~* U
                                        mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];# M6 o0 K: W* Y
                                        exitg2 = true;8 o9 R0 G6 }* L- l  a
                                } else {9 ?6 p) P) U# s, h  t& U
                                        ix++;
8 {: b4 f/ x# n2 {9 I, `- f3 r) ?                                }/ }/ C1 z7 W+ A6 \! B
                        }) I! [, O- I8 L6 f& V+ ~% s" V
                }
8 E$ ^7 r( u3 I' ~4 w
! k8 H9 y+ h) e                if (ixstart < 81000) {
; A: p3 ^4 s- y' R- i2 W) G* _                        while (ixstart + 1 < 81001) {( n/ h, a# p) {( z% f/ f4 `
                                if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {" o9 X. y4 W/ r. ~9 g- M
                                        mtmp = youXiaoShuJu_QuZhiLiu[ixstart];, K6 r2 i+ X0 G( w5 S: W
                                }
/ `% V- b  i, J  T( {4 ~4 k: _3 N" H, O- I; C- U( ^0 C
                                ixstart++;
+ R  I; N8 H& [. ^! d                        }
, y5 v5 W& y# I: `                }9 ]  x- K: S- d0 i+ P( M
4 K( x% K( [) Z4 N1 F% x* N5 W
                ixstart = 1;% p4 j- O3 V% f2 q0 N
                yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
( j  o8 @1 p8 ?/ e7 S3 j. \7 W- G* y+ d                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {* e5 k& _& C- q/ [6 J( H+ |% j9 T! ]
                        ix = 2;% l3 ~1 Y  w  i" Q. L, j% B
                        exitg1 = false;1 C( D; G, I6 m* y# [
                        while ((!exitg1) && (ix < 81001)) {
) n5 Y' R  t5 k# j6 r( u- q                                ixstart = ix;
2 T6 w9 Q3 K+ v) t% m( ~9 y5 Z4 R# u                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
( m* J8 z! R" W- r% X  C: P                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
  c6 ]# O! d7 `/ T                                        exitg1 = true;- K- z/ w. u4 L& U
                                } else {
/ V7 N4 i/ m; @3 _5 p( s* `( I# P                                        ix++;1 r+ |4 e6 f* {* m9 Q  ]( E9 e; C
                                }
2 [3 c: i- y0 e0 J                        }# U+ k5 n  ~$ c% l; [3 b2 i+ T
                }
1 B/ o+ t+ H" ]: W2 y) f0 V/ H) x9 V) I' ?
                if (ixstart < 81000) {* E4 x0 G0 G0 M) d1 }+ ~
                        while (ixstart + 1 < 81001) {2 l% [5 t$ E$ E* B
                                if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
) W  T6 z5 ~) e( g                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];, p: I3 G$ l2 y+ U
                                }: ~# K. S( b. I6 a3 |' M

" d; B( O4 a5 u5 w  W' n                                ixstart++;
- r6 g: v: Q! |  A- {/ H, c% v5 B, |                        }' E1 C$ d2 ?; ]( y( |4 p  e
                }
9 u/ l9 ~; s/ b1 {, K3 |0 p
7 m4 r" I# T: E; T0 E0 F                yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
* k0 E% q) h( n                if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
* [8 V) }8 Z' N& E9 u8 B+ n! R* g* k                        yiDuanShuJu_mean = mtmp;
; J/ J$ |) k' Q( j                }
! x$ _  u  ^$ ?& o% }7 Z: A* e* ~' m: f: O* p$ F
                /*  找出极值 */8 M- Q- L& j8 k6 K% @" I/ y/ h$ t3 _
                for (ixstart = 0; ixstart < 81000; ixstart++) {
2 M% [! K+ u* W; f" Q                        youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;2 [2 t; D2 q+ W) C1 u% Z
                }5 r2 D# a# J& f/ a/ V

  D1 c" p; _/ |        --------------帖子字数限制------------------+ z4 ^9 ~$ I. D5 [
}) V) d' R1 f& n0 y$ m0 i
1 G" p9 @* `8 }- {0 L
) q7 B2 N9 A- \- a

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




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