嵌入式开发者社区
标题:
debug时程序运行的莫名其妙
[打印本页]
作者:
zhangsan1231
时间:
2017-6-8 15:50
标题:
debug时程序运行的莫名其妙
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
3 j2 O$ U/ h# f1 d! k
) |1 G. Z3 V* M
各位大神:
( K- u( J3 N: ]
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
* V0 |. |- C# L) E
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
- t7 y5 `3 Z+ p$ b' f, p
0 }. t0 U' k7 _; Z+ \ b/ j
[attach]2441[/attach]
% n6 z) t: W% T* j( K
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
3 Y8 i, {6 j7 H/ w2 Y2 n
3 L- ~. v% f6 C7 v
并没有其他线程
2 _* d5 M( {* P9 t' H1 Q
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
- k$ v) ?& ?0 T2 i
也说不定是和堆栈有关系。。。。。。
* d, q1 I9 a7 o/ s
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
3 \9 t) y5 e/ {. C, w" K1 y& P
[attach]2442[/attach]
2 q8 q2 U7 T/ v4 c0 |: X5 c
) I/ `, g: |" J8 M) k0 W
. R% [) [% ?3 g1 w, Y }9 ~1 {
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
4 _/ z# `/ | R5 u8 i: p, w
; j8 o6 [% Q) J5 R5 }
6 m+ Z, e8 s- [
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
" ^" J6 s" U/ Z; p/ C1 @
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
! Q" y1 N# Y, p- p2 V* b6 q
s7 W& G5 r( ]8 ^* c1 `5 Y% I
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
4 W; h8 e& R% A9 D8 d" a8 ]
const double data1000[1000]) {
" T% v$ ?; X8 q v$ I% M
7 O2 o5 b' M0 U; r! t
int myfuck;
6 g" q! X/ G$ }1 O
double yiDuanShuJu_mean;
# n* ~- d M, F/ A0 m1 X
double yiDuanShuJu_LowMean[1000];
0 m+ e/ K2 U4 z! L
int ixstart;
& I2 b2 X* p+ G1 e4 J: V
double dv0[1000];
+ x9 J5 O# R m
comm_AGC pAGC;
$ I+ a. i% @& A$ m4 {' W5 G
comm_CarrierSynchronizer pFineFreqCompensator;
* g% Z+ b) u, Q3 S% s( y
dspcodegen_FIRDecimator pRxFilter;
/ V+ F. ~ I5 Q6 j& ?9 C$ s
comm_SymbolSynchronizer pTimingRec;
+ l2 {6 w) U9 q% Y
comm_PreambleDetector pPrbDet;
9 j. I$ L+ J' G& @; V( y! [
FrameSynchronizer pFrameSync;
4 L- z0 _- |9 o$ O' S* W/ u, |
QPSKDataDecoder pDataDecod;
, V( z$ k, U! L& W
static double usable_left_filtfilt[81000];
% m, h) ?# I% I' L7 {
static double youXiaoShuJu_QuZhiLiu[81000];
9 s+ \- D' e% ~& |
double mtmp;
. {5 i; D! c0 [. M! B9 n& r; G8 H
int ix;
" x' x8 Y" o& o
boolean_T exitg2;
, Z2 f5 |# k3 `8 D3 E
boolean_T exitg1;
- t& b" m1 Y ~2 f' k
double YiZhenShuJu[800];
4 F2 a4 L' w# o5 X
double dv1[800];
3 I$ d* i% H9 |7 q7 j
, }: _2 z0 D; d2 e2 o+ R, a
! }0 \, w% q) m9 f' z; R8 t
double b_YiZhenShuJu[800];
% C( x( n; ~3 Q6 o% p: e+ j
double I_filtfilt[800];
- F1 H9 v# S5 \& L" J8 J
double Q_filtfilt[800];
" l' T9 Y7 n" e/ O! P. w! A
creal_T b_I_filtfilt[800];
3 L, {+ k% l4 P* E1 x) ?1 Q& ~
creal_T b[800];
) p! p0 Y% W5 T' j/ E4 \
creal_T RCRxSignal[50];
. k9 B9 m! @8 z- Z) _" y1 D5 R
creal_T fineCompSignal[50];
# F. \1 Q) s8 g* R- C) |1 g& y
double phError[50];
( [3 P5 M8 j; D6 h
creal_T timingRecSignal_data[28];
2 u. d+ I( W! r9 M. J& a
int timingRecSignal_size[1];
- \/ I2 t7 F+ `6 O& G, \
double prbIdx_data[28];
8 t h0 V9 U% `
int prbIdx_size[1];
* O3 R$ q/ x' r, @3 F& i7 g
double dtMt_data[28];
" c) j7 Y- v" b4 L Q
int dtMt_size[1];
" ~- U. D4 ^5 A
creal_T symFrame[25];
8 w( j9 P! q/ q! u. Z
boolean_T isFrameValid;
/ R) }' u3 h2 W* H( W0 v4 M! q& a5 e, b
double unusedU0[3];
; y* r, T& u% f: i! U6 J1 L# T) a
; w8 `& t% R: H0 }
//调试过程中的变量
3 Z% {. W/ W- e/ A4 K7 f0 F
int enough_data;
. X6 z& ]+ n& J% n' {0 t9 {
; y. V2 S K# G8 Q; H# [, u
int enoughDataFlag;
0 P/ s' w4 ?( Q6 O3 p3 K7 C: t O
int yiDuanShuJu_mean_int;
7 l. L A. @; V x+ A
int int_sum_dv0;
$ r( q8 O! Y/ W- r7 L5 g
int oo;
4 Q) |' }; c5 h) \1 ?$ l4 I1 u
int ii;
9 ^1 Z' F1 Q7 N( v) @ M
myfuck=10;
4 ~% W- y3 G. }7 e
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
0 b! r0 l& q% G. m
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
7 t# _5 U+ c4 x( d
: T8 v/ x8 {0 W$ h9 X! }. z7 k7 r
yiDuanShuJu_mean = mean(data1000);
! T) r/ I4 ]4 l* L, b$ ], @
( @. F" J i5 s( }! e
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
9 H: b% `; [! d' c/ v
UARTPutc('A');
1 g; ?5 B$ F& B
UARTPutNum(yiDuanShuJu_mean_int);
6 `( U& |5 R3 k/ I
UARTPutc('\r');
# [! Y, {$ n5 S( _. Z
UARTPutc('\n');
, j- r: d4 ~9 m: ^# H8 S
* D1 |0 P- z* L
for (ixstart = 0; ixstart < 1000; ixstart++) {
4 x5 w" l7 D2 P- Q
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
: N/ ?# }6 d5 Z& O# p2 ?
}
* ^; ]/ k G5 Y( k# L, U, G
. A \1 L+ {8 c8 R5 d+ F
power(yiDuanShuJu_LowMean, dv0);
- P8 B# _6 m2 j* O/ ?3 \
- k( d# o4 t l' A" l: b
int_sum_dv0 = (int) sum(dv0);
4 w2 p3 j; B0 I# t+ S& x f
' [" c! U0 b6 A3 {
UARTPutc('B');
/ {* H4 n9 {$ R, y
UARTPutNum(int_sum_dv0);
$ x! c: N$ A6 `+ q) X2 ?* g
UARTPutc('\r');
, H2 S# b8 M' y6 y1 Y2 H
UARTPutc('\n');
9 A6 w! [3 n, y& Z U3 b6 c9 a
. ~/ q) G1 E) i: Z) ]
// int compareFlag = int_sum_dv0 > 1.0E+8;
8 i# ~6 d2 t. h9 j9 X
* e/ p+ ?# F K- `% i
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
8 @7 L' Q9 g% c5 R: r. f
UARTPutc('C');
6 S- J$ N/ v7 ]" ?) o
/* 比较信号能量 */
6 _0 L) ^( o& I- B! ~
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
* c. q; `* }( E1 n1 M+ c
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
- |! M# X! S8 u& W) _
// for (ixstart = 0; ixstart < 1000; ixstart++) {
& g: S3 z* e) X0 d; `# u
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
) D5 k* h/ H2 x3 E, ~5 y. u' U, t
// yiDuanShuJu_LowMean[ixstart];
( S9 w8 j4 j4 K! V2 O7 `& ^1 R
// }
* @7 X3 B! w# X* n$ W/ q
//
8 D$ ^ a0 S X$ X
// youxiao_k++;
3 i0 {8 _" m4 G( H! ?, x
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
& p9 \/ V% M% T1 c
// /* 感觉要取21个数,即0-20, */
0 S- n: b6 Y4 a* t
// enough_data = 10;//有效是10,无效是0
' t g- P; G5 C) C, M2 S" Z$ d) w
// }
+ W( y: p* L' Y- J8 p
}
: G+ \/ h, J4 W& R! @7 }8 p0 f
2 ]! W0 f+ ]9 E" G
3 Y& h2 |- `' E9 Y# P
enoughDataFlag = 100;
. Z8 k4 j$ U3 M! c. S- T: L& w
enoughDataFlag = 1000;
, ^! \8 q" E" c
enoughDataFlag = 0x02;
5 S7 K" o" w* R2 K$ C
enoughDataFlag = 200;
) ]$ @/ U# Z7 n2 `" |+ m% |
+ h: [2 ]+ a( \- K. j; V' ]8 M
int myfuvk1;
' f. T% O# e, g6 q: o ?
myfuvk1 =11;
9 |; i$ X6 r. w0 H$ ^# Z- c
* K: N: ^- x& M4 `: c
$ \1 J! S( j0 U3 R, Z2 u0 Z# {
enough_data = 0;
3 B# C5 _/ t4 \9 H
! r( c1 y/ l& r/ Z9 G
// if(enough_data>50){
9 ]/ G! H3 d$ M! h1 o- a
// enoughDataFlag=0x01;
. }* _3 ^5 K4 f7 N9 |9 v* [( m
// }else if(enough_data<50){
; @- c1 R/ p( Z2 }
// enoughDataFlag=0x00;//0x00还是不行
# [; K5 o- x; \3 p
// }
3 p s7 [4 v- s! P' j
' ?+ W6 S& r; C2 \9 ~) _! F
6 D$ Q0 S! C5 i* V$ g
oo=10;
4 `, S* W1 X$ M& Y
oo = oo < 5;
; `) H& ]9 n0 E2 r7 A9 Z* f" b
if(oo){
' d4 j8 R5 L! v; p7 D9 H3 ~% k
ii=0;
6 b# C% I2 |- S' M. Q) `
}
/ \0 A# t7 A u# V/ ]) `
if(oo < 5){
' L8 ]# p+ j T- \ A8 [" f4 _$ E
ii=0;
# r( I8 o( ?4 f, \+ d( E2 O: c. M
}
4 p3 l1 W4 S' c7 X; ?
if(oo > 5){
* M0 W1 @) e! Q- e C* ]
ii=0;
5 x/ f& n; Q) i+ O
}
6 [7 z7 y0 z; n7 }- i. z D
' [& ?6 r: S0 y8 s" E! s6 A; J
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
* P; F1 E' N% \- K. c) R8 T9 a- X
/* 如果数据足够才执行主程序 */
$ D4 |3 a# E: x1 s5 Q, V
oo = oo < 5;
0 k! z8 {. A* i/ S
enoughDataFlag = enoughDataFlag < 5;
V" K: T5 h8 [# C
if (enoughDataFlag < 5) {
& M6 \* `) I! f" \
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
# t4 C. p8 I0 `! @! |. h. k8 J
AGC_AGC(&pAGC);
# [- n0 g" H& w1 q
+ z# Q6 Y# |* V! _. g
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
: t$ f3 \6 m1 b
FIRDecimator_FIRDecimator(&pRxFilter);
* ~0 n' u& B; z0 ~
+ f1 P; w- S6 M% d5 N
/* Downsampling */
+ J/ X" Z$ y7 a" v2 V
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
. C! r# L! o* ]2 N5 o
8 b; ? M( W# L( }% Q7 C3 n8 m3 N
c_PreambleDetector_PreambleDete(&pPrbDet);
- i6 ]: l4 N( q2 Y( Y# P% N. {
& p. s' \$ T; G! g& j
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
0 `$ j h! J2 q/ ^! G8 U9 i
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
6 v1 ^; A3 Y" s7 C
/* %帧数量=100 */
/ Q4 X& |9 _1 Z5 g/ c9 S' V4 ^
pFrameSync.isInitialized = 0;
3 R3 G* Y- ~3 |. \1 l( }* M
- E7 j% d1 X3 W* K4 ?! Q j
/* [EOF] */
- Z3 C. V+ r5 k- S- T7 J
/* 前导码长度是13 */
6 @6 w( ~6 ~1 O3 ]
/* %qpsk */
" r& i. U6 W* g3 C4 O* b2 ]% u
pDataDecod.isInitialized = 0;
4 k- O) m5 L9 H& z
0 J% u0 P2 V4 Y% X& X2 R4 \; G c
/* end */
$ p, Q7 [8 _ t2 @9 I2 V) d" e/ g
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
( A" M, ~: G1 i ^# B6 x
/* Convert 3-dB frequency */
& R% e/ Y! q) i' v# c
/* Convert 3-dB frequency */
9 z( J; ^, D+ H" q. c
filtfilt(save_buffer, usable_left_filtfilt);
, A$ J8 O" c; @2 K$ ~+ F
for (ixstart = 0; ixstart < 81000; ixstart++) {
7 s6 \3 Q6 v. e
usable_left_filtfilt[ixstart] *= 2.0;
! @( X! T1 T! I8 Z# e
}
; u5 J4 c( H3 M7 R( B8 `; R# R. p
4 }5 H2 |/ [8 w1 F
/* 注意乘2,处理幅度 */
$ `" q! X, k, M3 M( u) ~0 v6 P
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
! T$ {! K1 l1 f8 u! ~
/* %% 行列转换 */
. k/ w' Y, ]' b7 g8 c
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
0 u; @' \: [7 I* R6 Y. ]
for (ixstart = 0; ixstart < 81000; ixstart++) {
$ {: f Q; r% J: y3 }5 q' \& y
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
/ }# a/ L0 J* B0 v+ V+ `
- yiDuanShuJu_mean;
* X8 n h" f( E4 M
}
8 e% W2 q+ X& A
+ n: H# Y+ P: M+ I8 q6 `; y
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
# {! Y0 c2 H3 p9 T' B1 B
ixstart = 1;
i' I3 H- R! m# Q/ b, y
mtmp = youXiaoShuJu_QuZhiLiu[0];
& a$ s6 }# ^1 G, E. e
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
3 i1 }( u G& n) p4 U, Y
ix = 2;
# H/ @" `- W3 ~
exitg2 = false;
+ P/ t `/ [, z7 t1 P: X+ v1 E
while ((!exitg2) && (ix < 81001)) {
o* @3 w* v$ E
ixstart = ix;
5 v0 ]% i! W7 l, W! u
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
: ~3 q1 T8 }! y! K
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
# _8 |+ C7 j2 ~( y
exitg2 = true;
: H" m, e e( I' c3 B, h( I
} else {
- n9 [7 j0 W$ I8 z% t# ?
ix++;
/ B( z" D; U: ^: B
}
! S6 E" i$ E* a2 t4 V
}
1 r9 |, x8 B3 D K p; Y
}
5 ~6 W; @( Z4 D
5 ]. R y5 w$ t, y) r K9 K7 ^
if (ixstart < 81000) {
$ i, \5 V5 s z- I) l
while (ixstart + 1 < 81001) {
* s! {& F `3 u" N4 W$ T
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
8 T8 N, e9 }- ?
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
' Z3 E) n( Y, i# `: V
}
* I/ P. e; ~, E# ]* v
- Z& E% F8 h" e' z
ixstart++;
, V- h/ B& K. [" a- z
}
8 v" @. ^8 h6 d$ L- v/ N L* |4 C
}
' ]1 | p# J- S! j% y
5 n& ?& n1 r2 A: T3 s1 K2 ~$ o d
ixstart = 1;
2 g. O) n: j h5 G
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
' j+ K* a; o; ~+ N) i" Z4 Z! y
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
1 s# u! S3 H2 [2 s1 T
ix = 2;
1 _" f8 E/ w% m$ E4 }& K8 z. W
exitg1 = false;
6 F5 }6 `' P' C8 t# e9 o
while ((!exitg1) && (ix < 81001)) {
) @9 U& V+ B6 n; G. P
ixstart = ix;
7 z4 }. T! t% R
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
4 Z$ ~, _0 C! S8 z" D
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
0 C9 x) ]7 O3 O& Q$ \
exitg1 = true;
' o! V6 L/ b3 ?" f* h! m
} else {
( Y% G2 W5 Z7 E6 B% J6 v$ L
ix++;
' q, o. ]) V. |- D0 h9 ^/ C
}
6 h7 T: ~0 m: ~/ `6 _* L
}
+ f4 Z- q; b7 q3 n& u
}
1 d7 p& l5 H3 h
+ k9 o7 _. p$ \6 G( I; @, E6 Z& T
if (ixstart < 81000) {
- f0 b! q9 B5 s/ T1 m# B8 E/ e$ V3 w
while (ixstart + 1 < 81001) {
8 v: E' {% S% o& @& c9 d
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
7 z% C& i8 B! ?3 r& F
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
1 ^/ b7 }- `" e2 U5 f$ E
}
/ O& S- f6 \( Y+ Y
6 {1 ]' u! K0 g* M
ixstart++;
& f4 V; O( D. N- u$ a4 \3 X
}
: a$ G; l8 n! ~# l- ]
}
" a0 T! t6 S6 o! Q: b
# c5 M2 v" |) X9 w0 r
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
) b2 S5 o0 Y6 ]8 s& n+ L
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
! T5 z" `) i7 b: r# Y, W3 X
yiDuanShuJu_mean = mtmp;
6 B) l5 _" A1 Y- k5 U0 c
}
+ I+ a% F/ j: B# f8 X- L
+ K6 i+ j. @7 g8 G8 B
/* 找出极值 */
9 [- C/ ^ ?9 e, n, h. M0 H
for (ixstart = 0; ixstart < 81000; ixstart++) {
' l! p& Z. f: l8 ?
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
$ i" O. u* v/ H8 P; D3 s
}
$ W$ _8 C" _8 t( ]/ V
! y: Z( C7 u1 r5 H, j
--------------帖子字数限制------------------
5 ~* p2 _. Q8 c; B% L% ^
}
7 a# u% h& `2 M& _2 ~; c! P* c+ X7 a T
* \3 t; G/ d1 j( {: S
2 ~6 n K4 g# g4 v7 [* c' f
作者:
tenny
时间:
2017-6-8 16:37
会不会有其它并行的线程修改到了它
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4