嵌入式开发者社区

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

作者: zhangsan1231    时间: 2017-6-8 15:50
标题: debug时程序运行的莫名其妙
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
. A9 J- a; r4 q& \6 b
# q, D3 A$ N' A( Z* ]$ a5 i各位大神:
# \8 T0 E% ~! ?7 k" }     你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
! u+ ^( R  S8 U  ]: O. Q# l      我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:. i/ U5 s  m  k+ M8 |1 L( n$ q
5 a% b' h* V5 q% e: V% N
     [attach]2441[/attach]
9 N# c8 r" n# `2 N$ ^这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
: E5 ?8 O* r2 w2 l. c) T" x7 ?8 s% W& V
并没有其他线程2 h5 u* N6 `0 @- ?' t  d6 b
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。: r2 c$ _' B: U( s0 e
也说不定是和堆栈有关系。。。。。。1 H' D' u9 h3 r8 S' N
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....8 C7 Q) {$ b! o* Q
[attach]2442[/attach]" W  t$ E0 W- R9 U# Y  E4 G4 J) P
9 F, L) O2 N9 I$ P" B  E6 g

: Y0 Z. @. o7 Y& ^* G我也很绝望啊,希望大神能帮帮忙,感激不尽,!
# T; \; [, I7 N8 W6 n- v1 m$ N+ c; p9 E, o
* L8 q8 v7 d& M6 g- i
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组        static double usable_left_filtfilt[81000];
3 t8 M- o" y4 d; b! q$ I        static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。' z& u* o' c9 j, R4 U% ^  d
6 ~  E9 h3 N3 \2 s
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(# L  S1 S8 Z2 V( j
                const double data1000[1000]) {+ p* t5 H+ y& ?- K: z( M- q" ~
, J* J; V) B/ S, ]: R" @3 t
        int myfuck;9 ]+ t* ^" w' z6 K
        double yiDuanShuJu_mean;' D" G" J6 s. ^# f5 `
        double yiDuanShuJu_LowMean[1000];7 T2 \% I# a) P! [- h
        int ixstart;$ I. ^8 O9 T7 V
        double dv0[1000];
