|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 0 T2 A2 ]$ D V$ L
I7 K/ h5 K5 T# X3 X& _" p ?! N
各位大神:
/ a3 c1 h- W$ @ 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~): u9 w" v$ C) q7 l
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
9 L7 s. ~; @$ J! |/ p' i8 {( j3 N/ r: h5 r4 P
% J8 W! K4 M" N' u
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。; Y6 R3 G8 d$ k# O2 L- g* U
; ^4 t7 K5 S: I1 J, D
并没有其他线程( m- A' a* B; D! B" {1 w
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
9 s9 @# z! R# W也说不定是和堆栈有关系。。。。。。- \, w" W0 V) Y+ m8 M: x* N9 I9 J
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数..../ U5 i K$ [- D! p+ J7 n
6 f% k& [! b- \5 \) F O/ \- }/ K" D
0 {" Z! {' f4 |7 f) q
6 i; T. ?" T# L我也很绝望啊,希望大神能帮帮忙,感激不尽,!% |2 F3 |7 O9 n! Z7 V
+ G( Q$ z' c0 B, C( O, c: l N& ?. O8 v \4 f* u2 j5 Q
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
; I% u$ x, ~2 D( ^# H static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
' N0 H$ @/ y' j9 e+ ?4 X( I+ q' e( Z5 [! J Y* R2 P
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
% |+ y! U* q0 H5 F const double data1000[1000]) {4 J7 b0 T( S8 P+ t7 z
5 ^) ^7 L3 X% a) \* Y
int myfuck;" c, i( T9 ?0 U$ g. Q d: i- p
double yiDuanShuJu_mean;
: L' E. Z# Z9 I: H; B double yiDuanShuJu_LowMean[1000];
. k: A- `) a; L; i int ixstart;/ R o! ~6 K( o' I8 |! B- m
double dv0[1000];! x, M% l4 {' O" b+ _9 j
comm_AGC pAGC;
$ m" X7 ?- U5 B5 P0 ]) y( k6 x' Y8 b8 k comm_CarrierSynchronizer pFineFreqCompensator;1 ~" T% i: `4 N
dspcodegen_FIRDecimator pRxFilter;3 e+ e& O8 `: K( a
comm_SymbolSynchronizer pTimingRec;" p3 s3 ?# F& b% U1 ^0 c
comm_PreambleDetector pPrbDet;
' F( P# \1 ~( H+ J/ Z FrameSynchronizer pFrameSync;# m; Q7 h5 L8 |0 o, }# A
QPSKDataDecoder pDataDecod;# Q, o8 T8 _) l* n
static double usable_left_filtfilt[81000];* |" V- P- s8 P
static double youXiaoShuJu_QuZhiLiu[81000];
6 b# @/ R2 q1 I3 D" v double mtmp;6 D5 x, t! B( a
int ix;& M/ v" D( [4 m7 V, i! H9 w
boolean_T exitg2;; S' z! f! g& g, u5 h
boolean_T exitg1;
: G) i; b4 x8 [3 k, m double YiZhenShuJu[800];2 h# D: `7 H( s2 ^* R
double dv1[800];8 A' d! K- u v- H& E" s
, J1 {, O% ?5 J( B( }% d
4 N$ y, d0 e" z9 x' F6 q- A double b_YiZhenShuJu[800];) h7 ]* Z6 n O4 W% b; l
double I_filtfilt[800];' u0 U5 M2 U) A% U& k5 D) o3 x
double Q_filtfilt[800];
0 x1 y |) G% U2 i. [ creal_T b_I_filtfilt[800];0 H: q6 }, G% S4 H, f% d. X
creal_T b[800];
" R7 w9 b( v. t* C& a( b6 ~ creal_T RCRxSignal[50];7 `6 {% J4 m( r5 A& o5 H) f) W$ @/ O) z
creal_T fineCompSignal[50];
1 u+ q+ J5 }# r1 g8 C double phError[50];
6 v* | [% W0 |; _. Y- P creal_T timingRecSignal_data[28];- a+ N' Z7 B2 I$ i3 C' E8 _7 l
int timingRecSignal_size[1];8 o# k: i: t# n2 _
double prbIdx_data[28];/ I }/ |7 z; g" U- ]
int prbIdx_size[1];
0 ~5 S% V, W9 }2 o! u9 b double dtMt_data[28];
* _8 d, N& F3 G3 m: N) ` int dtMt_size[1];2 @; u2 Z) b3 ]: l
creal_T symFrame[25];( H8 ~$ j# b9 D% {" I8 ]
boolean_T isFrameValid;
* x* l% a* p" t7 E3 V double unusedU0[3];
8 t3 Z. |1 f" s' G
# {6 S. p7 Z# @/ B0 r* S //调试过程中的变量 h9 [4 P. \' n3 T; m' h
int enough_data;
. x# z' ]7 P( b, W/ D- A% T$ a. Z7 O/ i6 U G4 U
int enoughDataFlag;& t1 R% L; g: |, R _7 |5 y
int yiDuanShuJu_mean_int;% y1 _. c7 T- a. ]
int int_sum_dv0;
+ [2 Z M" ?) U$ e; z int oo;! e7 |7 [; O) b: G
int ii;6 L1 e1 p6 Y% X" g
myfuck=10;' o9 B7 g# u7 Q/ A) h, k
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
0 U$ g4 E' f3 p; z* ]9 ]) S /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */; R; P2 Y( f3 Z( m( k( f1 c
6 A" ?1 b& A2 P& t) j' `, j
yiDuanShuJu_mean = mean(data1000);
5 V, K% Q; J: e4 }* g6 D( Q1 x# \3 q) ~7 O8 S. \4 P& `
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
9 L" |1 f, S1 R, W5 Q UARTPutc('A');' h, ?8 U# j7 c
UARTPutNum(yiDuanShuJu_mean_int);
, n/ ^+ T! T2 e. f" P/ P UARTPutc('\r');" I: x* R: b' ~
UARTPutc('\n');
2 e* E3 |4 @8 p$ z+ J" a7 U2 S0 @. v6 y- x
for (ixstart = 0; ixstart < 1000; ixstart++) {$ |$ S+ p) s/ [, b2 X
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;$ b" N L3 f3 x" ~. V1 Q. W$ u
}
" H) ^1 k2 c# y |# t
: J: f' ^8 ~3 h- ^0 ^8 k7 c* L2 s power(yiDuanShuJu_LowMean, dv0);
0 h) x c- Y" F. `" |2 \- q% a) q) K$ o- W4 a; m7 W
int_sum_dv0 = (int) sum(dv0);
- F2 W, R$ W) ?! ^% V2 `" S
& z9 P C# U2 X4 W UARTPutc('B');" U; {& c& K, j; E$ I* }: C2 u3 s
UARTPutNum(int_sum_dv0);4 H" u) h- d) i. G
UARTPutc('\r');
. M8 F& O4 E* C: t3 | UARTPutc('\n');
0 w/ @1 l; l2 x( P; _, l: r4 ^4 t! t/ |+ q6 R% B" z2 c
// int compareFlag = int_sum_dv0 > 1.0E+8;3 F6 F" ^( y% Z
3 ]: c* d. A4 j0 d7 a
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
( G, b: l5 l7 U# b UARTPutc('C');4 k+ C* j" P; a$ b
/* 比较信号能量 */$ x; t3 M9 ]3 n7 t
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
3 c) J& }1 _: X! S$ v// yiDuanShuJu_mean = 1000.0 * youxiao_k;+ {6 _3 A4 w% {( P9 W
// for (ixstart = 0; ixstart < 1000; ixstart++) {2 A8 J0 Z. V& p5 y; ?
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =3 @% D/ S# q0 }+ N/ P" m$ ?: K
// yiDuanShuJu_LowMean[ixstart];+ \# u# t$ f! W0 y! z8 z2 \
// }
$ M6 }. B9 J% s2 `//
- g/ G- m0 B* ^) I `. d// youxiao_k++;. t' s& {! y# A* ~( J
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
N% C5 J, P, {' X s3 w8 h// /* 感觉要取21个数,即0-20, */
' t" D6 d, e. n" o0 R// enough_data = 10;//有效是10,无效是0
$ I/ y: n$ F7 n" I: M3 M// }
! X- ^4 A# c3 q/ X( p }
* t% N- }0 Y5 \$ J4 f$ v i( \" M# G) ]/ @" f5 y* h6 ?& N; k
" A2 ?6 W6 f1 Y7 Q2 d9 Q
enoughDataFlag = 100;
7 j% I- F( T' _- m" A enoughDataFlag = 1000;- f9 p2 `: z8 [% U
enoughDataFlag = 0x02;
" B! K, a5 s( B+ l5 K4 K enoughDataFlag = 200;
8 n" k! i0 C# h# f5 p
+ |$ }7 c: I3 L1 `3 I. S) _ int myfuvk1;9 _ P( y3 U- t) A# M8 z; o4 e
myfuvk1 =11;
1 R/ o! ^6 t" v6 P4 W4 m* i, ?* W0 ~4 \
5 `5 E) \0 `( A h4 x6 x- A
enough_data = 0;1 \ L3 \* ?/ Q( x' W7 M3 [
% k x' U7 n! M; M// if(enough_data>50){' H* ^4 G9 \2 U+ t1 [
// enoughDataFlag=0x01;5 d0 G: |0 H4 o: }. `7 F8 A4 p
// }else if(enough_data<50){7 n# {' \, u/ N) U7 ^5 m w% T6 x
// enoughDataFlag=0x00;//0x00还是不行0 z& z! X- m' e/ R k
// }, p7 f, V7 [" H- _# n
5 p9 k; M0 q/ d% X) y0 r2 b& _
- _: D, Y/ _; l( L5 k
oo=10;6 @; S+ i: B" t5 X9 f, X1 Q
oo = oo < 5;: v3 u( ~5 `9 L; B; c5 _
if(oo){
/ N$ ~1 ^2 F, J }! T1 I ii=0;
% R# M0 Y5 X4 ? A) Z3 ~4 J1 k }
6 O2 y3 u0 |; g4 j if(oo < 5){& U6 x, C+ Y- O7 U* t$ r
ii=0;/ [' g% `6 K# ~2 r ^* Y2 T1 z% a
}
& ]2 y+ M) a a1 c W( e if(oo > 5){
$ m/ ?, G- U7 ^3 v' [ ii=0;
$ G6 d9 q8 z X# V% Y }
. X0 {$ T |6 W0 {" z& l
% I8 `' b# }8 j& N$ P# {& _+ `% h /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */- c1 @& M( p4 s; f) X
/* 如果数据足够才执行主程序 */
( G$ d/ n5 Z/ Y! J7 [9 ?( H oo = oo < 5;
+ I3 K( X/ r- j0 ]8 n( E enoughDataFlag = enoughDataFlag < 5;" ]% q& Q6 V7 o" h6 h' g5 f
if (enoughDataFlag < 5) {* m h9 c9 R1 c
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
/ t( c* q! i) k. |6 a AGC_AGC(&pAGC);
( M1 z% o5 x( L& z7 p7 s+ P
; J- f. |# Q1 b2 `+ n: P c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);, ^: m* _& O0 S6 x% Y! y, ]
FIRDecimator_FIRDecimator(&pRxFilter);
; p- Y9 Q+ @& G$ F& d, f2 W2 z$ U6 |; Y6 u( a* P0 N, J/ c
/* Downsampling */
$ x9 |: E. }; b; w) N- a. h c_SymbolSynchronizer_SymbolSync(&pTimingRec);4 [* W- v$ g& Y; f, n6 U
% q3 j9 v6 c v% K) p
c_PreambleDetector_PreambleDete(&pPrbDet);% d' c* G1 Z: I! p- B5 ^ B0 [
% H, ?% H2 Z: D- T" E /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
7 T8 y7 |2 i3 r% g# [ /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
# U2 @7 V R9 w) _ V /* %帧数量=100 */9 V2 h* ?4 B. h/ Q/ K% G
pFrameSync.isInitialized = 0;5 h1 S2 ?+ ~0 \4 e) z' w4 G
( O2 G; @* m# k! z% Q
/* [EOF] */$ X: J N- ~: T( I+ P' B
/* 前导码长度是13 */
( n; d$ I) m" q) m& T& x3 O! K /* %qpsk */3 _7 X% d0 u. R0 |, U! N0 q
pDataDecod.isInitialized = 0;5 Q3 ^, y. Q- _: ]) }% T8 U/ ^
5 N9 v6 ] D! }0 w# {1 `8 { /* end */2 u# R) v, X; n5 J9 n
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
& ?: e8 R0 \6 o) L2 }& ^; E, K /* Convert 3-dB frequency */ Z% ~# K/ u1 k C; w3 H4 J4 K
/* Convert 3-dB frequency */, x5 i2 i8 ~- T% T3 d- v
filtfilt(save_buffer, usable_left_filtfilt);
; G" ]) @% e# w/ Y1 Q { for (ixstart = 0; ixstart < 81000; ixstart++) {
; C7 U$ y5 w& W* \( a usable_left_filtfilt[ixstart] *= 2.0;
0 E8 E2 W* B! N& E" {/ w2 I }
% x& j$ J" g* A
1 I) k( }% T0 d7 j( l8 S! a1 S /* 注意乘2,处理幅度 */1 E2 T/ d; |# n
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
4 n: M0 y9 o. ^0 [7 O1 {$ t /* %% 行列转换 */
6 X- G' y; {# X* N7 d) i! w- p yiDuanShuJu_mean = b_mean(usable_left_filtfilt);3 x6 S3 _8 t' R/ I3 r8 u
for (ixstart = 0; ixstart < 81000; ixstart++) {" k8 S& X4 F" Q! ?% P# w/ o
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
7 ^9 _+ O3 {( k' U# I - yiDuanShuJu_mean;
8 x" C+ ?8 B4 }- _: d7 `' k( N6 o }; {" [) A* } c! H+ h1 t# A
& x$ C0 ]& J# F /* %% 应该对数据归一化,但是这一步放在哪比较好 */
' z- Q8 o8 j q4 t% y ixstart = 1;
6 M9 y2 Y+ E; k; ` D mtmp = youXiaoShuJu_QuZhiLiu[0];
6 R4 K* T7 a* \( X0 X+ h if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {; R! e0 o4 h; N) y( R( z
ix = 2;
/ Z5 \; v. R& n' \ exitg2 = false;8 s9 t! l+ n' n f
while ((!exitg2) && (ix < 81001)) {5 z- d% h* B+ }
ixstart = ix;
6 i+ w) K+ q: v* G& |' N* {6 }2 e if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
5 m% Z* O6 _* H. S' ?! z! m8 o mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];, K7 A5 K5 U) }
exitg2 = true;
& _2 [( W# m) A5 X- x" B- r4 ], d } else {( ^: o1 H- u. P
ix++;
+ H. Z( g1 `8 S9 a: Q }
5 c0 R) ?3 Y+ b* l3 O }6 y& p! l! a5 A
}* l0 a/ T) U/ N7 l
" I0 k+ j$ H9 k# X& }( {
if (ixstart < 81000) {% Q$ V! }9 B3 Q8 @
while (ixstart + 1 < 81001) {
0 O% S# j% D* X4 P' R if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
: C8 g4 k6 B9 b! r6 g; W3 ?7 G mtmp = youXiaoShuJu_QuZhiLiu[ixstart];4 o9 }' r" G$ m0 i8 Q: i
}
- u- R6 ~4 i1 J) C3 u. C; ?3 u" P, L# g$ g8 ~4 A
ixstart++;7 ~: g# m) L( b5 \$ c; @5 Z; S+ l
}$ Z! I( X7 r% d1 w4 F
}
3 O$ I3 X$ v7 U! X1 H5 `
. V4 I0 k5 I' E! k& u ixstart = 1;& w6 P- [9 Q8 U3 |" c' I' h
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
! \! p3 Y6 {" f- z) Y9 Z5 p1 T if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
3 u1 |1 ]" @0 d4 ~0 k- } ix = 2;) I/ v6 z1 h: X& B3 q$ t4 ^+ y
exitg1 = false;
4 c% u2 A9 r3 p& e' \8 q9 O while ((!exitg1) && (ix < 81001)) {: ?" s5 _1 ]+ G" s; Z* V! y
ixstart = ix;6 }! p- c2 D/ k0 v; r& d7 J2 b
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
% }$ m+ x% S7 ] yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];1 ~- Y0 Q! d* l* L, V4 ^; H. \
exitg1 = true;, s; R6 j/ G% u) _1 t
} else {& O& r' _: `. y. k- E
ix++;
9 M0 T# y1 A7 g2 B, ~ }: R: E r+ S5 Z* A' b: c
}
* j( ?# ]) W; w }7 E( Y3 A4 Q* ^' z
: R6 b. @8 m( w0 L6 v# G) g0 i
if (ixstart < 81000) {3 f+ u; l. T9 s+ ~1 w; W& E% }
while (ixstart + 1 < 81001) {
w3 x" V: {( S3 H if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) { K% O$ R; d$ e2 ]3 \
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];, \0 ?4 M; j7 i" Z l
}
0 G: c* N8 J! G0 ~$ G+ \0 y9 k* S7 V3 H
ixstart++;4 s+ z! h0 }! }) g9 j% C
}; Y$ M1 ~7 E, d: y1 U! h2 |' y0 \+ d, U
}$ E4 ^% |( c/ z$ Z
# h; I: I: ]; _; q; X yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);) K0 n/ p+ {. e
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {5 @( X$ r2 q$ Q1 `. ~/ O0 q4 @2 Y
yiDuanShuJu_mean = mtmp;
1 F6 v4 v7 @* p% z1 w }6 I; E7 Y( @+ ~0 Y6 u
7 o5 _* a# U8 ?. [ /* 找出极值 */
8 M) \; H- F+ w; n x0 C for (ixstart = 0; ixstart < 81000; ixstart++) {, l1 M/ l* g; Z/ }
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
% [% m1 H5 \/ V7 p- L2 `0 D: N/ u }
g$ S0 c; {3 P2 W* S* A$ Y- P1 p
--------------帖子字数限制------------------' W5 T9 V! \. T# X+ c9 \
}9 X; G* L! a. h& y0 h g
# h- f. V1 E' p/ f% ]* q
8 p, O5 l# f: I3 x0 h [ f |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|