嵌入式开发者社区
标题:
debug时程序运行的莫名其妙
[打印本页]
作者:
zhangsan1231
时间:
2017-6-8 15:50
标题:
debug时程序运行的莫名其妙
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
6 C/ Q$ U; g7 k* l- p
# N- t# o! O. u9 S; b7 n
各位大神:
2 X# B) C1 v& z/ [
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
. b- f, V7 O+ W6 l0 l: c* x; Y$ h; M
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
- P5 r }. p% G+ G- b& Y+ J0 Q
! X: G2 L7 e% C1 o2 _+ E. W
[attach]2441[/attach]
2 }4 Y- S1 m; a! O5 W# W
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
' i0 S; ?9 U& a$ d
D2 L, v+ ?: r8 d" ^4 j- \: J
并没有其他线程
: g# s1 [. \8 r; A$ m
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
% C( I1 b% E5 g3 {
也说不定是和堆栈有关系。。。。。。
' A. i8 M; |3 y0 ]. a
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
; r1 \ t0 c, s: W9 A
[attach]2442[/attach]
: G- P3 Z+ X. l
; L* C- _: G" u- b' t/ u
6 L, s& v: p6 s- a6 ^0 L
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
2 i; w& U, D0 n- j" t3 G
7 g! E( W; B" ^
' X" W& [7 \- A f) _' |
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
+ e- a, z) [2 |
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
) Z8 L$ _* y9 F, g# e
+ u$ O$ O( K3 y# W m
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
0 h2 [2 g/ M# W3 ^9 B
const double data1000[1000]) {
+ A# j5 Q) ~$ V: O; Z0 y0 U# w) d( f
4 S d. U# G: H2 X
int myfuck;
3 C+ x) h5 q# A" Z. U! R
double yiDuanShuJu_mean;
" t1 [! S) ?8 d
double yiDuanShuJu_LowMean[1000];
% y" e: x, K5 [2 b, x
int ixstart;
+ m q# z: q. ~! l1 P; J+ f
double dv0[1000];
1 B& {- \" F6 A, p. p
comm_AGC pAGC;
) L# n* [4 X. J
comm_CarrierSynchronizer pFineFreqCompensator;
# s" v7 R% ?9 k
dspcodegen_FIRDecimator pRxFilter;
) H+ j( y M: J7 G! ^" i d! t
comm_SymbolSynchronizer pTimingRec;
2 H0 q3 _1 Y, o. z1 t I
comm_PreambleDetector pPrbDet;
- N: z' M; w$ |/ E0 G
FrameSynchronizer pFrameSync;
6 e5 }- |' W; N2 W3 h" c
QPSKDataDecoder pDataDecod;
% C w. L1 Q( ]1 g8 C. H
static double usable_left_filtfilt[81000];
9 ]- J0 n3 C/ o5 O& F3 M2 {1 j1 [
static double youXiaoShuJu_QuZhiLiu[81000];
7 X* w& e( H* ]; H c
double mtmp;
$ d% d* r5 d, v+ c d& _' r! a
int ix;
* V: |. E7 @; V
boolean_T exitg2;
0 {+ [( y Q* u2 |
boolean_T exitg1;
) C% b8 m# M) y- `# X: L' |
double YiZhenShuJu[800];
8 v' F( y- m5 M/ U0 Z; J
double dv1[800];
}+ a7 s2 l) \- x
! k, Z6 N( x' C' H) l3 C
' f! K$ [. H+ q" K, D+ `
double b_YiZhenShuJu[800];
- W( l L! Y5 O! ^" p# y
double I_filtfilt[800];
. d2 A6 [) d. \; c
double Q_filtfilt[800];
4 D; O9 M+ t) ~8 g( Y
creal_T b_I_filtfilt[800];
4 u" C: p! ~1 n+ f0 a% p$ d9 N
creal_T b[800];
4 E& t& y7 W# D, H' H& e
creal_T RCRxSignal[50];
5 L3 P( R" m" Z/ ?, @7 Y- u( T
creal_T fineCompSignal[50];
$ t% Y5 d3 O" r
double phError[50];
/ R6 g6 x% D; n8 f. W8 V9 Q7 m
creal_T timingRecSignal_data[28];
/ ^. `/ x# |' ]4 B
int timingRecSignal_size[1];
$ F5 M3 A0 i1 h( e5 H/ l6 Y$ D
double prbIdx_data[28];
& e7 Z. N& u: F* [, W7 o
int prbIdx_size[1];
. u$ a# ?' j- x
double dtMt_data[28];
0 G( z3 a# D4 E3 {
int dtMt_size[1];
1 ? C4 S4 N o. Z! X* b3 {9 }
creal_T symFrame[25];
: k- _ V! X- n2 p9 V
boolean_T isFrameValid;
3 w \, A# A" B
double unusedU0[3];
0 W4 n% O9 ]2 Z0 z: _
, R) R# x1 \8 ?
//调试过程中的变量
9 p5 Q: [* Y/ p0 _$ I% g
int enough_data;
& Y& P- l3 O' J G$ S2 i
0 r8 _" C' I% ^
int enoughDataFlag;
4 S" n. F( U5 W7 {
int yiDuanShuJu_mean_int;
) X+ m- d& s7 I& ^- h
int int_sum_dv0;
# l3 k2 @5 t8 Z# t a
int oo;
3 I# \+ C$ ]& Z5 T9 F. l' W& I
int ii;
4 U/ n" [& s1 Z4 N2 @+ W0 m6 G
myfuck=10;
4 `4 F; n9 X3 A3 J& B: X: O
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
% a1 \- b7 a8 M
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
+ @5 Q5 k' }" |3 a
3 H! C' J; N: W0 m
yiDuanShuJu_mean = mean(data1000);
" }4 @8 I- i7 f
. n1 U- V" a) H/ j
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
9 D' v( t# ~" c$ W, ?
UARTPutc('A');
% X9 Z' x% t a1 z
UARTPutNum(yiDuanShuJu_mean_int);
! n/ r0 Z3 z S% F$ Q2 G9 e
UARTPutc('\r');
; N# b+ r4 f6 w3 G: _
UARTPutc('\n');
/ @# ?) _: a E& }6 q
3 f: _; {8 u# s1 l7 e- b( C
for (ixstart = 0; ixstart < 1000; ixstart++) {
' w% c: q% F0 N0 b$ i, T
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
* H- t* q% K! I& D
}
. m- e; E# A2 E$ ^7 L5 E' }. l' [
7 m; O( s: |" D4 o1 J( Q0 U% v
power(yiDuanShuJu_LowMean, dv0);
. S* {" @5 Z/ n6 F( \9 {
* D& t q' \! T- R2 p. e6 \
int_sum_dv0 = (int) sum(dv0);
, [. v4 ]' d0 K6 L7 C6 a( M
" ]+ K5 D+ d3 ]& u4 l
UARTPutc('B');
( L) K6 C. q( f/ p& J
UARTPutNum(int_sum_dv0);
9 `* d% i9 l C! }' r
UARTPutc('\r');
+ W0 n+ k3 T3 H( I. Y- n5 y# X
UARTPutc('\n');
0 U/ { E4 m1 [4 W3 }
) m7 k7 l9 H& u ]
// int compareFlag = int_sum_dv0 > 1.0E+8;
! I8 Q/ ?$ g, }/ P( ]% d3 Q
# j, `7 D& ?8 U
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
; z1 n: Y: |. R3 p+ ^
UARTPutc('C');
- g D& A, m& C( ^- v0 |3 s# I
/* 比较信号能量 */
3 r8 S/ j! T- j( k0 a6 D& V+ a) `. f, o
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
: {; }* G9 V+ E, u
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
5 f Y: f7 `1 X- ?% H* b
// for (ixstart = 0; ixstart < 1000; ixstart++) {
; H: w C: C8 v1 i* p: S2 ^$ [
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
. g) ~# v' {$ Y! z! f
// yiDuanShuJu_LowMean[ixstart];
' y& f$ K7 A; _& |1 R/ Y6 B
// }
) ^0 E, ?# Q6 m& t" y7 L
//
4 ~% p" R- j6 w' p: ~8 S$ L
// youxiao_k++;
3 ?% h4 u; S F
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
- q8 h7 x) ~( q9 _5 m n8 A7 r/ ^/ a" a
// /* 感觉要取21个数,即0-20, */
4 x) [% Y$ U O$ l: h
// enough_data = 10;//有效是10,无效是0
! |! v( { r2 h' g8 s
// }
. W" e' L |/ c7 w
}
1 W! |0 W' y+ \! h% c
. B* e" m$ h& s7 e) Y1 \
) x2 C. Q; P1 E% b7 @/ B+ a( D
enoughDataFlag = 100;
: S7 \! H1 _$ n9 V @1 j! {
enoughDataFlag = 1000;
; h7 V$ ?' `8 R$ Y1 S
enoughDataFlag = 0x02;
3 v9 j' n# H* K1 X
enoughDataFlag = 200;
# J/ X( ?' S7 [+ Y% S- x6 p" Y6 m
5 [! i4 W, W. F' F
int myfuvk1;
: v1 B4 C9 F j: B. e6 h
myfuvk1 =11;
9 k$ c- s2 C% R. G7 D0 k7 Y
, b* b. q+ }8 G- j
- i. h5 \4 D4 L7 M( @( `& J$ S$ P
enough_data = 0;
) P" v6 a5 N8 m% H
( i7 y1 G V$ z1 g; k$ q) Y
// if(enough_data>50){
9 y; D* X& p8 b5 D6 t9 {/ c
// enoughDataFlag=0x01;
1 S8 }- x! \6 w6 t3 G7 T& [; J
// }else if(enough_data<50){
6 q% y q$ Z0 q# ]& _ O3 a
// enoughDataFlag=0x00;//0x00还是不行
5 }4 ~! u% p/ m, g
// }
' s# F" O, U( H/ X/ @9 p4 Q d! d8 N
6 q- l, N) P1 I O- x
( L" S3 q0 Z! l+ U9 i) ~
oo=10;
" ] |. t; F' Y4 W( G: D( Q
oo = oo < 5;
3 i* c: l! q8 O8 e8 B' W1 J
if(oo){
( R9 @/ I' ~( |, W
ii=0;
$ p* r- q5 T b: X" z( ] r
}
8 ~* k$ l% i) F/ V9 s0 r& O
if(oo < 5){
6 ]0 x2 |' r' y8 X
ii=0;
u2 J5 O+ v; h$ D
}
% T+ W. S; ^: x9 e/ Y. R
if(oo > 5){
: q+ F, K' `" J8 y
ii=0;
" d" b9 V( V b5 P. r. h
}
, z" Y( k) r* v3 \0 o: {3 _9 J# A
6 _$ l2 E: v; m( |/ H" l7 Z
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
7 j2 X( b5 O1 v; n" F& {
/* 如果数据足够才执行主程序 */
- q" @9 F0 z6 S+ m
oo = oo < 5;
4 Y4 `8 L- ]$ Q: P
enoughDataFlag = enoughDataFlag < 5;
* D6 }# p1 H- `) O, R- Y
if (enoughDataFlag < 5) {
: U9 k$ b- c+ w, H
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
& ^/ e- y# z! y
AGC_AGC(&pAGC);
) K$ T2 f7 I, ^6 m
6 T7 z; W0 U! D& E) v/ e
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
- A% `2 r! ?$ J% c% L
FIRDecimator_FIRDecimator(&pRxFilter);
+ Y+ ]9 v$ M" w. J
% U4 U( w! h! W5 M: q9 I8 @0 K9 O
/* Downsampling */
8 F. ~) _1 P. c- h1 Y
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
2 M+ r0 x) v( j* \9 z ]
& W4 g! R6 i$ y
c_PreambleDetector_PreambleDete(&pPrbDet);
- E# v! \9 D5 A2 K( R+ _
/ h$ O" E/ {) ?9 m& j
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
4 v9 o" T7 P! v5 @) O+ ~8 f
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
1 R" V9 K" D" O5 n2 ?7 _1 z/ `
/* %帧数量=100 */
2 m8 K+ Z4 ~ J' R0 o
pFrameSync.isInitialized = 0;
4 y* `0 T6 C- ^3 L' T I
. y) x, p$ u. x
/* [EOF] */
9 U0 e; i/ ^( f& Z6 K4 P9 s
/* 前导码长度是13 */
1 {' c( C) p J4 x+ q0 f& d
/* %qpsk */
4 n; M- C) x2 Z2 F
pDataDecod.isInitialized = 0;
9 p- k4 H0 t, u+ B& C% c& ]
4 B4 E; P) b4 X1 q6 C# w1 J$ E* x
/* end */
. f, D8 i4 |4 o
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
" x& b, U& m9 q& r2 R
/* Convert 3-dB frequency */
5 y' K7 W& O$ E# n" }! _- a
/* Convert 3-dB frequency */
Y3 z, W" c7 T# J* o+ R+ u
filtfilt(save_buffer, usable_left_filtfilt);
) c; C5 [8 @& t1 h) U
for (ixstart = 0; ixstart < 81000; ixstart++) {
" s: ~* `8 \6 y
usable_left_filtfilt[ixstart] *= 2.0;
8 d4 Q3 N1 ~0 l
}
( R6 V7 @7 }4 c7 Z" g! L
1 L- o9 y2 ]# v: L8 V5 T
/* 注意乘2,处理幅度 */
: u: D# N, j4 A5 q! w1 Z! o
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
% z' a- d4 f1 y5 x1 [! c9 `
/* %% 行列转换 */
9 D: O7 @* R# q( E1 Y# [2 W6 e
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
/ Q8 z8 t$ k+ s: ~4 `, H0 k! j
for (ixstart = 0; ixstart < 81000; ixstart++) {
/ `. O% e' g: I9 `- f
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
" y5 d+ f/ h8 B5 n6 V
- yiDuanShuJu_mean;
) J) l) L' I% D0 h$ a+ H0 q! ^
}
, y' L, { y1 @' ~6 F' p
; P8 O& k! O0 V: l- Y
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
4 o. l- v, J% r& U0 B
ixstart = 1;
$ x9 n: o' h; ^& W' \
mtmp = youXiaoShuJu_QuZhiLiu[0];
1 i7 V, \, y G7 x: {
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
' k6 u6 U1 D% Y p" N
ix = 2;
$ q$ N% R9 Q; g' |+ B) X
exitg2 = false;
3 J3 l& M. e1 K# ^4 A, I7 l2 @9 _
while ((!exitg2) && (ix < 81001)) {
$ e( x/ \4 V1 e
ixstart = ix;
1 s0 k- _1 N9 p: T
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
. W6 [; B/ R7 r0 M. k& N O: F
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
6 \; V/ H9 W5 _4 J9 v; q
exitg2 = true;
3 H7 [4 H# G& }2 _9 p
} else {
( V$ d4 a4 }/ v- W2 y
ix++;
% K- r+ E6 T( }" O
}
/ i: g4 `9 W& O8 `
}
% H J5 n R/ D. k* X
}
% r# U' k( g6 T7 [
4 F; m& K' c: R; T
if (ixstart < 81000) {
0 [3 x" f. F3 u3 y/ \3 U, ^
while (ixstart + 1 < 81001) {
6 `9 l8 n u1 V
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
. [1 t, b6 I& H+ C
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
4 v! [% o2 _6 v( B, W$ `
}
. [! j4 l; N R& a
% |- g+ a6 G f4 `5 L: i# R
ixstart++;
% _5 D B8 U: a
}
, p: Z; y0 J, L+ t
}
9 D' `1 l, E% ?
6 m# d8 _+ r, J
ixstart = 1;
" W' p. ?* x0 e' d4 W
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
8 L; [, U2 `3 V
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
( B2 w2 o2 ~8 b
ix = 2;
) J6 |. b6 |3 y; z$ C
exitg1 = false;
, {# Q0 }% ^! j
while ((!exitg1) && (ix < 81001)) {
/ R/ _* m( f; B8 e# B5 Z3 i
ixstart = ix;
, T* g- V2 j# S& ]. c
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
, X% x- P! q4 T- a7 f
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
2 r+ C* o, w% y) X
exitg1 = true;
1 v0 u* D |9 l) z
} else {
6 V6 k" o" s6 [( g7 z
ix++;
, F0 _' h. [: M' C. c
}
e8 T4 H4 t! r$ r/ O7 F
}
/ U0 M7 a, J' B
}
8 G: I4 X. r+ y0 B5 \2 [
7 r6 I2 o6 O' j1 c; ]
if (ixstart < 81000) {
V& \' o, F! X8 W
while (ixstart + 1 < 81001) {
1 W- o# K0 S- T
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
. [2 W M0 u9 L* a* B, _
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
5 U: y: q/ Y0 {$ `" I" N+ W
}
& ?& q6 m( N. k3 M% J
0 H: {, i# z! v, u" s
ixstart++;
9 _6 U8 T; b5 E0 y0 d+ l9 V
}
) g5 P1 R* B6 c1 ?$ u
}
+ X g# [( u* ?
& P% o% k- M2 I# J8 n* C% S
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
( Y r( c3 o0 O
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
* u( ] h0 s7 ?( U# p3 x# M
yiDuanShuJu_mean = mtmp;
# a t7 U6 @; x9 k+ p5 o
}
( d3 `& Z0 Q( O2 L" ~: C
* g0 |: D; r) [. ?1 _1 [
/* 找出极值 */
; ?; i2 M) |' g/ {, P6 D
for (ixstart = 0; ixstart < 81000; ixstart++) {
I0 ?$ v% p* z! u/ R5 L2 l
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
. i, P$ B8 K$ G: |" `
}
/ G3 H8 e/ P# C' ^5 ]0 S- X
- d* O% i% {, g% U J0 J
--------------帖子字数限制------------------
/ m- p* B, q* ~9 _# O
}
* r! ?( `7 m5 x3 j9 l- q, Q* H4 X
3 Z/ }9 Q; Q* n4 v. K2 ]) x
0 `9 G; v4 m& L$ ]/ S. F+ c
作者:
tenny
时间:
2017-6-8 16:37
会不会有其它并行的线程修改到了它
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4