嵌入式开发者社区

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

作者: zhangsan1231    时间: 2017-6-8 15:50
标题: debug时程序运行的莫名其妙
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
. E& Y; T9 n0 h& o6 A
) G7 I3 p5 c+ ^' R各位大神:8 [. `0 R5 b- e; Z4 q# @
     你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
$ d6 U0 T9 k  K6 O) a      我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:; M# A8 }) e+ ~0 ]
  m* {9 l3 t. g& Q( U$ _
     [attach]2441[/attach]
, n: ]0 e# Z5 R' r这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
' x7 ^6 M( F1 O  b0 E# a6 r0 u$ N# K5 R6 f) \+ z% ^/ C
并没有其他线程# ~6 Z* x- B, J  _4 \% M& C
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
5 r. k. o4 n3 L" q. n' h6 u  m也说不定是和堆栈有关系。。。。。。9 M: r& W/ A! G  ^8 F! K
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
8 c2 P$ v3 ~2 F  O( x& y" B" c5 a[attach]2442[/attach]
, o# Y; t6 N6 v# p0 D) S
* t8 y# p8 O# C, v- X. r( j* y# h5 b. ~4 g* }% o0 M
我也很绝望啊,希望大神能帮帮忙,感激不尽,!- `% H8 p3 U* H. b: {& b) C* P

$ D# n; [% A" l( a! u8 J& @# d* a. \2 M7 F8 u2 Q; X
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组        static double usable_left_filtfilt[81000];( w: l& J0 r" u! R" R" `; E
        static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
6 W. T/ U! V: D# K( A3 E$ o5 w6 A* {8 l* N; S
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(. @; v; J2 l0 |' v; W* {; a
                const double data1000[1000]) {
  u5 N& z6 X+ L7 V) b. Z& k4 R- H
$ ^- y) U+ L" \        int myfuck;
7 m6 z0 r$ i, C& ]/ T9 x/ S        double yiDuanShuJu_mean;
! j! z  @: _! o  Z" J+ y+ W& b  q        double yiDuanShuJu_LowMean[1000];
9 `* p) F3 S+ h0 \4 g        int ixstart;
8 s+ T' ]3 y/ }6 x! x0 I        double dv0[1000];- E9 G9 @3 T% V3 x8 K
        comm_AGC pAGC;
, v& a, [9 }1 P) K0 x        comm_CarrierSynchronizer pFineFreqCompensator;% r0 P; _! Z6 X$ _( W7 i: n
        dspcodegen_FIRDecimator pRxFilter;1 m. `0 N% B4 P5 o) ^7 I4 `6 m
        comm_SymbolSynchronizer pTimingRec;
" |/ Z7 F  T! Z2 n& R8 L) e1 y4 [        comm_PreambleDetector pPrbDet;6 F5 x" V* L/ ^( D+ y0 I% m; E
        FrameSynchronizer pFrameSync;/ b, F/ v- _* f- D% o
        QPSKDataDecoder pDataDecod;
; p6 M  }! ^; Q        static double usable_left_filtfilt[81000];
5 e/ C# z) w- w7 T& `7 r        static double youXiaoShuJu_QuZhiLiu[81000];! R2 V3 i+ z2 a! t
        double mtmp;
0 L) ]2 h6 J5 W- {/ ^0 `9 c        int ix;
1 i9 r8 F2 r" [& a- m" F4 o        boolean_T exitg2;: P' R* K" _& Y6 [0 I% i3 c+ ^- n
        boolean_T exitg1;3 d; B1 j! [) ], j( ?& O: O
        double YiZhenShuJu[800];1 a" ?1 D4 \& Z0 `# g
        double dv1[800];
! k% ^8 y+ M8 Z& ]2 P* o& V/ [: ?# A- [

" }  G4 W7 l+ Z6 C        double b_YiZhenShuJu[800];0 d; A, W* a% B2 w
        double I_filtfilt[800];
6 d! }! ]9 z% h$ F% V3 o! @- H0 h        double Q_filtfilt[800];
: T) E& _7 L- L3 ?% L1 ^        creal_T b_I_filtfilt[800];
$ s  {6 N5 [  w2 ?9 {. ]        creal_T b[800];
7 I1 p7 q5 Y2 O- I9 s) o& z+ e        creal_T RCRxSignal[50];
* ~6 f) T1 N# s, E        creal_T fineCompSignal[50];. e- B( g" z/ L- V: A$ U
        double phError[50];
