嵌入式开发者社区
标题:
debug时程序运行的莫名其妙
[打印本页]
作者:
zhangsan1231
时间:
2017-6-8 15:50
标题:
debug时程序运行的莫名其妙
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
, {9 d" h0 [5 K! X( R
# T6 d6 T$ j% G
各位大神:
! C! l9 i6 Y- g
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
# q2 m& r" z R$ E" N: x. z1 M+ L
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
3 L5 u( u9 H' V
4 `/ q% N0 p* [7 f6 w# Y! H
[attach]2441[/attach]
0 o1 r' H2 O+ |
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
( W% g$ v3 x7 Z4 q9 D- R) t1 {
+ ]* y: r9 I+ e3 @3 U: U
并没有其他线程
. N( n, ]6 p3 G
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
$ k. k/ t& U' C9 j U; |
也说不定是和堆栈有关系。。。。。。
* |( _5 W# o4 @! o5 Z4 R
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
~1 ]/ ^. ^- S/ i' Y
[attach]2442[/attach]
. U2 A/ t/ V J' W# n- h& g
+ G$ z* u4 g9 X3 p/ X9 Y8 p
3 i6 }; e2 `! Z/ h! Y* p, Y1 N6 i
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
5 k9 V# |( d" O6 A% _" m+ D j6 e
" W1 _! ^0 U' ?1 |7 i6 L
7 c/ C2 L, b- X' E1 U
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
2 W% [& d9 q+ c4 D2 K) I" ]2 W E! A
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
6 U, v1 _- `2 t$ v& y+ |* z
- ^2 }% i. U1 W5 k3 `
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
/ ?3 P _' B+ C: w; T- V! T m
const double data1000[1000]) {
" g* t @; ]* ?# P! f6 L
# l: D) H9 c3 V- p% @+ z
int myfuck;
1 s) y. e- k$ E6 C
double yiDuanShuJu_mean;
4 I. [- F" j, ?! V9 U
double yiDuanShuJu_LowMean[1000];
# X) q, X; L |6 T. A6 {
int ixstart;
+ ~1 o% h j4 R
double dv0[1000];
$ Z! x0 ^: U1 k$ w, N2 A! g
comm_AGC pAGC;
' U3 o6 ?: ?! P7 x5 `
comm_CarrierSynchronizer pFineFreqCompensator;
2 V) q" K1 A8 O6 B
dspcodegen_FIRDecimator pRxFilter;
2 q% M- W6 c6 g; }
comm_SymbolSynchronizer pTimingRec;
. D6 i& ?8 a+ a8 y3 y7 ]6 J, `
comm_PreambleDetector pPrbDet;
: g9 o" y% a3 F Z; W' V4 z
FrameSynchronizer pFrameSync;
- d2 e+ J: v/ R$ f) v
QPSKDataDecoder pDataDecod;
, n/ Q6 n) N0 ^8 e# G( [# q0 H( D
static double usable_left_filtfilt[81000];
6 m2 O( |$ o' X( U6 |
static double youXiaoShuJu_QuZhiLiu[81000];
5 {) N+ o y; L6 a
double mtmp;
7 C, ?4 H6 O3 [3 U. o
int ix;
7 o9 ^: q' K1 }/ l
boolean_T exitg2;
2 S3 m+ ^8 `2 z/ }2 j8 ]6 \3 k5 P
boolean_T exitg1;
5 c- H6 Z% W5 K f5 J0 [6 ~
double YiZhenShuJu[800];
# C, |( m4 j6 Z3 _9 H2 I" V
double dv1[800];
/ ?8 W, a- K t" t* |
0 l% d- p' k ?9 \; P* m5 s+ m2 Z
* V* `! g) J( G" j& y7 ]
double b_YiZhenShuJu[800];
$ ]8 G, D$ y& |
double I_filtfilt[800];
- i- Y2 W; m( d! Y
double Q_filtfilt[800];
4 W X0 V1 Y2 M6 b/ ]; O; d
creal_T b_I_filtfilt[800];
) { O3 O( x- ?: J9 i
creal_T b[800];
8 X) {8 M; j0 m4 B, o
creal_T RCRxSignal[50];
- x1 v Y& k9 q8 A. m
creal_T fineCompSignal[50];
- T% |) j; W7 Y- a9 u/ A3 c: r
double phError[50];
: R1 L! w [6 ?3 d4 M, q
creal_T timingRecSignal_data[28];
5 Z1 ]. A! e( c
int timingRecSignal_size[1];
& f: r; B, N2 y5 u% `, c
double prbIdx_data[28];
7 ^9 m& Z G. Q9 \' h
int prbIdx_size[1];
- h+ f% V. p1 X: R8 c% f) d! s. [
double dtMt_data[28];
2 J9 f9 o0 t4 J/ z/ l. _1 ?5 k
int dtMt_size[1];
/ ^3 @9 ?1 }! A
creal_T symFrame[25];
9 r- E8 q1 n: A' M# D+ c
boolean_T isFrameValid;
5 ?$ o( Z5 L0 ]* [+ e9 }
double unusedU0[3];
8 H5 a# P. q3 O4 I7 j( x# S
$ Q: H$ v- Z, Y& O2 Q- x
//调试过程中的变量
2 m% J7 G6 I: T
int enough_data;
) Q/ J* b# X( p1 S0 `/ q% M& |
5 }) @( ^& `$ \ Z
int enoughDataFlag;
# ]0 L+ Z" d, f" b
int yiDuanShuJu_mean_int;
2 F; M% f) y' k
int int_sum_dv0;
" I1 C1 G5 g' L/ M: e$ E5 R
int oo;
: M9 \5 ^6 n/ B3 T- A. R
int ii;
/ O- F: e, Y) w: {$ n! D9 J" X
myfuck=10;
3 e# a2 f, U+ k6 |4 N% H3 l! s& L
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
+ ]' C6 D9 g) I+ [' R0 N
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
% E& L6 }9 v4 f' C K$ H5 \
* P3 }0 }* B& [: i+ C& V
yiDuanShuJu_mean = mean(data1000);
: p- X# ~6 x$ A9 S
8 P2 B* N7 Z3 B# K7 B. j' V, {
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
e4 m' Z! v# P6 A) n" M
UARTPutc('A');
2 c/ a* G! ~4 ]9 a2 Y7 \( R
UARTPutNum(yiDuanShuJu_mean_int);
7 O4 I, ^, h+ I& s/ J
UARTPutc('\r');
+ A# Z; D' O) Q0 @& w8 r# ~
UARTPutc('\n');
( W. [ V0 B/ z3 M/ i# J
; F; z* i/ |0 a* `
for (ixstart = 0; ixstart < 1000; ixstart++) {
# P1 [! c2 F8 k* d/ X
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
, H7 y2 u. f# ]
}
- F5 [( r% \/ W
* e; t0 w0 O; W# C: w
power(yiDuanShuJu_LowMean, dv0);
# B' q/ U6 q' S: Q X
4 M5 m% B/ p+ Y, j! h3 B0 [7 Q8 D
int_sum_dv0 = (int) sum(dv0);
. J X" F) s. f) D8 X1 v$ k
4 y- a4 @: L# d; F
UARTPutc('B');
# y$ ^! J- e" P( M: z! K
UARTPutNum(int_sum_dv0);
- G- J- O: m) s; ^1 d
UARTPutc('\r');
0 g' J, _5 X! e2 q4 m
UARTPutc('\n');
3 _+ B7 L: Y* }- I8 V
( A1 S# J1 e$ D
// int compareFlag = int_sum_dv0 > 1.0E+8;
8 a0 P7 Y7 F' N/ C8 e! m
( r5 i4 B* m5 _$ j( Y! O
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
8 {# K0 W9 N7 j: w E
UARTPutc('C');
# `% q; W; g, C- E3 l+ N5 b
/* 比较信号能量 */
( o+ R5 p) n8 I3 `4 C
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
$ K4 K# M& v: _* N- o2 S
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
# _% ]1 J/ G4 V5 B' |$ Q
// for (ixstart = 0; ixstart < 1000; ixstart++) {
* I. R( G- b6 d v4 ^+ \ E& V( v
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
) P% d' }+ h# \, B2 T
// yiDuanShuJu_LowMean[ixstart];
D4 v$ M7 n8 ~* E1 Q9 N( E
// }
1 [: r& _8 D3 p( y
//
1 D% R+ t/ M; |3 _: e8 m# l
// youxiao_k++;
2 d" k7 N- W! T& T
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
; y$ e7 X5 Y# [; u8 p4 D9 e
// /* 感觉要取21个数,即0-20, */
0 l# x, |/ u- X# ~" k
// enough_data = 10;//有效是10,无效是0
: T" v. m5 a4 |( f: X m/ B
// }
l1 d- ~' o& u
}
7 w& I1 m6 B$ k. Q# I- L2 A
% O( E3 x0 U( Y/ Y! L
; p: M0 h- A0 J- E. ~# Q" a$ j1 @
enoughDataFlag = 100;
2 l% o. P" ]' z3 F
enoughDataFlag = 1000;
- X: @% y; K) `+ |7 z1 N! S4 ]
enoughDataFlag = 0x02;
+ ~& Y/ w8 Q5 B6 l1 E$ T
enoughDataFlag = 200;
8 U z- V: Z7 K, E( V1 p
5 }) P5 i8 r+ L) b! ~" H3 ?- i
int myfuvk1;
# i' F* z. n, p) C$ @
myfuvk1 =11;
* p6 X- q4 v- Y. f# z/ z _) l
6 K) U" L* B8 a v, V! |
/ M- Q+ F0 h7 E/ m' |/ S8 N2 j
enough_data = 0;
7 S7 C' x- T A
- D. F# C# Q+ H
// if(enough_data>50){
( U ~& ^/ J5 J9 y. Y2 J9 j
// enoughDataFlag=0x01;
, U3 y) }9 x& D' s$ N# w! L$ w
// }else if(enough_data<50){
0 ~" ^8 ~3 r2 y/ u9 D! g
// enoughDataFlag=0x00;//0x00还是不行
7 k. n5 H$ v$ Q: x2 J
// }
- b- a6 L0 [ `& i$ J
0 Z2 p; T* r5 } K: r6 i
5 T- s2 Q; ?2 i& a
oo=10;
) y1 {) O: q/ E u- V! [
oo = oo < 5;
# }6 J& w3 Z- `6 x
if(oo){
! L* C& @: p/ A( U) ` [0 ^ i# t
ii=0;
& h* V- T9 y) d9 u2 s
}
% o v7 C) D4 ?3 o( y1 h
if(oo < 5){
A9 P: x' _8 M2 z) B9 h+ W( ^4 x0 W8 ^
ii=0;
2 y0 r1 N% w; H
}
( ` M, i2 x8 [5 h" F2 W+ w4 u1 v3 [
if(oo > 5){
9 K# O" [- p. V* y) g
ii=0;
$ n- C6 _$ Q4 l6 v2 G
}
Q5 N- D' ?) y. G2 ?1 A A+ n
: A0 }6 K) T5 J4 z7 C5 y9 Z4 k
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
$ E! H! p& @8 J. T, ^2 [
/* 如果数据足够才执行主程序 */
8 _/ `% Z: v- f, o1 c/ J
oo = oo < 5;
9 z5 [& C9 c2 q' F0 s( y
enoughDataFlag = enoughDataFlag < 5;
}1 e* [- Q; x% ]
if (enoughDataFlag < 5) {
$ A0 Z j6 U6 U1 X# z, f
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
, g7 {" C8 {: q+ h
AGC_AGC(&pAGC);
+ ?+ _1 \4 b$ p9 r* i
0 x& ?+ F4 j+ ?! c
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
, Y+ j" ], f2 p6 W" Q2 ?; E6 N
FIRDecimator_FIRDecimator(&pRxFilter);
W# u/ W8 } m* A3 _; s4 Y6 S
$ w4 A4 m; M! ]$ `7 h! r* P
/* Downsampling */
: w3 v2 C/ T2 T* D/ v
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
; }! B9 J" t) S2 v. O$ `" ?
* O# M$ H. I7 H
c_PreambleDetector_PreambleDete(&pPrbDet);
# f$ J" g1 t2 f) v4 H T1 E! W
: F2 v9 R! k; ~9 n+ v& {, _4 q8 i8 @
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
7 z$ W3 ?6 K, k
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
. k5 i3 Z/ D# `) |+ W5 R
/* %帧数量=100 */
5 }' a, ~( w9 E
pFrameSync.isInitialized = 0;
# E" K/ ]9 {* O5 h8 f) k9 m7 ]4 |
- i/ k/ q* R3 y. J- V$ l
/* [EOF] */
$ W o1 `) o l! M5 j3 I9 J4 c t& Y
/* 前导码长度是13 */
- D# v( \7 w' o- A# l
/* %qpsk */
) e$ y5 L/ r. p- O
pDataDecod.isInitialized = 0;
* k& b6 R* _/ a
* l; k, z/ r4 p/ x& f5 g
/* end */
7 z* `1 e3 p4 y- E
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
( _2 y0 S' D. f, z
/* Convert 3-dB frequency */
, h: W8 \% }# w
/* Convert 3-dB frequency */
+ z% }% X& n; s6 ^' o* ]; ?
filtfilt(save_buffer, usable_left_filtfilt);
9 v- O% I0 f% k7 m0 D
for (ixstart = 0; ixstart < 81000; ixstart++) {
% f. p7 e8 V) C
usable_left_filtfilt[ixstart] *= 2.0;
) r% z+ C; H, S2 ~7 G/ P
}
( v. s; O& a6 H
9 L# ]- W" k. b; n! y- c8 R0 ^
/* 注意乘2,处理幅度 */
, F+ O* \ ^" X" a) R
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
! Q7 m2 Z0 I/ {* c
/* %% 行列转换 */
0 x& ~- c# ?2 X. D! ?0 `, _9 ~
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
* ~1 U& ]+ F4 O: D! K* E
for (ixstart = 0; ixstart < 81000; ixstart++) {
+ K5 z" _% s f/ y [/ w
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
% O- G7 q4 ]. _( e# N3 }
- yiDuanShuJu_mean;
3 B$ q# K8 C! s! n( q/ h
}
1 C2 J: ~; V7 X% o
6 K P- L- j, T" w+ Z7 g
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
$ y) I1 C7 o; v& p4 H
ixstart = 1;
4 z9 x1 q; p/ v) q
mtmp = youXiaoShuJu_QuZhiLiu[0];
- w/ M) K7 g, c8 N+ i' l( d
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
. K1 I& R$ s! V. I4 m3 I& Q; U; F
ix = 2;
3 F+ V9 G; K$ W1 K+ V
exitg2 = false;
n$ n* T+ {9 R' V
while ((!exitg2) && (ix < 81001)) {
6 N1 u7 D) o. w4 r J3 a* r- `) a/ ?
ixstart = ix;
6 c6 v4 }+ i5 r
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
6 L' W3 T/ W3 U- e8 c4 Y
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
: c8 U! Y- \3 W( y! v/ V _, g$ e
exitg2 = true;
" e, u, Q+ Y6 L5 ]
} else {
) S3 g# M4 Q* ^9 P! q+ n+ \9 j- K# f
ix++;
|; l, h& ?; l' G8 t7 @
}
' s/ k+ n0 c- Y
}
+ f! B6 {/ `! J4 ?( R
}
$ B' q4 d+ b. g1 r! U
$ K' q: K2 j$ s5 ^) ?
if (ixstart < 81000) {
* l! ^ \0 [& o+ c, ~1 `/ R
while (ixstart + 1 < 81001) {
+ L6 W6 N+ H. T0 R
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
9 F. h0 k$ N: H- Z' j" I3 r: Q
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
% A, A ?6 g3 M5 p# L0 ~5 A
}
: H& q( m* `, m$ E/ }0 R
, N' N* w2 u& a! _1 Z( d7 l! x: u6 D
ixstart++;
* m0 X5 ?: y# ^
}
2 u. y- ]/ Z2 j+ z$ D
}
) g5 i1 q3 v \1 U
. W2 T _' A3 y
ixstart = 1;
4 J* ]: f5 y- C8 j
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
3 ]' `1 t; k& g: m, M' h
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
% N# w& O! D D! M: Q
ix = 2;
$ ]2 T5 j1 n5 M3 X
exitg1 = false;
/ {9 o0 L1 V4 ?0 P; v; k
while ((!exitg1) && (ix < 81001)) {
+ T8 J5 T, r* R, B
ixstart = ix;
4 Z1 L, g. c8 d8 m* e1 ], V+ f% [1 v
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
0 E0 C0 i% V; L* a+ b- K
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
K* y$ C) n6 L
exitg1 = true;
& [ d m) \" E8 ~0 X
} else {
A6 v! w, {6 N. p! T
ix++;
9 w! F) ], b& i5 o3 R0 W6 E6 j' P
}
7 [8 I! v p, K, a
}
& M: B& @4 A: f" P
}
! q O" j* }: M5 P& T. G9 O% `/ B
+ Z3 \4 L. h% c r% m
if (ixstart < 81000) {
. w& p* H$ U: B+ x8 u7 H: j \1 a A
while (ixstart + 1 < 81001) {
* @. V* l, E8 x7 n- v+ A+ [" x
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
: O w% |$ n0 B
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
. v% ~* u( | ], H* B, W s! J
}
- c0 R) a5 ^9 W$ R- O
% f/ r7 f1 H" c( Y& ]2 E
ixstart++;
. @! u4 d C. ^ ~
}
& `$ c& ?0 K9 I, x* n
}
% V& `- x! E( s# [9 q" |* A" F
4 m$ C6 V: V3 c" o
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
, \+ J2 I2 [, x
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
2 M+ k! T* {6 F Y
yiDuanShuJu_mean = mtmp;
! s* ^ h# B9 a% Q
}
+ d/ v* z% R( V
! i- Y0 r4 p5 M" [# A
/* 找出极值 */
9 ~, P# _. g. h c% n& K
for (ixstart = 0; ixstart < 81000; ixstart++) {
7 A+ T. `, t3 V
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
( d. J+ C5 R5 l* T9 |, z
}
& {, _0 g7 ^6 `
; n7 U I& ]- r- Y5 L7 L
--------------帖子字数限制------------------
: W+ |) t" i) I2 a9 x) m; g
}
. w0 a! Q1 K! Y+ v
( D5 L J. Q* Z1 y9 ?9 j# H
; y) a, r" r3 c4 y- ?
作者:
tenny
时间:
2017-6-8 16:37
会不会有其它并行的线程修改到了它
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4