6 P$ ~% E1 f; j6 q- J8 e        comm_AGC pAGC;
' j8 f% H) T: Z' q        comm_CarrierSynchronizer pFineFreqCompensator;
2 A5 ~/ l' M3 ]. f  \        dspcodegen_FIRDecimator pRxFilter;/ q& o1 N( e. ~# ~
        comm_SymbolSynchronizer pTimingRec;* Z) i- d/ s: @8 \' f! v
        comm_PreambleDetector pPrbDet;, |8 s- p0 v( R
        FrameSynchronizer pFrameSync;
  ^# O. F8 r( C$ p  G! i) U        QPSKDataDecoder pDataDecod;
/ S9 ?, ~% A+ v' J; {" P; g8 \        static double usable_left_filtfilt[81000];
8 A) [9 g- |( K2 f, x1 D        static double youXiaoShuJu_QuZhiLiu[81000];
- p' D5 m" k" {. C7 l! s        double mtmp;
0 p8 a! z- Y0 v6 N7 T* w        int ix;4 S& O( J! Q, W& |- @6 C
        boolean_T exitg2;3 L  g6 E$ C4 }$ S
        boolean_T exitg1;
; [" e; C# @# g( ?+ W- S7 k' T5 X; m        double YiZhenShuJu[800];( t% h! l3 Y: w7 Q
        double dv1[800];
- `% L( Z9 \6 Y: |2 |1 S0 j: b: U+ m$ X8 B) ~+ h

* ]0 q  B% B2 G8 w5 P& C2 }        double b_YiZhenShuJu[800];
* a( ?7 ^9 g- b3 j/ x        double I_filtfilt[800];% @5 v* O- Q. ?' G1 F& y
        double Q_filtfilt[800];
" H3 U! m$ i9 l' l3 R$ t" M0 |5 o; Y) Z        creal_T b_I_filtfilt[800];
5 ^# T( W( l4 e1 ]1 R$ |% N) K        creal_T b[800];) C+ m6 m7 J( p% E3 O
        creal_T RCRxSignal[50];: D$ P" }  O' t/ t
        creal_T fineCompSignal[50];/ L6 M+ C2 A4 G3 c
        double phError[50];) N- B. m! p& X% t
        creal_T timingRecSignal_data[28];' g1 W, }  Q% i  a- w
        int timingRecSignal_size[1];" Z$ ~1 k- \" k, j- g* K
        double prbIdx_data[28];& ?: u+ m. [  X- G* [
        int prbIdx_size[1];
9 g+ Z& K8 o* e$ x* y        double dtMt_data[28];
- s# E6 j3 a6 v9 [# j# F        int dtMt_size[1];7 k3 ^9 W6 e/ S; r
        creal_T symFrame[25];) J9 o; N% k1 L9 r" u+ f0 V
        boolean_T isFrameValid;) _1 X# k# H8 r
        double unusedU0[3];
2 b5 t) z( ~& n' ?9 ~2 T+ b9 C  [; U4 _0 A8 Z
        //调试过程中的变量1 b4 L& g0 i3 J5 a, ^6 @' d
        int  enough_data;
' o" B; T7 B& L+ M/ v, f4 V/ _% T1 z; c6 S1 h' S; l! I' v, L+ d
        int enoughDataFlag;
" F' U+ Y& `  Y0 v5 U. I        int yiDuanShuJu_mean_int;. E5 r) L  B3 f9 x
        int int_sum_dv0;; M: E: f" c3 \8 s! _4 E2 I
        int oo;; A: ~) [% p. P, U
        int ii;
, N1 u7 _* W# t( b        myfuck=10;% n& O- ]/ }* C* o4 H) h
        /*  模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
$ N/ d4 ^# r2 U3 D2 n        /*  考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */# ^9 _3 D& L5 Z
) S6 Q6 s) c1 t; X, i
        yiDuanShuJu_mean = mean(data1000);
; I' k  M& \9 _% O5 p
3 w$ e7 c& l5 E5 w+ C$ H        yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;4 l; j' s4 c) Y: }+ {+ e
        UARTPutc('A');
  B+ X( H' }2 j. v% d        UARTPutNum(yiDuanShuJu_mean_int);
8 z8 }) j7 W+ s/ V2 e, ~        UARTPutc('\r');+ _! w4 d8 r0 h2 E( I) e
        UARTPutc('\n');
1 Y. K3 w8 S7 }7 }- o
$ b( `$ ~# N( a# P$ U        for (ixstart = 0; ixstart < 1000; ixstart++) {, h+ q/ z8 N6 j
                yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;& N0 `" g- L' @+ X
        }+ P, j. {3 {+ K; ]' r

0 q4 D; |" R+ F( `        power(yiDuanShuJu_LowMean, dv0);; D% _" q2 u: i. Q
/ J: k9 q& h9 \+ l! ~3 U
        int_sum_dv0 = (int) sum(dv0);
/ t1 v" X  k; N
( X  y" L5 q, H1 h4 z        UARTPutc('B');
: i& B4 }! \9 b& K        UARTPutNum(int_sum_dv0);+ E, R9 n2 V+ d/ O5 y
        UARTPutc('\r');
# Z- @' y: `3 ?8 y; Q        UARTPutc('\n');$ H9 w. s0 N1 n6 T9 ?" R
5 X5 X4 C( m5 X' t: w7 g
//        int compareFlag = int_sum_dv0 > 1.0E+8;
+ m( |1 m" Y) _
: l* t% h* W- ?% j. D3 E        if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
! G& l0 f' V3 k1 G- `+ o& _# s                UARTPutc('C');; h% g- {6 Q: L8 r
                /*  比较信号能量 */
! m! t2 O, s1 k! h9 G" T                /*          fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
  _; V) D0 w* D; j//                yiDuanShuJu_mean = 1000.0 * youxiao_k;/ H4 W( U# r  R) e! H% a3 L8 j
//                for (ixstart = 0; ixstart < 1000; ixstart++) {
% L" H+ }3 K; w- r% S0 J3 h9 f//                        save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =) s/ G2 f# j6 a5 i6 _- C, _
//                                        yiDuanShuJu_LowMean[ixstart];
# i) t: Z6 |0 j& g1 u) ?//                }
4 e/ a( _  b5 L//) h4 v: A: d$ m' D$ h) w3 Q9 z, Y
//                youxiao_k++;9 q8 R" f( _- |. u  \. _
//                if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==' f) L) B0 ^9 @% x2 F
//                        /* 感觉要取21个数,即0-20, */
$ `0 `. D) q+ M8 }8 y//                        enough_data = 10;//有效是10,无效是0
, x2 I2 j/ ~/ |2 d+ b: T//                }) O) y% z0 n7 z$ s7 A, t
        }