5 X, O' V6 @( a$ Q8 x4 H5 F/ D        creal_T timingRecSignal_data[28];
. t: R$ ?" d8 G" N8 j$ J/ ], v        int timingRecSignal_size[1];1 {- q" W5 d  s
        double prbIdx_data[28];
/ B3 i8 D) H  B* O  y        int prbIdx_size[1];
0 {* A+ a; s1 L" y& B: H, e        double dtMt_data[28];, f  x- s7 S% G3 Y1 D
        int dtMt_size[1];/ X# I9 ?. y7 H) b( a0 d* F- t
        creal_T symFrame[25];& D* N% g" d$ v9 ~: t) W
        boolean_T isFrameValid;
" L% s( ?/ V7 Q        double unusedU0[3];
; W7 Z/ r  h  [9 e* Q$ }8 B% l  @# T4 {! v# c2 U; o  @
        //调试过程中的变量- h5 C! ]5 I  m5 X
        int  enough_data;
9 h9 N, H# Y6 l* T
% v. w! C/ L! S4 E        int enoughDataFlag;
' F# o+ ]& j4 P! t$ N6 Z9 E        int yiDuanShuJu_mean_int;5 u; z  x! ?8 F/ t1 o' |$ n
        int int_sum_dv0;
# n- E$ ]# p4 C/ _        int oo;4 g/ a% Q0 Y) t9 f# I- I
        int ii;( v2 ~. v1 n+ p/ R) i  K" k% ?
        myfuck=10;+ l1 t. p' p/ i# }' p
        /*  模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
6 u0 ~1 A# [, Y# V        /*  考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */* ]9 |: W( k3 S# K
5 Q- z8 |+ W: w8 d4 s5 {& x0 G) A
        yiDuanShuJu_mean = mean(data1000);. n( d0 m4 U! c: R* f6 B
+ S8 z. `- Z/ O  `% c& T9 p
        yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;% p( u% F6 Z" A0 r# t1 Z% v
        UARTPutc('A');+ x; N; j% `* P2 R
        UARTPutNum(yiDuanShuJu_mean_int);9 R) e, r6 [  s
        UARTPutc('\r');5 F5 n2 l/ u  E( I" R
        UARTPutc('\n');2 x! l3 |' m/ v" y2 u+ M: y
# R1 b5 G% W( X4 E: e3 ?9 S
        for (ixstart = 0; ixstart < 1000; ixstart++) {% h% j/ G; g' {
                yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;6 }2 Z3 K0 t; B' x7 n& V  i* C8 Z5 }
        }& Z, _% ?0 g# B6 E8 j0 J9 n. x
2 u5 D) ?. I9 l% A4 N& l
        power(yiDuanShuJu_LowMean, dv0);: J  D/ J9 X& j4 O. j" P7 E

* |. c+ e% G9 \7 r- t& g        int_sum_dv0 = (int) sum(dv0);
: Y8 {/ s" y3 ?5 O
) k9 H& H& w& B9 @7 y- d) U5 {        UARTPutc('B');4 p, y" u7 k6 G( l  d1 `( g7 l* s/ G
        UARTPutNum(int_sum_dv0);6 @0 P; O$ [" W, t: f
        UARTPutc('\r');4 U) }0 E1 ^! h, @
        UARTPutc('\n');& F/ W6 e& g# B
* j  J1 u0 C% _& }/ ?% z" q$ i; v
//        int compareFlag = int_sum_dv0 > 1.0E+8;
4 h) s4 L! U. t2 f8 X* z; D
: x; K9 R+ q$ ^  u8 F" z7 L( |- E        if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?' ~% ]; H) ^" S
                UARTPutc('C');
5 ^; [' c& q1 I. g4 L# ^                /*  比较信号能量 */
  C3 s; h3 B, Y& I: N7 |                /*          fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
3 n  k4 l$ J/ B( d: w" Q//                yiDuanShuJu_mean = 1000.0 * youxiao_k;
+ v6 ^3 p  J6 B+ R9 |4 y( D//                for (ixstart = 0; ixstart < 1000; ixstart++) {  o. M% z3 n1 M2 K0 c
//                        save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
6 i" ?3 z7 B# z4 \" l3 K* G: W6 t//                                        yiDuanShuJu_LowMean[ixstart];
& s3 X% e( h3 I" e//                }; X0 {5 {+ h5 L' N
//4 R5 Y4 R% E6 {3 A# D0 \
//                youxiao_k++;* H, h: S% E, w' p. m8 U
//                if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
7 J  M: I7 e' B& d3 k) u5 O0 _//                        /* 感觉要取21个数,即0-20, */
% g( A( F- Y5 Q//                        enough_data = 10;//有效是10,无效是0  b$ B4 F0 `2 k1 T) Y3 p: U
//                }
) a" e; B& a1 {        }
( z( w: u1 H! Z1 n
* ]) V  s' O+ z8 c% C% M
& i: J0 L6 A  @1 b# `1 O        enoughDataFlag = 100;( E. d7 J4 V& F6 P# m
        enoughDataFlag = 1000;( \( E4 v. D. F, c! M
        enoughDataFlag = 0x02;& P3 L. N) W: U! G9 y3 |6 w
        enoughDataFlag = 200;
% ]/ g7 `7 ?' t- V* u: E/ O
4 Q3 W4 Q6 k! M7 ^0 N        int myfuvk1;$ ^, z* n9 S; [
        myfuvk1 =11;
0 ~4 q' E" J. a4 ]5 j4 A6 ]+ v5 R% i1 k; k. V
) [; l: k! Q- C5 V
        enough_data = 0;
7 Y2 s  S* C- I/ m9 C# q. T$ |" {" }- j" D0 p
//        if(enough_data>50){
% ]& Z0 I* }$ b//                enoughDataFlag=0x01;
0 i1 I; [, }+ m, F4 G//        }else if(enough_data<50){
  W7 l( k9 z# }9 Y" [) i% O( z//                enoughDataFlag=0x00;//0x00还是不行  u6 d) l3 L! X' f5 Q
//        }, g. Y" x6 c/ z$ R
% l" P# ?0 x$ @" Q) C$ c. t6 F5 V

: S! a, }0 v: P! O9 Z5 H/ C  b        oo=10;; K% `+ N$ O9 T" a5 M0 Q# _
        oo = oo  <  5;
$ d$ t+ d: W" W/ ~+ i5 A$ p2 K        if(oo){
' J6 Y( V2 B7 g                ii=0;3 R; K, b! z" K. N
        }
$ I2 U6 Q- L# P$ d% H7 L        if(oo  <  5){
; t6 L& M* |4 A* J5 C                ii=0;
. ?+ P6 l9 f  b! A. S        }1 z+ p+ W% Z* H
        if(oo  >  5){
+ |0 J: i7 j$ E$ U+ D9 \                ii=0;
) f" J3 l" x+ k8 [        }5 y2 d! c2 |. x; u: M: C' _+ E
7 m- O! s, V" V4 x
        /*  save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
0 s* a# C0 b7 m9 P        /*  如果数据足够才执行主程序 */; _9 u6 ]; c2 n" m! _" ]9 J
        oo = oo  <  5;6 x: q0 O  o" v# ^% ]
        enoughDataFlag = enoughDataFlag  <  5;
