嵌入式开发者社区
标题:
debug时程序运行的莫名其妙
[打印本页]
作者:
zhangsan1231
时间:
2017-6-8 15:50
标题:
debug时程序运行的莫名其妙
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
. E& Y; T9 n0 h& o6 A
) G7 I3 p5 c+ ^' R
各位大神:
8 [. `0 R5 b- e; Z4 q# @
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
$ d6 U0 T9 k K6 O) a
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
; M# A8 }) e+ ~0 ]
m* {9 l3 t. g& Q( U$ _
[attach]2441[/attach]
, n: ]0 e# Z5 R' r
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
' x7 ^6 M( F1 O b0 E# a6 r0 u$ N
# K5 R6 f) \+ z% ^/ C
并没有其他线程
# ~6 Z* x- B, J _4 \% M& C
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
5 r. k. o4 n3 L" q. n' h6 u m
也说不定是和堆栈有关系。。。。。。
9 M: r& W/ A! G ^8 F! K
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
8 c2 P$ v3 ~2 F O( x& y" B" c5 a
[attach]2442[/attach]
, o# Y; t6 N6 v# p0 D) S
* t8 y# p8 O# C, v- X. r( j
* y# h5 b. ~4 g* }% o0 M
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
- `% H8 p3 U* H. b: {& b) C* P
$ D# n; [% A" l( a! u8 J
& @# d* a. \2 M7 F8 u2 Q; X
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
( w: l& J0 r" u! R" R" `; E
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
6 W. T/ U! V: D# K
( A3 E$ o5 w6 A* {8 l* N; S
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
. @; v; J2 l0 |' v; W* {; a
const double data1000[1000]) {
u5 N& z6 X+ L7 V) b. Z& k4 R- H
$ ^- y) U+ L" \
int myfuck;
7 m6 z0 r$ i, C& ]/ T9 x/ S
double yiDuanShuJu_mean;
! j! z @: _! o Z" J+ y+ W& b q
double yiDuanShuJu_LowMean[1000];
9 `* p) F3 S+ h0 \4 g
int ixstart;
8 s+ T' ]3 y/ }6 x! x0 I
double dv0[1000];
- E9 G9 @3 T% V3 x8 K
comm_AGC pAGC;
, v& a, [9 }1 P) K0 x
comm_CarrierSynchronizer pFineFreqCompensator;
% r0 P; _! Z6 X$ _( W7 i: n
dspcodegen_FIRDecimator pRxFilter;
1 m. `0 N% B4 P5 o) ^7 I4 `6 m
comm_SymbolSynchronizer pTimingRec;
" |/ Z7 F T! Z2 n& R8 L) e1 y4 [
comm_PreambleDetector pPrbDet;
6 F5 x" V* L/ ^( D+ y0 I% m; E
FrameSynchronizer pFrameSync;
/ b, F/ v- _* f- D% o
QPSKDataDecoder pDataDecod;
; p6 M }! ^; Q
static double usable_left_filtfilt[81000];
5 e/ C# z) w- w7 T& `7 r
static double youXiaoShuJu_QuZhiLiu[81000];
! R2 V3 i+ z2 a! t
double mtmp;
0 L) ]2 h6 J5 W- {/ ^0 `9 c
int ix;
1 i9 r8 F2 r" [& a- m" F4 o
boolean_T exitg2;
: P' R* K" _& Y6 [0 I% i3 c+ ^- n
boolean_T exitg1;
3 d; B1 j! [) ], j( ?& O: O
double YiZhenShuJu[800];
1 a" ?1 D4 \& Z0 `# g
double dv1[800];
! k% ^8 y+ M8 Z& ]2 P* o
& V/ [: ?# A- [
" } G4 W7 l+ Z6 C
double b_YiZhenShuJu[800];
0 d; A, W* a% B2 w
double I_filtfilt[800];
6 d! }! ]9 z% h$ F% V3 o! @- H0 h
double Q_filtfilt[800];
: T) E& _7 L- L3 ?% L1 ^
creal_T b_I_filtfilt[800];
$ s {6 N5 [ w2 ?9 {. ]
creal_T b[800];
7 I1 p7 q5 Y2 O- I9 s) o& z+ e
creal_T RCRxSignal[50];
* ~6 f) T1 N# s, E
creal_T fineCompSignal[50];
. e- B( g" z/ L- V: A$ U
double phError[50];
5 X, O' V6 @( a$ Q8 x4 H5 F/ D
creal_T timingRecSignal_data[28];
. t: R$ ?" d8 G" N8 j$ J/ ], v
int timingRecSignal_size[1];
1 {- q" W5 d s
double prbIdx_data[28];
/ B3 i8 D) H B* O y
int prbIdx_size[1];
0 {* A+ a; s1 L" y& B: H, e
double dtMt_data[28];
, f x- s7 S% G3 Y1 D
int dtMt_size[1];
/ X# I9 ?. y7 H) b( a0 d* F- t
creal_T symFrame[25];
& D* N% g" d$ v9 ~: t) W
boolean_T isFrameValid;
" L% s( ?/ V7 Q
double unusedU0[3];
; W7 Z/ r h [9 e* Q$ }8 B% l @
# T4 {! v# c2 U; o @
//调试过程中的变量
- h5 C! ]5 I m5 X
int enough_data;
9 h9 N, H# Y6 l* T
% v. w! C/ L! S4 E
int enoughDataFlag;
' F# o+ ]& j4 P! t$ N6 Z9 E
int yiDuanShuJu_mean_int;
5 u; z x! ?8 F/ t1 o' |$ n
int int_sum_dv0;
# n- E$ ]# p4 C/ _
int oo;
4 g/ a% Q0 Y) t9 f# I- I
int ii;
( v2 ~. v1 n+ p/ R) i K" k% ?
myfuck=10;
+ l1 t. p' p/ i# }' p
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
6 u0 ~1 A# [, Y# V
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
* ]9 |: W( k3 S# K
5 Q- z8 |+ W: w8 d4 s5 {& x0 G) A
yiDuanShuJu_mean = mean(data1000);
. n( d0 m4 U! c: R* f6 B
+ S8 z. `- Z/ O `% c& T9 p
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
% p( u% F6 Z" A0 r# t1 Z% v
UARTPutc('A');
+ x; N; j% `* P2 R
UARTPutNum(yiDuanShuJu_mean_int);
9 R) e, r6 [ s
UARTPutc('\r');
5 F5 n2 l/ u E( I" R
UARTPutc('\n');
2 x! l3 |' m/ v" y2 u+ M: y
# R1 b5 G% W( X4 E: e3 ?9 S
for (ixstart = 0; ixstart < 1000; ixstart++) {
% h% j/ G; g' {
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
6 }2 Z3 K0 t; B' x7 n& V i* C8 Z5 }
}
& Z, _% ?0 g# B6 E8 j0 J9 n. x
2 u5 D) ?. I9 l% A4 N& l
power(yiDuanShuJu_LowMean, dv0);
: J D/ J9 X& j4 O. j" P7 E
* |. c+ e% G9 \7 r- t& g
int_sum_dv0 = (int) sum(dv0);
: Y8 {/ s" y3 ?5 O
) k9 H& H& w& B9 @7 y- d) U5 {
UARTPutc('B');
4 p, y" u7 k6 G( l d1 `( g7 l* s/ G
UARTPutNum(int_sum_dv0);
6 @0 P; O$ [" W, t: f
UARTPutc('\r');
4 U) }0 E1 ^! h, @
UARTPutc('\n');
& F/ W6 e& g# B
* j J1 u0 C% _& }/ ?% z" q$ i; v
// int compareFlag = int_sum_dv0 > 1.0E+8;
4 h) s4 L! U. t2 f8 X* z; D
: x; K9 R+ q$ ^ u8 F" z7 L( |- E
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
' ~% ]; H) ^" S
UARTPutc('C');
5 ^; [' c& q1 I. g4 L# ^
/* 比较信号能量 */
C3 s; h3 B, Y& I: N7 |
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
3 n k4 l$ J/ B( d: w" Q
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
+ v6 ^3 p J6 B+ R9 |4 y( D
// for (ixstart = 0; ixstart < 1000; ixstart++) {
o. M% z3 n1 M2 K0 c
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
6 i" ?3 z7 B# z4 \" l3 K* G: W6 t
// yiDuanShuJu_LowMean[ixstart];
& s3 X% e( h3 I" e
// }
; X0 {5 {+ h5 L' N
//
4 R5 Y4 R% E6 {3 A# D0 \
// youxiao_k++;
* H, h: S% E, w' p. m8 U
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
7 J M: I7 e' B& d3 k) u5 O0 _
// /* 感觉要取21个数,即0-20, */
% g( A( F- Y5 Q
// enough_data = 10;//有效是10,无效是0
b$ B4 F0 `2 k1 T) Y3 p: U
// }
) a" e; B& a1 {
}
( z( w: u1 H! Z1 n
* ]) V s' O+ z8 c% C% M
& i: J0 L6 A @1 b# `1 O
enoughDataFlag = 100;
( E. d7 J4 V& F6 P# m
enoughDataFlag = 1000;
( \( E4 v. D. F, c! M
enoughDataFlag = 0x02;
& P3 L. N) W: U! G9 y3 |6 w
enoughDataFlag = 200;
% ]/ g7 `7 ?' t- V* u: E/ O
4 Q3 W4 Q6 k! M7 ^0 N
int myfuvk1;
$ ^, z* n9 S; [
myfuvk1 =11;
0 ~4 q' E" J. a
4 ]5 j4 A6 ]+ v5 R% i1 k; k. V
) [; l: k! Q- C5 V
enough_data = 0;
7 Y2 s S* C- I/ m9 C# q. T$ |
" {" }- j" D0 p
// if(enough_data>50){
% ]& Z0 I* }$ b
// enoughDataFlag=0x01;
0 i1 I; [, }+ m, F4 G
// }else if(enough_data<50){
W7 l( k9 z# }9 Y" [) i% O( z
// enoughDataFlag=0x00;//0x00还是不行
u6 d) l3 L! X' f5 Q
// }
, g. Y" x6 c/ z$ R
% l" P# ?0 x$ @" Q) C$ c. t6 F5 V
: S! a, }0 v: P! O9 Z5 H/ C b
oo=10;
; K% `+ N$ O9 T" a5 M0 Q# _
oo = oo < 5;
$ d$ t+ d: W" W/ ~+ i5 A$ p2 K
if(oo){
' J6 Y( V2 B7 g
ii=0;
3 R; K, b! z" K. N
}
$ I2 U6 Q- L# P$ d% H7 L
if(oo < 5){
; t6 L& M* |4 A* J5 C
ii=0;
. ?+ P6 l9 f b! A. S
}
1 z+ p+ W% Z* H
if(oo > 5){
+ |0 J: i7 j$ E$ U+ D9 \
ii=0;
) f" J3 l" x+ k8 [
}
5 y2 d! c2 |. x; u: M: C' _+ E
7 m- O! s, V" V4 x
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
0 s* a# C0 b7 m9 P
/* 如果数据足够才执行主程序 */
; _9 u6 ]; c2 n" m! _" ]9 J
oo = oo < 5;
6 x: q0 O o" v# ^% ]
enoughDataFlag = enoughDataFlag < 5;
$ w8 Q! }: F/ |0 m/ T
if (enoughDataFlag < 5) {
2 s' U% q* R. x' Z2 F
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
' D( K% x9 G' a& W
AGC_AGC(&pAGC);
' x' n4 l7 |! ^
+ K }9 L! @( t9 \" G
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
, ?, N8 H8 A% l, n
FIRDecimator_FIRDecimator(&pRxFilter);
' [0 K- k9 d4 Q; w0 U
' K4 V% d& M: W# W3 B# k
/* Downsampling */
) [- F. A+ {4 k" u* ?0 G$ |8 |7 b
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
# z- a& W2 |+ I3 s
6 O; J1 V7 c* a3 j
c_PreambleDetector_PreambleDete(&pPrbDet);
+ y( ^2 \; h" @1 d7 B0 ]; R# `
$ ]/ C7 Y$ q- R# R' Z
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
" }8 g" s( O3 N% a- _3 S3 ]
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
1 K) ^0 a& B% Y
/* %帧数量=100 */
6 v) |' x# v1 u: S4 d2 H; L
pFrameSync.isInitialized = 0;
' A3 Z% V' M& o3 y- x" ~: ~2 A
3 D+ R& d/ f2 |! Z
/* [EOF] */
7 f& j, ?/ |- H r3 ]
/* 前导码长度是13 */
; y' N4 P* D* N) h% d2 U7 q
/* %qpsk */
, N2 ^/ |* [7 d! V& S
pDataDecod.isInitialized = 0;
7 d' b$ K. N" @+ X0 I% v
- j" {) i" n1 d. }* N% ]
/* end */
9 J: A" B& b |2 s
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
! `( C# Y6 J( ~
/* Convert 3-dB frequency */
: |) I) ~: v; M7 ~) E
/* Convert 3-dB frequency */
; J; G* D( E; G; r. d+ l
filtfilt(save_buffer, usable_left_filtfilt);
6 Y7 {: w- v @/ E) E- G: T
for (ixstart = 0; ixstart < 81000; ixstart++) {
4 P5 L+ I% _9 I
usable_left_filtfilt[ixstart] *= 2.0;
) T C& L% n2 r! I$ K
}
6 D' K( U0 Q3 C+ s& b w3 U
% y& c2 o: B! m6 A/ \+ q
/* 注意乘2,处理幅度 */
- Y/ \# X2 q( n6 [/ |
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
" Y, x/ s; U5 u# f6 \' A
/* %% 行列转换 */
) |, O' W! k; N8 o
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
8 [7 T, W3 I, f0 ^9 B7 w& @1 h
for (ixstart = 0; ixstart < 81000; ixstart++) {
& i: n' ^ I' Y
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
) f8 `/ ?- c( o7 s
- yiDuanShuJu_mean;
" U3 ~ s3 [( P, H" e7 p/ g
}
0 V$ p4 C7 H* t: F! W+ S5 p
! t' K3 D) u7 c
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
0 X8 X) j& v/ ]' p( P% h. H+ b
ixstart = 1;
3 Z# {* d$ ?1 u2 v, E8 v6 A
mtmp = youXiaoShuJu_QuZhiLiu[0];
& b( c' F+ ]- ?5 o5 L
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
. D' o X3 b+ j6 w" u7 k3 O2 G
ix = 2;
: Q3 x. {' o4 Q7 l
exitg2 = false;
4 L6 G P7 u* i2 C# P" J5 N% j+ n* u
while ((!exitg2) && (ix < 81001)) {
+ \; C. q h7 T; g9 u7 N
ixstart = ix;
, N% h d2 I/ s
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
0 y& o; U4 {* l& k
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
% b9 j; F# }8 t3 M4 ^
exitg2 = true;
% N* {- M4 E7 z0 |3 j9 ?3 Q; G* ~
} else {
/ [- m& T. Y; e+ T
ix++;
% U' j2 t/ K& A
}
; @: p3 m" {2 k$ e- f1 e E/ s: x. I9 Z
}
/ W- b! q' F: R) `7 j
}
# |1 B& A6 E: \" b. H( g( k$ z; n0 u
E8 ^, g3 X4 O
if (ixstart < 81000) {
! A% t. K" v' l& }
while (ixstart + 1 < 81001) {
2 t) |& X. P# o' N; C, |
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
1 k; o; H* B. v/ T% j$ d
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
+ D/ q3 l! n' v; \7 s$ w6 N
}
u- k7 ~# _! L
' u9 A" G. Y, E. W. G& c
ixstart++;
+ {' x7 F5 o0 ?0 C8 }1 {9 o f
}
& t4 ?# E, F3 v+ A/ K" h9 d
}
3 f- Y/ o; M) L! O; d i
# }/ y e p# ], `$ }
ixstart = 1;
$ s" D7 d$ f7 v+ b
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
- ^" _# V7 p) g
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
" v* F/ r% J0 h7 N" `8 n
ix = 2;
4 `/ b. H/ p+ B7 }9 l0 ]+ r
exitg1 = false;
. E7 S" B8 O q) K# E
while ((!exitg1) && (ix < 81001)) {
, T! S( w) y6 u7 S- _
ixstart = ix;
: H/ p& `9 d; |5 @
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
0 P& R$ g2 c5 ?9 Z
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
* }7 i2 {# G7 ~, g; h& F
exitg1 = true;
$ T; m, s$ B7 q" G" k5 q7 c: Z8 E. o H
} else {
$ Z, e# C: B( m2 l! A
ix++;
. S+ {' C1 g+ K" X* H% v
}
, ]5 b. R% X0 C) Q. X
}
, |- ~' R6 N4 z! T& f: b8 R+ D
}
# j9 I" B6 n+ K6 V# O7 J* a: E
2 t( Y# L6 f' }( q' z. `# G
if (ixstart < 81000) {
8 L" `! g, q C7 T" y; C+ a
while (ixstart + 1 < 81001) {
# n4 V0 @* w5 H+ n' J3 s2 q
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
; ~% R1 f- F+ p* M
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
' S _1 W0 Y5 f7 n# K
}
0 G% s, R5 ~4 J8 s/ T. w
; I3 b( z9 t9 f+ [2 {! k( o$ V* H
ixstart++;
. o& U) z6 N# M* _4 X
}
$ P; Z' D& n5 d, A/ T i" y
}
4 I, {5 s0 |" q# v# i! S9 a
2 d8 o5 i" ]( {( k
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
' h" u/ A! Y! L& t# u- ?
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
! I9 e2 [ V; ^* M3 b
yiDuanShuJu_mean = mtmp;
# H/ Z5 q0 d: l3 s' P
}
6 B7 h7 y) E$ s7 W! e7 [: F3 B7 o
5 x3 e2 f* E5 e& b
/* 找出极值 */
3 L" r( d; d& i7 U
for (ixstart = 0; ixstart < 81000; ixstart++) {
q( G m' s- k) G" {3 f6 y
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
/ i* E1 e \ j0 o
}
+ P7 a, W% n: Y! O3 {, W, Q! k* y! h6 i
9 ]& r% i ]& m. s; z
--------------帖子字数限制------------------
, h$ J/ [; p' q, x) ]9 Q
}
9 e# q# h0 H1 U
1 ?0 k+ I0 N! k9 d& {1 n
" ]; B: C" }( t2 X
作者:
tenny
时间:
2017-6-8 16:37
会不会有其它并行的线程修改到了它
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4