* |* \! [# d+ S% t) J3 `7 C) y, |, k( h7 {/ I) i$ ^' z! y; {4 Q

, Z$ Q9 e8 ~) N. l# E( n; R4 y6 V5 k        enoughDataFlag = 100;
# G- c$ I0 h) `3 F( a5 p) E0 k! U$ a0 ?        enoughDataFlag = 1000;
, y6 w( U$ ?$ T1 J2 M' @+ L        enoughDataFlag = 0x02;6 T  d/ i, j- m6 q& z5 i
        enoughDataFlag = 200;
2 g; Z- u; U* D8 g/ M" J& }, f0 p( l- Y( K: B" e
        int myfuvk1;
0 L3 B& p! \) A0 ]1 c: ^/ H        myfuvk1 =11;
- u- y, Y% u3 i% P; s9 z; l; v" Q$ @0 z# Q2 R

' r( a( {* g5 n. K2 L- }8 o        enough_data = 0;
, `% M, w4 K. _- t7 q1 z" j% o+ C. @8 ^5 M; h6 I: [- G( S
//        if(enough_data>50){$ y4 A9 C# m" P: b( O( x. r8 _
//                enoughDataFlag=0x01;3 Z/ d  c/ G1 G: @8 `  _" Z
//        }else if(enough_data<50){) B; P. @6 v9 g( `- w9 K
//                enoughDataFlag=0x00;//0x00还是不行
7 |: b" j& j( i& R, E/ G//        }
# v- Q0 d' T3 T6 q, K( z1 L: u
; z; y( |( ?3 S1 k7 q) Z
. N1 N7 V; v& d& d        oo=10;  l1 q% K6 J/ X2 f0 d  N, B7 W
        oo = oo  <  5;
- B: l$ Z& L) t* a, H& G        if(oo){, ]5 c: h5 X) a. G0 N/ H: C
                ii=0;; j" l, c2 g( P. y7 s
        }
  R. H& ^2 N: S3 Y; z1 s' i        if(oo  <  5){