$ w8 Q! }: F/ |0 m/ T        if (enoughDataFlag  <  5) {
2 s' U% q* R. x' Z2 F//        if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
' D( K% x9 G' a& W                AGC_AGC(&pAGC);' x' n4 l7 |! ^
+ K  }9 L! @( t9 \" G
                c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
, ?, N8 H8 A% l, n                FIRDecimator_FIRDecimator(&pRxFilter);' [0 K- k9 d4 Q; w0 U
' K4 V% d& M: W# W3 B# k
                /* Downsampling */) [- F. A+ {4 k" u* ?0 G$ |8 |7 b
                c_SymbolSynchronizer_SymbolSync(&pTimingRec);# z- a& W2 |+ I3 s

6 O; J1 V7 c* a3 j                c_PreambleDetector_PreambleDete(&pPrbDet);
+ y( ^2 \; h" @1 d7 B0 ]; R# `$ ]/ C7 Y$ q- R# R' Z
                /*   'Threshold', 8);空气信道情况下,把阈值从8改成7 */" }8 g" s( O3 N% a- _3 S3 ]
                /*  %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */1 K) ^0 a& B% Y
                /*     %帧数量=100 */6 v) |' x# v1 u: S4 d2 H; L
                pFrameSync.isInitialized = 0;
' A3 Z% V' M& o3 y- x" ~: ~2 A3 D+ R& d/ f2 |! Z
                /*  [EOF] */
7 f& j, ?/ |- H  r3 ]                /* 前导码长度是13 */
; y' N4 P* D* N) h% d2 U7 q                /*    %qpsk */, N2 ^/ |* [7 d! V& S
                pDataDecod.isInitialized = 0;7 d' b$ K. N" @+ X0 I% v

