嵌入式开发者社区
标题:
debug时程序运行的莫名其妙
[打印本页]
作者:
zhangsan1231
时间:
2017-6-8 15:50
标题:
debug时程序运行的莫名其妙
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
. A9 J- a; r4 q& \6 b
# q, D3 A$ N' A( Z* ]$ a5 i
各位大神:
# \8 T0 E% ~! ?7 k" }
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
! u+ ^( R S8 U ]: O. Q# l
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
. i/ U5 s m k+ M8 |1 L( n$ q
5 a% b' h* V5 q% e: V% N
[attach]2441[/attach]
9 N# c8 r" n# `2 N$ ^
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
: E5 ?8 O* r2 w2 l
. c) T" x7 ?8 s% W& V
并没有其他线程
2 h5 u* N6 `0 @- ?' t d6 b
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
: r2 c$ _' B: U( s0 e
也说不定是和堆栈有关系。。。。。。
1 H' D' u9 h3 r8 S' N
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
8 C7 Q) {$ b! o* Q
[attach]2442[/attach]
" W t$ E0 W- R9 U# Y E4 G4 J) P
9 F, L) O2 N9 I$ P" B E6 g
: Y0 Z. @. o7 Y& ^* G
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
# T; \; [, I7 N8 W6 n- v
1 m$ N+ c; p9 E, o
* L8 q8 v7 d& M6 g- i
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
3 t8 M- o" y4 d; b! q$ I
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
' z& u* o' c9 j, R4 U% ^ d
6 ~ E9 h3 N3 \2 s
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
# L S1 S8 Z2 V( j
const double data1000[1000]) {
+ p* t5 H+ y& ?- K: z( M- q" ~
, J* J; V) B/ S, ]: R" @3 t
int myfuck;
9 ]+ t* ^" w' z6 K
double yiDuanShuJu_mean;
' D" G" J6 s. ^# f5 `
double yiDuanShuJu_LowMean[1000];
7 T2 \% I# a) P! [- h
int ixstart;
$ I. ^8 O9 T7 V
double dv0[1000];
6 P$ ~% E1 f; j6 q- J8 e
comm_AGC pAGC;
' j8 f% H) T: Z' q
comm_CarrierSynchronizer pFineFreqCompensator;
2 A5 ~/ l' M3 ]. f \
dspcodegen_FIRDecimator pRxFilter;
/ q& o1 N( e. ~# ~
comm_SymbolSynchronizer pTimingRec;
* Z) i- d/ s: @8 \' f! v
comm_PreambleDetector pPrbDet;
, |8 s- p0 v( R
FrameSynchronizer pFrameSync;
^# O. F8 r( C$ p G! i) U
QPSKDataDecoder pDataDecod;
/ S9 ?, ~% A+ v' J; {" P; g8 \
static double usable_left_filtfilt[81000];
8 A) [9 g- |( K2 f, x1 D
static double youXiaoShuJu_QuZhiLiu[81000];
- p' D5 m" k" {. C7 l! s
double mtmp;
0 p8 a! z- Y0 v6 N7 T* w
int ix;
4 S& O( J! Q, W& |- @6 C
boolean_T exitg2;
3 L g6 E$ C4 }$ S
boolean_T exitg1;
; [" e; C# @# g( ?+ W- S7 k' T5 X; m
double YiZhenShuJu[800];
( t% h! l3 Y: w7 Q
double dv1[800];
- `% L( Z9 \6 Y: |2 |1 S
0 j: b: U+ m$ X8 B) ~+ h
* ]0 q B% B2 G8 w5 P& C2 }
double b_YiZhenShuJu[800];
* a( ?7 ^9 g- b3 j/ x
double I_filtfilt[800];
% @5 v* O- Q. ?' G1 F& y
double Q_filtfilt[800];
" H3 U! m$ i9 l' l3 R$ t" M0 |5 o; Y) Z
creal_T b_I_filtfilt[800];
5 ^# T( W( l4 e1 ]1 R$ |% N) K
creal_T b[800];
) C+ m6 m7 J( p% E3 O
creal_T RCRxSignal[50];
: D$ P" } O' t/ t
creal_T fineCompSignal[50];
/ L6 M+ C2 A4 G3 c
double phError[50];
) N- B. m! p& X% t
creal_T timingRecSignal_data[28];
' g1 W, } Q% i a- w
int timingRecSignal_size[1];
" Z$ ~1 k- \" k, j- g* K
double prbIdx_data[28];
& ?: u+ m. [ X- G* [
int prbIdx_size[1];
9 g+ Z& K8 o* e$ x* y
double dtMt_data[28];
- s# E6 j3 a6 v9 [# j# F
int dtMt_size[1];
7 k3 ^9 W6 e/ S; r
creal_T symFrame[25];
) J9 o; N% k1 L9 r" u+ f0 V
boolean_T isFrameValid;
) _1 X# k# H8 r
double unusedU0[3];
2 b5 t) z( ~& n' ?9 ~2 T+ b
9 C [; U4 _0 A8 Z
//调试过程中的变量
1 b4 L& g0 i3 J5 a, ^6 @' d
int enough_data;
' o" B; T7 B& L+ M/ v, f4 V/ _% T
1 z; c6 S1 h' S; l! I' v, L+ d
int enoughDataFlag;
" F' U+ Y& ` Y0 v5 U. I
int yiDuanShuJu_mean_int;
. E5 r) L B3 f9 x
int int_sum_dv0;
; M: E: f" c3 \8 s! _4 E2 I
int oo;
; A: ~) [% p. P, U
int ii;
, N1 u7 _* W# t( b
myfuck=10;
% n& O- ]/ }* C* o4 H) h
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
$ N/ d4 ^# r2 U3 D2 n
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
# ^9 _3 D& L5 Z
) S6 Q6 s) c1 t; X, i
yiDuanShuJu_mean = mean(data1000);
; I' k M& \9 _% O5 p
3 w$ e7 c& l5 E5 w+ C$ H
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
4 l; j' s4 c) Y: }+ {+ e
UARTPutc('A');
B+ X( H' }2 j. v% d
UARTPutNum(yiDuanShuJu_mean_int);
8 z8 }) j7 W+ s/ V2 e, ~
UARTPutc('\r');
+ _! w4 d8 r0 h2 E( I) e
UARTPutc('\n');
1 Y. K3 w8 S7 }7 }- o
$ b( `$ ~# N( a# P$ U
for (ixstart = 0; ixstart < 1000; ixstart++) {
, h+ q/ z8 N6 j
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
& N0 `" g- L' @+ X
}
+ P, j. {3 {+ K; ]' r
0 q4 D; |" R+ F( `
power(yiDuanShuJu_LowMean, dv0);
; D% _" q2 u: i. Q
/ J: k9 q& h9 \+ l! ~3 U
int_sum_dv0 = (int) sum(dv0);
/ t1 v" X k; N
( X y" L5 q, H1 h4 z
UARTPutc('B');
: i& B4 }! \9 b& K
UARTPutNum(int_sum_dv0);
+ E, R9 n2 V+ d/ O5 y
UARTPutc('\r');
# Z- @' y: `3 ?8 y; Q
UARTPutc('\n');
$ H9 w. s0 N1 n6 T9 ?" R
5 X5 X4 C( m5 X' t: w7 g
// int compareFlag = int_sum_dv0 > 1.0E+8;
+ m( |1 m" Y) _
: l* t% h* W- ?% j. D3 E
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
! G& l0 f' V3 k1 G- `+ o& _# s
UARTPutc('C');
; h% g- {6 Q: L8 r
/* 比较信号能量 */
! m! t2 O, s1 k! h9 G" T
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
_; V) D0 w* D; j
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
/ H4 W( U# r R) e! H% a3 L8 j
// for (ixstart = 0; ixstart < 1000; ixstart++) {
% L" H+ }3 K; w- r% S0 J3 h9 f
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
) s/ G2 f# j6 a5 i6 _- C, _
// yiDuanShuJu_LowMean[ixstart];
# i) t: Z6 |0 j& g1 u) ?
// }
4 e/ a( _ b5 L
//
) h4 v: A: d$ m' D$ h) w3 Q9 z, Y
// youxiao_k++;
9 q8 R" f( _- |. u \. _
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
' f) L) B0 ^9 @% x2 F
// /* 感觉要取21个数,即0-20, */
$ `0 `. D) q+ M8 }8 y
// enough_data = 10;//有效是10,无效是0
, x2 I2 j/ ~/ |2 d+ b: T
// }
) O) y% z0 n7 z$ s7 A, t
}
* |* \! [# d+ S% t) J3 `
7 C) y, |, k( h7 {/ I) i$ ^' z! y; {4 Q
, Z$ Q9 e8 ~) N. l# E( n; R4 y6 V5 k
enoughDataFlag = 100;
# G- c$ I0 h) `3 F( a5 p) E0 k! U$ a0 ?
enoughDataFlag = 1000;
, y6 w( U$ ?$ T1 J2 M' @+ L
enoughDataFlag = 0x02;
6 T d/ i, j- m6 q& z5 i
enoughDataFlag = 200;
2 g; Z- u; U* D8 g
/ M" J& }, f0 p( l- Y( K: B" e
int myfuvk1;
0 L3 B& p! \) A0 ]1 c: ^/ H
myfuvk1 =11;
- u- y, Y% u3 i% P; s9 z; l
; v" Q$ @0 z# Q2 R
' r( a( {* g5 n. K2 L- }8 o
enough_data = 0;
, `% M, w4 K. _- t7 q1 z" j% o
+ C. @8 ^5 M; h6 I: [- G( S
// if(enough_data>50){
$ y4 A9 C# m" P: b( O( x. r8 _
// enoughDataFlag=0x01;
3 Z/ d c/ G1 G: @8 ` _" Z
// }else if(enough_data<50){
) B; P. @6 v9 g( `- w9 K
// enoughDataFlag=0x00;//0x00还是不行
7 |: b" j& j( i& R, E/ G
// }
# v- Q0 d' T3 T6 q, K( z1 L: u
; z; y( |( ?3 S1 k7 q) Z
. N1 N7 V; v& d& d
oo=10;
l1 q% K6 J/ X2 f0 d N, B7 W
oo = oo < 5;
- B: l$ Z& L) t* a, H& G
if(oo){
, ]5 c: h5 X) a. G0 N/ H: C
ii=0;
; j" l, c2 g( P. y7 s
}
R. H& ^2 N: S3 Y; z1 s' i
if(oo < 5){
" N& O+ B5 ~$ V( _( |/ M
ii=0;
' @5 ?/ A6 x8 `) Y2 ~4 E
}
, q! @6 \- E0 J
if(oo > 5){
" N6 | s# [, Y8 ?' C, ^) X
ii=0;
7 }! b/ a4 i/ w9 Q# i
}
# \' \; w( A2 e1 v; ]
8 u" z7 c# O6 Q, u. _
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
. I- S4 t/ `( u3 D, }
/* 如果数据足够才执行主程序 */
9 b, ?% _/ p- G* _& o+ C& d1 _ c
oo = oo < 5;
9 R) p( j% I: g
enoughDataFlag = enoughDataFlag < 5;
$ k3 \8 G, u6 B* ^. g4 [) W- P
if (enoughDataFlag < 5) {
# R: b X0 }: ?3 d% R: C; R
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
5 V9 L8 T0 b7 d- |# X" v. }# M/ W
AGC_AGC(&pAGC);
7 u% C% A# h7 e% {- ~ U" K" U
) S1 {" n& E0 ^- L
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
. U' w+ y) o! k4 x. t+ V5 Z- i
FIRDecimator_FIRDecimator(&pRxFilter);
+ g$ m e& c4 s1 |6 O* C( R
( V( z- d, c3 a9 D4 c8 j. b! x9 l
/* Downsampling */
& e1 x/ D, p5 S) z/ D# D
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
6 R$ M) ~8 g" t" `- q
8 S0 D0 k0 X, M: @) V
c_PreambleDetector_PreambleDete(&pPrbDet);
4 ^6 x9 z2 F6 U( m# J
, B9 ~, m8 x5 i
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
. I! f* [+ t0 }; K( r- t% M
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
) R5 R$ _+ G- l7 Q- ^
/* %帧数量=100 */
' X& e1 W/ `+ A- U$ ]: ^' p
pFrameSync.isInitialized = 0;
% e8 u9 {4 D) P6 [- v; v& Z
: c _5 ?' l4 j7 W
/* [EOF] */
q* ]& q- M3 I6 S9 a" @2 b
/* 前导码长度是13 */
4 _4 I5 w; S8 ~9 K
/* %qpsk */
# H* k. |( h* f
pDataDecod.isInitialized = 0;
, w+ v* Y1 y# T3 q
0 ?5 E( ?: A1 w
/* end */
0 j% H8 T- T2 h3 A6 F7 c
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
* p P7 m; I, S, B& u& s. Z
/* Convert 3-dB frequency */
) t5 P( h( i# h. L! F
/* Convert 3-dB frequency */
5 r- Y: b# F/ u! t% m. T/ a8 ^$ W
filtfilt(save_buffer, usable_left_filtfilt);
" J! A. _" {* r8 }( U6 X
for (ixstart = 0; ixstart < 81000; ixstart++) {
1 y8 U. @. |6 y' t4 ?$ _
usable_left_filtfilt[ixstart] *= 2.0;
9 g) C( T& Y( H" d# E6 s
}
/ s) i% K) S# ?! a8 a
1 F9 s# w i& _2 m, j# J
/* 注意乘2,处理幅度 */
( r) d, y8 t5 i3 x" H- K2 L
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
9 z1 y6 M% j6 V6 ~
/* %% 行列转换 */
1 F8 _ e5 Y2 |. w; ]
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
2 c" n4 V: J2 N% X
for (ixstart = 0; ixstart < 81000; ixstart++) {
: B$ R/ \3 i, d& ^7 t4 h
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
4 p& @: v: Q* y k
- yiDuanShuJu_mean;
- P& J% U# {) `& v- i6 A5 \$ F
}
( X5 K% r" m* R6 d, A; c
: p! n$ y# }% Y& @' N
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
; \# A7 @# J& K9 c8 D
ixstart = 1;
0 n! D* e, m8 `7 }1 ^
mtmp = youXiaoShuJu_QuZhiLiu[0];
5 ~3 A0 j6 I% ~
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
: D, m O+ |4 _% ]9 n
ix = 2;
/ ^' ~/ m4 w0 {/ m3 w0 i0 p
exitg2 = false;
" i1 B9 u1 Y/ }. V0 _0 L
while ((!exitg2) && (ix < 81001)) {
+ X3 V7 C1 h6 P
ixstart = ix;
( n, k7 O" l/ f: `
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
. H" X! Z$ H2 g8 T8 u
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
- N$ w2 c5 R/ K& `0 u
exitg2 = true;
' t* S3 j2 W: ^( p; S
} else {
1 y5 ]/ C1 ~# L# X* @6 f* F
ix++;
7 l; b8 Q7 o( h- s0 U, i7 Q6 m
}
* e4 T* E: h& |/ J9 B* B
}
# u& \4 ?$ @5 g) ]+ O
}
0 d9 h, M) @3 k4 d
2 `& E. v* T6 p7 L$ e9 O, A; ?
if (ixstart < 81000) {
3 ?* Q+ {6 _8 r- Z2 _8 W
while (ixstart + 1 < 81001) {
0 T( e- |5 R' R" |
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
8 [* k/ x5 e" b& `# B, k) \+ Q
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
- p9 k/ y4 F+ L: q) _
}
8 b7 \( p6 g u( K8 G) q
: r8 Y" n5 U& y4 g5 H) ~) @
ixstart++;
* J. B8 B' {/ e( b y) a; t
}
2 M& |9 h- @% E# ^0 X) e
}
" q# g. T/ X( L! d8 c7 @
* @& s+ T4 X* d8 u1 W. _- I
ixstart = 1;
4 f6 Z E2 \, I2 Y
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
- A0 t) h7 [ h& h K9 K' T
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
) R- d' i7 i# P- b( b
ix = 2;
s' _6 d5 f( b- P9 ` Y7 E0 ]
exitg1 = false;
9 v' ]3 I" b' `% X& c
while ((!exitg1) && (ix < 81001)) {
8 A& [' \( I4 [8 S0 `
ixstart = ix;
+ x4 t1 ^7 \9 [% l* @
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
6 g4 B( i1 ?) J1 K X) b
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
5 h" F# c& u N) c+ z2 }
exitg1 = true;
, }( x! Q5 y! I
} else {
9 g9 r6 F4 b- m% F( `8 V: W
ix++;
; q2 v& {) s+ d. O3 A6 a; [5 W
}
+ G* b" f0 m' G* {1 w+ V
}
2 g. M+ [+ I/ i$ L
}
$ R" `9 w/ G' C1 S
0 ~% c9 c1 ~4 M- S5 a- D1 }
if (ixstart < 81000) {
0 `7 Y* O4 l$ _, ]2 a
while (ixstart + 1 < 81001) {
4 t* a; |7 n2 i D4 x/ S3 j- N
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
- F$ G- h4 D. ] ~
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
; V0 O5 ]3 j3 W
}
/ u1 G3 K4 f: @# w% F7 o" r9 r0 V
7 z+ F" s% l' F" ~
ixstart++;
2 Q3 l2 C1 n: c: R
}
# G5 |) F$ ?# J2 E$ s2 s: k8 S3 c
}
- x6 s8 P) p. c
; Y' s+ m5 d2 I# x
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
9 E$ \: Q0 f, q4 Y0 j) f" K* _# U
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
$ W" Z1 X, N6 @9 s& e9 g! a3 T/ d5 _
yiDuanShuJu_mean = mtmp;
+ w1 [( F9 l- E! o8 Q, j
}
+ H8 W+ I( G" y4 H- \- f% m+ W. H
9 B2 ?0 I8 g2 U1 W
/* 找出极值 */
% y/ c. F; i% Y# u
for (ixstart = 0; ixstart < 81000; ixstart++) {
0 X% q N3 w9 V2 |
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
( Q# v7 ^% V$ Y2 B
}
; M# E) R8 @+ \3 s
9 z8 b3 b, Q: f8 j7 i
--------------帖子字数限制------------------
; u9 _3 D6 x; ^7 u, a
}
- k! b" o, I4 l' B
7 [1 J# K6 p! D: {
: [" `% `8 v1 W8 Y, i1 X/ z% |' r
作者:
tenny
时间:
2017-6-8 16:37
会不会有其它并行的线程修改到了它
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4