|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
/ e0 k8 X% ]5 M, I( T, O3 l1 f
! M, _' H2 c+ o- j! X各位大神:
! B- P6 z4 \$ O0 |' i* w 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)1 y- N. \: @" P6 ^
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
& U |2 _- s4 J% h
1 E& Z( ^+ w( K6 K
4 y( m6 S0 f# J这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。+ D$ `$ ~3 g7 [( Q: {2 B
' H+ D- x8 e ]) w; i: V5 V
并没有其他线程
g- n4 \- D9 M3 i; \+ C- \3 h反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
4 R5 ^ d* C4 m, B也说不定是和堆栈有关系。。。。。。
$ x& O! z2 h b, B+ ^( L请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
" Z- `' U9 Q+ j: q/ u! u4 {, Y) [8 ^+ \1 W) v6 B+ L8 N) f3 H
! ^5 O) [% n+ z* p+ |: {
) c% F' g9 J4 p+ z" W0 I
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
+ n) c) `2 s# L; o, k
+ Y: t+ f& G" c
2 z/ h* s5 D6 H$ J附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];/ H3 c9 r3 _, p& A* ?0 z
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。' Z' K: a: f+ [# A# \( Z4 A3 X3 U
: j N7 W" G- a7 |/ M F; s. u r, mboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
1 D/ t3 b" |8 e( q2 A const double data1000[1000]) {; i! ^; r/ S& F* ^% n) j
; D& y2 Z; P. |+ B: g( I4 w int myfuck;- h+ h4 b" H7 r/ \' B$ ?
double yiDuanShuJu_mean;
' G, k5 y/ t, b* f: e; } double yiDuanShuJu_LowMean[1000];
. L+ Y$ w0 z' R int ixstart;
9 e( Q0 d$ Y+ g double dv0[1000];
" {$ m( L1 c5 B7 g( L0 i7 p: I comm_AGC pAGC;& _. g/ L% Q' {6 P# t2 l
comm_CarrierSynchronizer pFineFreqCompensator;7 r* R) L9 ?5 p: G
dspcodegen_FIRDecimator pRxFilter;
' e, E/ ?7 V4 a" ^4 d# j comm_SymbolSynchronizer pTimingRec;
8 [) c' H3 \" M, d7 V comm_PreambleDetector pPrbDet;
3 b! u( J( k2 r0 i3 c4 p FrameSynchronizer pFrameSync;; @" b3 d, E. X" V& {
QPSKDataDecoder pDataDecod;- V8 h# V! }& c5 ^
static double usable_left_filtfilt[81000];0 g/ l/ H% f3 t4 X2 t- l g9 S" c
static double youXiaoShuJu_QuZhiLiu[81000];
8 T1 }' F/ [# j0 W double mtmp;. W# d% H5 S4 C' f- S! e
int ix;
; `# b, [( d8 _- Y7 [- f boolean_T exitg2;
- B, t0 |6 G; k% O boolean_T exitg1;8 X8 R0 A0 g$ _# ^9 b' E! O
double YiZhenShuJu[800];
* j1 }/ l" s9 I5 K' ]; @- W double dv1[800];% x0 F! k( O% E: ~8 L
) Q: z0 @+ `( b$ h+ J+ Y8 l/ N7 z* F7 B( Z! f
double b_YiZhenShuJu[800];# q) i. Y# i+ w: p8 _; X
double I_filtfilt[800];/ ?' P% ^) Z# g, m9 m
double Q_filtfilt[800];$ F, y# y2 h2 ^' m3 B' a
creal_T b_I_filtfilt[800];
O, R+ F& o& T$ F9 U9 e creal_T b[800];
* F% C z% J6 J5 M! I$ I creal_T RCRxSignal[50];
, S5 Z- P- {# k creal_T fineCompSignal[50];! [, U% R4 {3 g) L
double phError[50];
9 e2 _ l. k6 \$ i1 ?8 j creal_T timingRecSignal_data[28];" j$ V% n% h; ?0 {# S7 g; K
int timingRecSignal_size[1];
" X* ^5 \- e9 h! b* x double prbIdx_data[28];
- F: y1 O5 _1 `4 w b5 L int prbIdx_size[1];
8 _( f0 j5 R2 ?0 T double dtMt_data[28];
9 E; E% d& }5 q int dtMt_size[1];
) J! w+ S/ F2 t- F! E" H creal_T symFrame[25];
1 N* X2 `9 S. Q X2 {% D: g boolean_T isFrameValid;
" ]. Q% q6 w, a( F; g, U9 U double unusedU0[3];
( [1 _: H9 e# g8 m; Z# v8 v4 X$ @. g
//调试过程中的变量
. x3 ?- q: q- z7 ~1 g, p int enough_data;1 N/ W+ ~' w8 e2 U/ S N
# W: y# T* K9 A& A) L' |. Y) z& ~+ _
int enoughDataFlag;5 Z# t+ Y) ?( s$ g. X% m
int yiDuanShuJu_mean_int;
8 s9 A" ~8 L8 q9 m( v int int_sum_dv0;/ G; ~2 T$ M8 u, c5 ]5 ]
int oo;
( [! z& q2 g9 _ int ii;
$ o$ E4 t9 p: S9 D; f# e myfuck=10;% H2 S& Q2 Z# M' _- K
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */( o9 w, R7 H3 B- D
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */6 r; b( S- X" I ]: k; U
2 @! j9 D& X. q* I* J$ d b
yiDuanShuJu_mean = mean(data1000);
. }, n m. B3 X( O: f4 H4 z) [$ J0 o( M6 H4 j8 z2 T
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;! e$ F: {6 V( W% N$ |
UARTPutc('A');( D9 R, H5 n; \: |% f( _1 s4 X8 ?
UARTPutNum(yiDuanShuJu_mean_int);
2 G$ U5 g# f# \ UARTPutc('\r');
m8 Y5 G' g6 K' y UARTPutc('\n');
7 f- e, j e' T$ w0 `$ m6 [) d
; W/ }" V$ \6 [% y" K for (ixstart = 0; ixstart < 1000; ixstart++) {/ X( C0 b7 a: i, J6 p, ?6 B
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean; g1 k+ P4 U' `3 }) B# v; `
}
$ @/ D2 T4 i3 s5 e6 Y; [, E+ T, R" I6 E, r$ p
power(yiDuanShuJu_LowMean, dv0);
! u+ T u3 Y& {- o3 b6 ]: Q/ m! t D X( D
int_sum_dv0 = (int) sum(dv0);9 ^; G, j4 n6 z) _# {9 z
- O/ E! t. W% y9 t
UARTPutc('B');/ P$ G+ @1 E/ h8 g4 m( q
UARTPutNum(int_sum_dv0);
3 I; F' m" f/ P. V; G8 I" f UARTPutc('\r');1 \8 I, R R- `- C
UARTPutc('\n');) X6 S, `+ y6 }( L8 v2 X! s
4 p/ d/ V* y7 B! c// int compareFlag = int_sum_dv0 > 1.0E+8;
s* t" \' N" }$ y. q0 g4 J. N3 _2 W: I; P! G7 ]
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?9 ]2 ^2 [& w) H8 {9 U- z
UARTPutc('C');
6 \5 N- G) n- i {8 }5 a/ { /* 比较信号能量 */
7 q- ?- z. `% v4 q6 O& J. F /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
6 C: L: h& T/ m/ v7 r8 S' ?: x// yiDuanShuJu_mean = 1000.0 * youxiao_k;( B1 Y" y+ Q) f- P8 `3 y/ f
// for (ixstart = 0; ixstart < 1000; ixstart++) {
, @# g8 i; c' a5 r m// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =/ X9 |- ]& A7 q/ p% \" B9 S: k
// yiDuanShuJu_LowMean[ixstart];
" W/ [' M7 V1 d, @// }: F6 O8 L) ~% J% T0 x
//
6 b1 [4 E* o& I" C0 ^' _// youxiao_k++;
+ G2 _0 u5 H- f9 @( g% j// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
: C) `0 h# z& y$ t# U7 k5 ^// /* 感觉要取21个数,即0-20, */
, H: H( D+ k) r) V// enough_data = 10;//有效是10,无效是0% P3 |) k4 f: f7 g& V
// }
0 c# s ~* E; E: X b$ m7 T }2 z- [' L: S: m- x8 d- A* s" u
% S/ ]* U. O2 m+ \# @
* c# J7 z1 ~; [7 T& M. l$ I enoughDataFlag = 100;) B9 [; ^8 v: d
enoughDataFlag = 1000;
: y7 Q6 l# r* ~2 |9 o1 M enoughDataFlag = 0x02;
6 e3 h+ m; @: i enoughDataFlag = 200;
1 S: S0 W$ f9 t' z0 ? i
" x/ F& m( B+ t$ W int myfuvk1;
8 X' e6 @7 J9 ]; ]; c- M+ \+ W myfuvk1 =11;
3 h! D- x B' o" O/ E
G8 q) R2 k a7 N9 M. ^, p. s/ |2 J H7 i( g+ z& s
enough_data = 0;- T$ |, @* B' V
5 M0 n8 q: |& U. o& g r7 ]! t n
// if(enough_data>50){
3 V4 @2 l" S: N( \" z3 A& y% t// enoughDataFlag=0x01;
" W! h4 Z1 J! R7 y5 q// }else if(enough_data<50){2 }! {7 `% N3 ^& a; }' {. j
// enoughDataFlag=0x00;//0x00还是不行
- J7 C% H& N( b# L ^// }: A4 N! _: q4 D7 r6 f$ U- I
+ x/ ~3 }# I, K$ o
0 ~: s- \! |6 `2 x% x6 C- y oo=10;4 B/ \$ O; ]2 f
oo = oo < 5;! C- ^" d9 f. [4 y! u% }; I0 H- y
if(oo){
U- C1 a! ~8 \# X ii=0;
; H6 q0 x6 b2 W- u _ }
% M; M6 A) b$ D3 K, o% ~ if(oo < 5){. q; J' h E. p% Z; G% {: U9 I+ E
ii=0;6 f5 N8 h# }6 \+ b
}
) J. {' Q$ @# l# d if(oo > 5){9 C. ` x5 s2 R o {
ii=0;# x$ Z( A1 N. ^1 r" u& k6 M
}
! W/ E" _, d5 d0 ~' x g
0 j2 d; a1 M4 S' w, b! x /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */+ J- s i3 q' J/ E( O6 G
/* 如果数据足够才执行主程序 */. Z7 |1 f5 S3 h, f' I3 s
oo = oo < 5;
( Y# Z3 f7 H, f& |. P enoughDataFlag = enoughDataFlag < 5;
y* z6 E1 j. x if (enoughDataFlag < 5) {) t& H' y- D& ^2 ?& v0 L {. W
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是03 t+ O* n+ m- @4 e' M
AGC_AGC(&pAGC);
& |/ g% |4 X- u9 S7 }
; c. J& @3 W5 z8 c c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);- P( X/ n/ w$ @! a
FIRDecimator_FIRDecimator(&pRxFilter);2 Z) ]/ F! y/ \& H9 n2 `
* h ?/ u' A4 r* o8 m /* Downsampling */
" j* l3 F8 U/ J. c8 \/ s# i& o c_SymbolSynchronizer_SymbolSync(&pTimingRec);
8 q6 n7 n. y( o; v3 `
+ P- o( N' d# W" Q, f c_PreambleDetector_PreambleDete(&pPrbDet);
" y" S& j1 ^; W2 r9 d$ R4 x
' [! L! r! i* i* r/ M8 F /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
( M+ c( `" }, q /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */4 m) O$ q( a; N K1 d
/* %帧数量=100 */( n4 |. v$ I7 ~# ~) E* H
pFrameSync.isInitialized = 0;# G" d- U7 l8 `( I
9 h; L }5 q( [, O; R
/* [EOF] */
. q, \9 Q0 v0 | /* 前导码长度是13 */
/ \9 b3 S4 e+ T4 m /* %qpsk */ m: G* q" y2 A$ i
pDataDecod.isInitialized = 0;
: k& R, k* a: {7 [, [% `
! i( L O) m B& _ /* end */
: k' |* t5 E, _2 Z/ R /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */9 j, `: {: ?0 h: A$ P. r
/* Convert 3-dB frequency */) u# _ i6 D6 C5 x
/* Convert 3-dB frequency */0 ~" J D; l# E# x/ x
filtfilt(save_buffer, usable_left_filtfilt);
# o% h) O, {; w2 T1 K( i for (ixstart = 0; ixstart < 81000; ixstart++) {
$ z/ ~% F7 F: J9 { usable_left_filtfilt[ixstart] *= 2.0;! h/ j- y, v+ p/ J9 Q: \# O+ i2 [
}
; u) z: b9 q+ R. y
) Z, d. Z5 S3 H# U, [* V4 i, r) y; U: w /* 注意乘2,处理幅度 */
) y# |: ^" `! g- B8 W /* %% 我发现带通之后其实就均值为0了,不用这一步了 */$ M x T! _, {4 o& {7 t7 i
/* %% 行列转换 */6 S' ]9 ~' r' }( u: C3 a& p, {: h
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
: k ^/ Y% m- E6 }( e for (ixstart = 0; ixstart < 81000; ixstart++) {
/ q; e U; f) E youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
' c: h" `* U: N) q! ^ - yiDuanShuJu_mean;
# o3 a3 f. ]0 K% @4 D% |% E }
: |1 ~" ]/ V0 {5 [+ c0 X, S+ l! ~& N+ W* A' Y
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
& u! X# _' B7 e9 P5 R4 A' i ixstart = 1;4 S M: d/ C9 e+ q% A
mtmp = youXiaoShuJu_QuZhiLiu[0];
8 v0 C& t- @3 c1 Q) J6 |/ E if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {- B" b6 J( N n% g$ |. J
ix = 2;
- ]& D+ z! O, i, r3 M. H, y; L: B exitg2 = false;
$ c: K, g+ a' z7 W" B5 N7 D while ((!exitg2) && (ix < 81001)) {: v# y; `- ^7 f. T! H0 `7 S
ixstart = ix;! X# `' W2 _- i4 l. r2 i4 {$ Z
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
( Z$ |. [% A! D& z' R5 p! z mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
8 I& i& Y4 D0 {" L& c' R% n exitg2 = true;3 b7 q5 _- }4 Y+ c; z1 C0 T; ?
} else {
# O! d W# ?) D' q ix++;
1 J o, w, K6 L6 ]# S. Y0 ^ }$ ]" y( p: o* L S
}+ s% a/ H3 ~: l% A8 X% W
}- b6 P4 w# A9 L
4 J% c7 s* I3 I6 o% s# f e if (ixstart < 81000) {
4 U) K6 s8 J3 Z while (ixstart + 1 < 81001) {
0 p, X) U6 v' I if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {+ m- l! G* o+ k$ b2 T
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];/ U- ?. o6 D" y8 H
}
2 V. K- q- a; [7 q; ~) ?
9 ^' ~! X! i' M4 R ixstart++;9 X* j( t1 P! z5 R, w5 `5 s
}; r/ c) p0 I4 R* g/ Z# [4 J
}, x) o6 k4 [- R$ Z6 b$ g
# t' O* t- D4 k
ixstart = 1;
" `. k- p/ a) Y, F9 q9 W$ Z yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];' R/ Q; A- p$ T4 @ C+ N- M! ?
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {# I# v( r/ }! K) P5 S! ^
ix = 2;7 c) P+ y8 [+ i& f2 U* v
exitg1 = false;6 f( w# k0 U9 ]. I
while ((!exitg1) && (ix < 81001)) {
; c1 \; L# _$ {" C& Y0 X ixstart = ix;
9 ]# O8 X" B# Q3 s) f% S if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
& }. ?# s/ E8 |* \6 {! \9 V yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];% o" d! Q- _ ^, Y( b8 y
exitg1 = true;! B* @+ r) e# r; F8 x7 T
} else {6 b% ?/ G. B, h" k V' k' n [! R
ix++;0 l( z: ?9 N; q; G0 U
}
) G) m7 N( K+ M" N* K! | }" g, `4 D, R# ?0 q
}
& m) ^7 c% F; z Y' o) X8 r! w) X" y& M. I
if (ixstart < 81000) {
* N9 W' j8 }, y, a while (ixstart + 1 < 81001) {% r3 M, Q9 Z" H6 N4 q
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {) O. J+ o/ d% a4 Z
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];3 B: T+ S9 k3 ~9 g& F
}
$ D# G0 X y5 O7 |. `$ u- Q
/ s! u- B) B1 h7 a ixstart++;1 x) e4 Q. Y; @
}
2 d9 O l2 V& z8 n2 b2 F }
" ]! w4 J; x$ m) }; W# `( h- g6 E( X
. }, i/ [) B1 w# L0 g8 Z yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);" D" Z9 y& r. K! `) {2 S8 Q3 c$ L
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
: o- S+ C+ i9 M: A yiDuanShuJu_mean = mtmp;
6 h2 I4 @8 J( [0 T }
4 N2 d# M7 e8 _& e5 ^* z' l. T5 ]6 y6 c4 V! u8 u$ ^3 Z
/* 找出极值 */; I# a: z- Y! v$ n ?' u9 C3 c7 s
for (ixstart = 0; ixstart < 81000; ixstart++) {
+ }+ r s9 o# q4 j d h% v. X youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;9 H! B, ~2 c- J' E9 n8 j% q7 L! |
}
: t& x: o& U! i3 q/ {' o
0 J8 F8 a b( @" A; U --------------帖子字数限制------------------! D1 I$ d, b$ q0 K/ z1 b+ {! k& A
}
1 I0 k$ C. ~" v8 P! N+ b# j/ r8 P/ o7 N a
/ _( d9 B% K* ~6 Q- f! ^ ^
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|