- j" {) i" n1 d. }* N% ]                /*  end */
9 J: A" B& b  |2 s                /*     %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
! `( C# Y6 J( ~                /* Convert 3-dB frequency */
: |) I) ~: v; M7 ~) E                /* Convert 3-dB frequency */; J; G* D( E; G; r. d+ l
                filtfilt(save_buffer, usable_left_filtfilt);6 Y7 {: w- v  @/ E) E- G: T
                for (ixstart = 0; ixstart < 81000; ixstart++) {
4 P5 L+ I% _9 I                        usable_left_filtfilt[ixstart] *= 2.0;) T  C& L% n2 r! I$ K
                }6 D' K( U0 Q3 C+ s& b  w3 U

% y& c2 o: B! m6 A/ \+ q                /* 注意乘2,处理幅度 */- Y/ \# X2 q( n6 [/ |
                /*     %% 我发现带通之后其实就均值为0了,不用这一步了 */
" Y, x/ s; U5 u# f6 \' A                /*     %% 行列转换 */
) |, O' W! k; N8 o                yiDuanShuJu_mean = b_mean(usable_left_filtfilt);8 [7 T, W3 I, f0 ^9 B7 w& @1 h
                for (ixstart = 0; ixstart < 81000; ixstart++) {
& i: n' ^  I' Y                        youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]) f8 `/ ?- c( o7 s
                                        - yiDuanShuJu_mean;
" U3 ~  s3 [( P, H" e7 p/ g                }
0 V$ p4 C7 H* t: F! W+ S5 p
! t' K3 D) u7 c                /*     %% 应该对数据归一化,但是这一步放在哪比较好 */
0 X8 X) j& v/ ]' p( P% h. H+ b                ixstart = 1;
3 Z# {* d$ ?1 u2 v, E8 v6 A                mtmp = youXiaoShuJu_QuZhiLiu[0];& b( c' F+ ]- ?5 o5 L
                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {. D' o  X3 b+ j6 w" u7 k3 O2 G
                        ix = 2;
: Q3 x. {' o4 Q7 l                        exitg2 = false;4 L6 G  P7 u* i2 C# P" J5 N% j+ n* u
                        while ((!exitg2) && (ix < 81001)) {+ \; C. q  h7 T; g9 u7 N
                                ixstart = ix;, N% h  d2 I/ s
                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {0 y& o; U4 {* l& k
                                        mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];% b9 j; F# }8 t3 M4 ^
                                        exitg2 = true;% N* {- M4 E7 z0 |3 j9 ?3 Q; G* ~
                                } else {/ [- m& T. Y; e+ T
                                        ix++;
% U' j2 t/ K& A                                }
; @: p3 m" {2 k$ e- f1 e  E/ s: x. I9 Z                        }
/ W- b! q' F: R) `7 j                }
# |1 B& A6 E: \" b. H( g( k$ z; n0 u  E8 ^, g3 X4 O
                if (ixstart < 81000) {! A% t. K" v' l& }
                        while (ixstart + 1 < 81001) {
2 t) |& X. P# o' N; C, |                                if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
1 k; o; H* B. v/ T% j$ d                                        mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
+ D/ q3 l! n' v; \7 s$ w6 N                                }  u- k7 ~# _! L
' u9 A" G. Y, E. W. G& c
                                ixstart++;+ {' x7 F5 o0 ?0 C8 }1 {9 o  f
                        }& t4 ?# E, F3 v+ A/ K" h9 d
                }3 f- Y/ o; M) L! O; d  i

# }/ y  e  p# ], `$ }                ixstart = 1;$ s" D7 d$ f7 v+ b
                yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];- ^" _# V7 p) g
                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
" v* F/ r% J0 h7 N" `8 n                        ix = 2;
4 `/ b. H/ p+ B7 }9 l0 ]+ r                        exitg1 = false;. E7 S" B8 O  q) K# E
                        while ((!exitg1) && (ix < 81001)) {, T! S( w) y6 u7 S- _
                                ixstart = ix;: H/ p& `9 d; |5 @
                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
0 P& R$ g2 c5 ?9 Z                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];* }7 i2 {# G7 ~, g; h& F
                                        exitg1 = true;
$ T; m, s$ B7 q" G" k5 q7 c: Z8 E. o  H                                } else {
$ Z, e# C: B( m2 l! A                                        ix++;
. S+ {' C1 g+ K" X* H% v                                }
, ]5 b. R% X0 C) Q. X                        }, |- ~' R6 N4 z! T& f: b8 R+ D
                }# j9 I" B6 n+ K6 V# O7 J* a: E

2 t( Y# L6 f' }( q' z. `# G                if (ixstart < 81000) {8 L" `! g, q  C7 T" y; C+ a
                        while (ixstart + 1 < 81001) {
# n4 V0 @* w5 H+ n' J3 s2 q                                if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {; ~% R1 f- F+ p* M
                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];' S  _1 W0 Y5 f7 n# K
                                }0 G% s, R5 ~4 J8 s/ T. w
; I3 b( z9 t9 f+ [2 {! k( o$ V* H
                                ixstart++;. o& U) z6 N# M* _4 X
                        }
$ P; Z' D& n5 d, A/ T  i" y                }4 I, {5 s0 |" q# v# i! S9 a

2 d8 o5 i" ]( {( k                yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
' h" u/ A! Y! L& t# u- ?                if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {! I9 e2 [  V; ^* M3 b
                        yiDuanShuJu_mean = mtmp;# H/ Z5 q0 d: l3 s' P
                }6 B7 h7 y) E$ s7 W! e7 [: F3 B7 o

5 x3 e2 f* E5 e& b                /*  找出极值 */3 L" r( d; d& i7 U
                for (ixstart = 0; ixstart < 81000; ixstart++) {
  q( G  m' s- k) G" {3 f6 y                        youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
/ i* E1 e  \  j0 o                }
+ P7 a, W% n: Y! O3 {, W, Q! k* y! h6 i9 ]& r% i  ]& m. s; z
        --------------帖子字数限制------------------
, h$ J/ [; p' q, x) ]9 Q}9 e# q# h0 H1 U

1 ?0 k+ I0 N! k9 d& {1 n
" ]; B: C" }( t2 X
作者: tenny    时间: 2017-6-8 16:37
会不会有其它并行的线程修改到了它




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