" N& O+ B5 ~$ V( _( |/ M                ii=0;
' @5 ?/ A6 x8 `) Y2 ~4 E        }, q! @6 \- E0 J
        if(oo  >  5){
" N6 |  s# [, Y8 ?' C, ^) X                ii=0;
7 }! b/ a4 i/ w9 Q# i        }
# \' \; w( A2 e1 v; ]8 u" z7 c# O6 Q, u. _
        /*  save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
. I- S4 t/ `( u3 D, }        /*  如果数据足够才执行主程序 */
9 b, ?% _/ p- G* _& o+ C& d1 _  c        oo = oo  <  5;
9 R) p( j% I: g        enoughDataFlag = enoughDataFlag  <  5;
$ k3 \8 G, u6 B* ^. g4 [) W- P        if (enoughDataFlag  <  5) {
# R: b  X0 }: ?3 d% R: C; R//        if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
5 V9 L8 T0 b7 d- |# X" v. }# M/ W                AGC_AGC(&pAGC);7 u% C% A# h7 e% {- ~  U" K" U

) S1 {" n& E0 ^- L                c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
. U' w+ y) o! k4 x. t+ V5 Z- i                FIRDecimator_FIRDecimator(&pRxFilter);+ g$ m  e& c4 s1 |6 O* C( R

( V( z- d, c3 a9 D4 c8 j. b! x9 l                /* Downsampling */& e1 x/ D, p5 S) z/ D# D
                c_SymbolSynchronizer_SymbolSync(&pTimingRec);6 R$ M) ~8 g" t" `- q
8 S0 D0 k0 X, M: @) V
                c_PreambleDetector_PreambleDete(&pPrbDet);
4 ^6 x9 z2 F6 U( m# J
, B9 ~, m8 x5 i                /*   'Threshold', 8);空气信道情况下,把阈值从8改成7 */. I! f* [+ t0 }; K( r- t% M
                /*  %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
) R5 R$ _+ G- l7 Q- ^                /*     %帧数量=100 */
' X& e1 W/ `+ A- U$ ]: ^' p                pFrameSync.isInitialized = 0;% e8 u9 {4 D) P6 [- v; v& Z

: c  _5 ?' l4 j7 W                /*  [EOF] */  q* ]& q- M3 I6 S9 a" @2 b
                /* 前导码长度是13 */4 _4 I5 w; S8 ~9 K
                /*    %qpsk */
# H* k. |( h* f                pDataDecod.isInitialized = 0;
, w+ v* Y1 y# T3 q0 ?5 E( ?: A1 w
                /*  end */0 j% H8 T- T2 h3 A6 F7 c
                /*     %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */* p  P7 m; I, S, B& u& s. Z
                /* Convert 3-dB frequency */) t5 P( h( i# h. L! F
                /* Convert 3-dB frequency */
5 r- Y: b# F/ u! t% m. T/ a8 ^$ W                filtfilt(save_buffer, usable_left_filtfilt);
" J! A. _" {* r8 }( U6 X                for (ixstart = 0; ixstart < 81000; ixstart++) {
1 y8 U. @. |6 y' t4 ?$ _                        usable_left_filtfilt[ixstart] *= 2.0;
9 g) C( T& Y( H" d# E6 s                }
/ s) i% K) S# ?! a8 a
1 F9 s# w  i& _2 m, j# J                /* 注意乘2,处理幅度 */( r) d, y8 t5 i3 x" H- K2 L
                /*     %% 我发现带通之后其实就均值为0了,不用这一步了 */9 z1 y6 M% j6 V6 ~
                /*     %% 行列转换 */1 F8 _  e5 Y2 |. w; ]
                yiDuanShuJu_mean = b_mean(usable_left_filtfilt);2 c" n4 V: J2 N% X
                for (ixstart = 0; ixstart < 81000; ixstart++) {
: B$ R/ \3 i, d& ^7 t4 h                        youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]4 p& @: v: Q* y  k
                                        - yiDuanShuJu_mean;
- P& J% U# {) `& v- i6 A5 \$ F                }
( X5 K% r" m* R6 d, A; c
: p! n$ y# }% Y& @' N                /*     %% 应该对数据归一化,但是这一步放在哪比较好 */
; \# A7 @# J& K9 c8 D                ixstart = 1;0 n! D* e, m8 `7 }1 ^
                mtmp = youXiaoShuJu_QuZhiLiu[0];5 ~3 A0 j6 I% ~
                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
: D, m  O+ |4 _% ]9 n                        ix = 2;/ ^' ~/ m4 w0 {/ m3 w0 i0 p
                        exitg2 = false;" i1 B9 u1 Y/ }. V0 _0 L
                        while ((!exitg2) && (ix < 81001)) {
+ X3 V7 C1 h6 P                                ixstart = ix;( n, k7 O" l/ f: `
                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
. H" X! Z$ H2 g8 T8 u                                        mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
- N$ w2 c5 R/ K& `0 u                                        exitg2 = true;' t* S3 j2 W: ^( p; S
                                } else {
1 y5 ]/ C1 ~# L# X* @6 f* F                                        ix++;
7 l; b8 Q7 o( h- s0 U, i7 Q6 m                                }
* e4 T* E: h& |/ J9 B* B                        }# u& \4 ?$ @5 g) ]+ O
                }0 d9 h, M) @3 k4 d

2 `& E. v* T6 p7 L$ e9 O, A; ?                if (ixstart < 81000) {
3 ?* Q+ {6 _8 r- Z2 _8 W                        while (ixstart + 1 < 81001) {0 T( e- |5 R' R" |
                                if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
8 [* k/ x5 e" b& `# B, k) \+ Q                                        mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
- p9 k/ y4 F+ L: q) _                                }
8 b7 \( p6 g  u( K8 G) q
: r8 Y" n5 U& y4 g5 H) ~) @                                ixstart++;
* J. B8 B' {/ e( b  y) a; t                        }
2 M& |9 h- @% E# ^0 X) e                }
" q# g. T/ X( L! d8 c7 @* @& s+ T4 X* d8 u1 W. _- I
                ixstart = 1;4 f6 Z  E2 \, I2 Y
                yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
- A0 t) h7 [  h& h  K9 K' T                if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {) R- d' i7 i# P- b( b
                        ix = 2;
  s' _6 d5 f( b- P9 `  Y7 E0 ]                        exitg1 = false;9 v' ]3 I" b' `% X& c
                        while ((!exitg1) && (ix < 81001)) {8 A& [' \( I4 [8 S0 `
                                ixstart = ix;+ x4 t1 ^7 \9 [% l* @
                                if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {6 g4 B( i1 ?) J1 K  X) b
                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
5 h" F# c& u  N) c+ z2 }                                        exitg1 = true;
, }( x! Q5 y! I                                } else {9 g9 r6 F4 b- m% F( `8 V: W
                                        ix++;
; q2 v& {) s+ d. O3 A6 a; [5 W                                }+ G* b" f0 m' G* {1 w+ V
                        }2 g. M+ [+ I/ i$ L
                }$ R" `9 w/ G' C1 S

0 ~% c9 c1 ~4 M- S5 a- D1 }                if (ixstart < 81000) {
0 `7 Y* O4 l$ _, ]2 a                        while (ixstart + 1 < 81001) {
4 t* a; |7 n2 i  D4 x/ S3 j- N                                if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
- F$ G- h4 D. ]  ~                                        yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
; V0 O5 ]3 j3 W                                }
/ u1 G3 K4 f: @# w% F7 o" r9 r0 V
7 z+ F" s% l' F" ~                                ixstart++;
2 Q3 l2 C1 n: c: R                        }
# G5 |) F$ ?# J2 E$ s2 s: k8 S3 c                }- x6 s8 P) p. c
; Y' s+ m5 d2 I# x
                yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
9 E$ \: Q0 f, q4 Y0 j) f" K* _# U                if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
$ W" Z1 X, N6 @9 s& e9 g! a3 T/ d5 _                        yiDuanShuJu_mean = mtmp;+ w1 [( F9 l- E! o8 Q, j
                }
+ H8 W+ I( G" y4 H- \- f% m+ W. H
9 B2 ?0 I8 g2 U1 W                /*  找出极值 */% y/ c. F; i% Y# u
                for (ixstart = 0; ixstart < 81000; ixstart++) {
0 X% q  N3 w9 V2 |                        youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;( Q# v7 ^% V$ Y2 B
                }
; M# E) R8 @+ \3 s9 z8 b3 b, Q: f8 j7 i
        --------------帖子字数限制------------------
; u9 _3 D6 x; ^7 u, a}
- k! b" o, I4 l' B
7 [1 J# K6 p! D: {
: [" `% `8 v1 W8 Y, i1 X/ z% |' r
作者: tenny    时间: 2017-6-8 16:37
会不会有其它并行的线程修改到了它




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