|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 $ p+ m, |+ J2 S
# N9 _- F( Q- m2 z: U/ U! `( V* ?各位大神:
3 T2 ?- Y ~/ ~9 T" g9 x 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
2 l' z5 N: t( q+ e$ a# \' R 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:! f7 [0 j7 R! `6 e$ m/ d
* m# c/ g v* L$ y# P& w
{( J) E, x2 i" u( _6 ~" k: \
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。 x1 k; ]$ a4 }
, J3 h f+ L: P6 N并没有其他线程
8 t9 C, u+ P# o7 \9 H反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
* E+ x! ~* f: Z+ z5 j3 c也说不定是和堆栈有关系。。。。。。0 o1 U" H2 [2 ~# H
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....% x; P/ i% x" c: w! m9 k: c& H
& q) j, l. U3 M6 i) S+ i3 P/ X
6 e; \7 M$ g0 j# r/ e
2 T8 L s- I% p, F- ?1 n, p我也很绝望啊,希望大神能帮帮忙,感激不尽,!' ]9 I0 F" r( o
& e% N2 C. E2 t7 V" X% A$ r
, V. l( _/ ?% o5 Q$ k" s' s附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
6 Q' _, E( c8 e y! _ static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
) C2 s* R# Q- d+ _7 V' x
$ i/ k+ ?8 D9 S' {( u% k5 \) Dboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
8 `& i" E% j) Z0 B) J g const double data1000[1000]) {0 F- R4 r% p: _% g/ S
* v8 A9 b* v/ r% u! T- l
int myfuck;
( b) P' b) ]. d8 w# t) l double yiDuanShuJu_mean; i# Z5 K/ R) T
double yiDuanShuJu_LowMean[1000];- m8 q* }: E9 ~0 h7 L% R* F. _. z' L
int ixstart;, c9 \8 Z) F6 ^- E
double dv0[1000];
& O4 G6 B2 C. Y; ^$ f comm_AGC pAGC;
! k* C5 X; `( [% x8 u9 g' c; g7 f comm_CarrierSynchronizer pFineFreqCompensator;! `( r$ k" {+ Q$ ~- ^7 a9 p, I+ ?
dspcodegen_FIRDecimator pRxFilter;
" A5 \1 U3 L2 ]0 s6 D9 C' J' L comm_SymbolSynchronizer pTimingRec;
) k5 l1 R# Z. R% c& W( u4 T+ c comm_PreambleDetector pPrbDet;0 S1 L$ S& ?2 z/ I% a* ?- b
FrameSynchronizer pFrameSync;( g' n7 `7 f7 w; s' P. o- C
QPSKDataDecoder pDataDecod;$ r) q" a& _ t$ M0 Q9 }; @
static double usable_left_filtfilt[81000];, K Q$ X. A* }, L% p
static double youXiaoShuJu_QuZhiLiu[81000];" G2 h( U; y7 r. B, b
double mtmp;
: h, G4 ]8 W/ d* ^/ _- }/ O. T" q int ix;$ k- {7 q: `5 }: J
boolean_T exitg2;& V% E' `' u5 r( t
boolean_T exitg1; m7 j$ | e# R" k: O$ v) v6 K
double YiZhenShuJu[800];0 Q* D D) f7 u- I: C$ ?" ]% Y
double dv1[800];
' H% f6 V" r, j) b/ c
; K. t0 m! u2 Z
% K6 x) ~. i7 i, l$ n) |+ s double b_YiZhenShuJu[800];* z! B9 @" f* l+ Z `& i( r
double I_filtfilt[800];
1 _0 o/ \ y# i. E) H double Q_filtfilt[800];
3 j8 L3 s6 y+ C7 S4 G9 `& J9 z creal_T b_I_filtfilt[800];
: B/ A, A( s" i* F creal_T b[800];+ O6 I L$ F, o" t7 s( ?7 H" D: g
creal_T RCRxSignal[50];
% s4 | q4 G6 ^" ?6 i creal_T fineCompSignal[50];
4 ~: U0 @! x% h/ V double phError[50];
; f2 S2 T4 r5 z" H5 C6 u9 b creal_T timingRecSignal_data[28];
6 O" U; ]! _6 Y; J( W int timingRecSignal_size[1];
. d# x' ]1 J5 F# S/ T- ^ double prbIdx_data[28];0 L6 z) h8 z% o+ E8 J, `
int prbIdx_size[1];) Z& x% p# r. x7 t- a; X: L
double dtMt_data[28];
) ]4 @7 @$ L' i7 n* A int dtMt_size[1];
' [! m8 C; Q6 g( h; X creal_T symFrame[25];
- G; e+ K# X d boolean_T isFrameValid;
6 s( h& g! c* A/ i7 u double unusedU0[3];; b. @; Q Z0 w8 g M
4 Y$ s A8 q" F/ x
//调试过程中的变量& L4 ^: q$ `/ C0 s: X1 h- ]6 y8 \
int enough_data;
/ q" y" v* n4 i/ j) W8 _8 R
8 B; x& h$ W9 \ f# ^0 d int enoughDataFlag;0 c) Q L" ]8 F* v6 r; ^6 m9 Z6 p
int yiDuanShuJu_mean_int;# X2 P; r0 a6 c5 @
int int_sum_dv0;9 A: ~; T1 d3 Y, U7 F
int oo;! d' p, b9 n/ ]; p$ f8 `
int ii;
5 g4 L* N7 t8 k; C9 G+ U7 n0 @ myfuck=10;
) b7 s" z, F6 T /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */* K# X, Z5 G/ V$ n- ~! U& [
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */: i& r8 p1 t: m, U) f9 ~" T0 S, V
& s6 F ~8 Q3 f7 y' S$ p# X8 h
yiDuanShuJu_mean = mean(data1000);
% K+ a2 u* g' x5 n1 E& w/ P/ A! [3 G. K3 L( c( K. n2 z# [& J
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
: l# s t/ @1 P9 X4 }) W UARTPutc('A');
+ ]' d8 y( C- s UARTPutNum(yiDuanShuJu_mean_int);
# }* l7 _* X- G) [* Z UARTPutc('\r');+ u5 r: f, \- z, ]4 a; F
UARTPutc('\n');
" J3 ~& X$ D" |( J& z- ?' U! a/ Q; w5 X: f2 h F
for (ixstart = 0; ixstart < 1000; ixstart++) {
6 B* |( A$ q- } yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;* H1 X p+ A0 {& h- s
}$ L/ y6 j8 d `: b; k
! G$ B1 a( x+ z! M9 R6 R1 g4 S
power(yiDuanShuJu_LowMean, dv0);, j& W; u$ V. h Z& C
6 J P" L9 K0 a! M% a
int_sum_dv0 = (int) sum(dv0);0 r3 L/ o% b9 m2 f$ J7 m
! }) F& T1 U1 H. t1 x8 j$ D1 f6 Z7 l% ^ UARTPutc('B');# s, q% h0 F8 ~4 C
UARTPutNum(int_sum_dv0);" h) @3 L8 r1 i4 Q2 q, C' {- Q
UARTPutc('\r');
4 m! s$ [& o1 Q& r% Q' b; s UARTPutc('\n');
, ?" `8 }, m1 q; I+ o
) F/ ]5 y; X6 d// int compareFlag = int_sum_dv0 > 1.0E+8;
" B* @' e- ?3 f& ?: g- I0 g5 j3 O1 z1 q! m- X0 W) T
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?* {3 l ~" z/ S7 B2 X
UARTPutc('C');) y+ Q# V9 r& X7 o& k. I- z3 f
/* 比较信号能量 */ H9 g( B& }" W1 o
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
# I" W1 s2 ^9 Q1 ?# j* |// yiDuanShuJu_mean = 1000.0 * youxiao_k;# T2 g# D. T- C
// for (ixstart = 0; ixstart < 1000; ixstart++) {# A# x# i+ V }. e3 z1 x
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =( l$ b+ G+ d. D1 o6 R2 w
// yiDuanShuJu_LowMean[ixstart];
$ i- `: p6 |6 F% S! V$ X2 E// }
, a0 w6 x3 U9 [4 Z2 ]7 T//: U0 n3 @' X6 Z2 `7 T
// youxiao_k++;& U* h% D' s, F, u' h% U
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==3 O( i) s' C: i J/ ?
// /* 感觉要取21个数,即0-20, */ F0 v w; f% L% z( ~- j
// enough_data = 10;//有效是10,无效是0- E1 S; X7 m6 w$ ]1 u4 ]
// }* @$ \- s o+ O
}: F- z& F/ A4 @& n {8 r5 g
; K P8 z: {- p2 u' V. m* Y
3 x3 {9 g0 Y" X) X
enoughDataFlag = 100;% x q' f$ C ]8 ~) `/ `
enoughDataFlag = 1000;
) t4 G6 Q& t/ T& D' q$ C% v enoughDataFlag = 0x02;6 z4 D4 A7 [* m* y
enoughDataFlag = 200;' R$ g# d0 }% \" w
0 }0 N3 i/ b1 T8 p
int myfuvk1;( b9 x( s9 Y j5 k; x, H, b5 N
myfuvk1 =11;
7 W/ G5 b3 t# L; g0 M+ l2 i% Z4 j$ O* @0 O. X; X/ F5 E1 L0 e0 u O
0 B o- m8 { N' m" O+ m enough_data = 0;
0 |" ?# E3 S6 ^4 q1 n* K2 }3 d6 ^/ v& U* U# c3 J
// if(enough_data>50){2 n; H6 w# k+ q1 k
// enoughDataFlag=0x01;/ R$ x; _2 B/ c; N3 D* v# O+ A! R
// }else if(enough_data<50){0 i; \. e$ i4 ]
// enoughDataFlag=0x00;//0x00还是不行7 }4 C8 c% n" B) P+ L1 s5 N
// }
- @; b& D8 c- l6 o3 B8 i! B7 |
& B: y2 X2 A/ r t, x2 _# W) C1 A6 h2 I9 ^( s; s6 O
oo=10;: k: T3 d6 L) d) o
oo = oo < 5;
" D# X/ e' s& z* Z, ~9 |) P if(oo){. }2 u0 I9 f( G3 ~- g3 z2 A* z
ii=0;/ o/ a8 i, z! l$ d/ z, N' r
}
4 ^8 _1 j0 v r- _) R' N5 G if(oo < 5){
7 S3 S# S; Y7 @0 u2 r0 l6 q ii=0;
5 w8 u1 G; T" [: | }! h0 S7 G$ O) l+ C0 E
if(oo > 5){% L1 |- h" G4 h
ii=0;
& E5 V7 u+ j, `" @, o }/ Q k0 m6 s7 ?" m. R# x
! O9 S6 `/ R' }9 m! e( k$ J
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */$ j" Y" c- l l5 R
/* 如果数据足够才执行主程序 */2 f. M& N4 V3 G2 Y, X
oo = oo < 5;% X, _% B7 ~3 }3 \% \( I
enoughDataFlag = enoughDataFlag < 5;" [+ r; u8 a3 u* P1 K* Y- Z4 G o) k" u
if (enoughDataFlag < 5) {* ~+ M. j; t. n9 O; J; k9 H
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
# A+ g) ?% |3 s6 R# s1 {4 O AGC_AGC(&pAGC);9 b J7 X' U8 Z( d
. v) W0 _4 d) j# P4 L c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);: g' V% w; C/ `
FIRDecimator_FIRDecimator(&pRxFilter);
# A1 J* r# f R+ |2 K+ y6 ]: i4 r# K2 }5 r$ U5 J0 X. N' A
/* Downsampling */$ D) O5 L4 E4 N" V
c_SymbolSynchronizer_SymbolSync(&pTimingRec);% }; J/ }# s# j0 O5 t
- X [5 @) `4 l
c_PreambleDetector_PreambleDete(&pPrbDet);, h6 t( p% d }# U! D8 N# H
6 H& H1 F% s! ]' v4 I* u
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */* E: }1 J: @! Y
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */6 E0 ~. P' T( p2 M+ @
/* %帧数量=100 */
& C) P; W2 i6 O1 a pFrameSync.isInitialized = 0;1 Z- ]) _$ O0 K
% U! ?# A( J) F* q9 ]/ G4 M2 J /* [EOF] */2 B0 r4 G6 }6 \, b+ W
/* 前导码长度是13 */' v& ~+ g' X: y7 b
/* %qpsk */ N2 b9 s" n, ]1 C3 T% ?
pDataDecod.isInitialized = 0;% b8 w) v3 d( W8 j
5 X( D: W8 {- e, J- A- T
/* end */
( |- F2 b& @1 I& p& I. _$ p /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */$ n5 D# E# }5 p0 B) w+ T1 Z
/* Convert 3-dB frequency */
! P5 {. Z4 Z! j% D& m2 s /* Convert 3-dB frequency */
5 f6 i: L) |$ V: y; u filtfilt(save_buffer, usable_left_filtfilt);
. b3 M# M* z5 Q9 T for (ixstart = 0; ixstart < 81000; ixstart++) {6 o. w* R) Q/ \/ l. D/ r+ P9 ]
usable_left_filtfilt[ixstart] *= 2.0;, g! ^6 D! b; G* Z0 N. C6 c1 @
}, v# _6 I# O$ m' n1 q2 j
: J1 W+ F" H H# [4 M, P! p6 s" j& g# b /* 注意乘2,处理幅度 */
& r8 A- r! g. z4 q$ r /* %% 我发现带通之后其实就均值为0了,不用这一步了 */% O4 A8 x" H; Q8 F
/* %% 行列转换 */
- E5 N3 P5 m) k6 `. R% E6 v yiDuanShuJu_mean = b_mean(usable_left_filtfilt);2 ]$ q) l* |2 h S- y
for (ixstart = 0; ixstart < 81000; ixstart++) {. Z/ l0 M- x i
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
' L! ?4 F! ^- w) t1 ~9 G Q, @3 h0 b - yiDuanShuJu_mean;
& q& L0 @ i' |2 N }
7 ]1 B+ ~ B! k" B, z& `, e5 M1 N" V/ @ }2 o
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
4 z% M& \' e& ^$ Y# z4 T& {: Z0 ] ixstart = 1;
, Z. \4 x8 C7 n# i: [ mtmp = youXiaoShuJu_QuZhiLiu[0];/ ]( F5 H) C3 r
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
3 m8 a( H: [. x9 |' Q ix = 2;+ D% x I; z% q) H
exitg2 = false;4 ^, k' d' E) Z9 S, b/ `8 I* V
while ((!exitg2) && (ix < 81001)) {
* ]+ m. W9 n( l- o0 \ ixstart = ix;
( X3 n2 O2 Q( t* w3 g7 d- J if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {; M2 o V# Z7 ?: m1 T: Y! |
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];. R+ i* J- R% |" K3 n
exitg2 = true;
! U1 x/ x- v \% V1 v } else {% G3 s5 }& n0 g, I" D- J, ^
ix++;/ X4 Z% R" M1 ]/ A6 j! {- P1 _/ G
}
& `! D0 M9 H# L6 w w. m }
' G; j! T" K' V) V# Q; k' L3 |4 n1 \ }
) o& _# c. \# g' U0 [7 v9 a% E3 w; } w" E# o7 L4 ~: {
if (ixstart < 81000) {. {* a: n7 p5 @$ y
while (ixstart + 1 < 81001) {
; [" P1 ]0 L& v% t" b* d& [9 h" z if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {. ?0 S. H9 v& t) F: w) ?0 [
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];/ W ?2 V& v g
}
4 T# z5 G4 K) b% D" L
1 a i" A* w: F6 `6 Y ixstart++;9 W9 t/ w" V* W2 h& ]
}% i( i4 }; L; J, e# R
}
6 L- c/ D# V6 y: a+ M3 }1 h1 {; e- n
ixstart = 1;5 I, ^- ?; e: e! {
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];; h1 m4 \% I! q3 ~) {
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
& M8 Z4 `! v0 \. @9 ]0 _! w ix = 2;. y5 P" y' Z' `5 S
exitg1 = false;# D# Y% v2 [3 {7 r+ o" n% m
while ((!exitg1) && (ix < 81001)) {
/ J8 [( N' x; x4 [" J( `% a* i ixstart = ix;
/ O6 {* V& O4 n8 U" ` if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
; i, a3 _2 N+ U4 x6 K$ Q' V yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];% q+ D- d/ M" Y. r/ Y
exitg1 = true;2 B: I( A+ [( f) Z" O( V
} else {9 F) w3 P4 J. E1 [+ I! L
ix++;
8 p& [. p8 ~0 q" X- d ~" k }: ~ \' B2 w1 F
}1 o# j* k$ x9 y) V% V4 R
}
z0 ~" A: V) W; z4 h, A# w8 k c, ~9 K, A: ^
if (ixstart < 81000) {
_* J' D# |% {& k" n; S. \ while (ixstart + 1 < 81001) {; ?- C$ q% A! B' Z, L8 U
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
( x4 ^4 M/ L: [( f( y# P4 U yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
9 |4 o& P. t5 i( N. [ }7 C2 B. v/ P( C1 G( B
& D5 ]6 d( [4 `$ [: m
ixstart++;9 q! S# q3 R$ d) d8 }8 a, a2 B
}: j" {* a! y1 y. F0 Z7 G5 i
}
+ B4 x+ u, ]! T
; V8 Z4 I, a' I6 Z8 K, O yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
: L+ }' n) H3 @ if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
9 W+ K/ B* B1 S& K9 b; q4 A yiDuanShuJu_mean = mtmp;
. E. q; C% |( L) H$ l }; B. F' \" L4 p( x$ ~
4 P/ q3 z1 u, T# f
/* 找出极值 */+ C9 b2 p& Z! k' u
for (ixstart = 0; ixstart < 81000; ixstart++) {0 x1 I' N* B- |& z# G
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
. K! [6 e& t4 @! v7 S }
. W7 v- H% V7 Y! \5 @: H
7 a' z3 o0 Z& g8 ]- Q --------------帖子字数限制------------------& o' d/ N! e3 ^8 g+ d# y+ V. y
}
5 R" c% w& I+ G1 B
0 K: a q& S) n; F: D! m/ a+ ?9 D0 m1 i7 X- B
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|