嵌入式开发者社区
标题:
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: o
2 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 r
0 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 t
0 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( X
6 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' y
4 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" ]: W
2 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