|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
# m' A5 v$ [7 @
1 c3 V7 z8 g& r# B) W各位大神:
- X7 I+ J; o3 X3 T3 R# u 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
5 h& R5 Q2 X5 Z+ f 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:7 s: @; v" ?* R) m
9 t! e! U0 c G! W7 `4 d
7 V3 }. ?/ D! m- z- K这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。4 g" N# J. d' X( Q& _
/ g8 t" l/ F1 J6 ~5 d z& p9 [! u0 E
并没有其他线程
& D: Y1 j0 d- i" _反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。+ a6 D( x' p, h" Y. d
也说不定是和堆栈有关系。。。。。。: S" e5 l* }5 L+ u9 ~+ _' B
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....8 @0 D& N* p5 S8 e U2 F0 |
) M/ M' T0 s% T I
! Z! n! N. g5 ]; K4 Y1 D* n6 A$ n7 y1 q
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
& e+ A9 J! T+ k W8 I
; K5 X' J$ `- @, h: b( x8 W) ?( y
4 i4 I1 S( S+ C2 `附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
$ ^) r* J: h" \7 { static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。6 `, I' L/ `! i! |) ~/ Z
& M9 v M4 E5 }; H: Iboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(& m7 I4 R0 ^$ ?1 W8 C7 {
const double data1000[1000]) {+ Z! P s) j1 Z3 \0 I
# T( _, Q- A# j7 z
int myfuck;/ }$ o/ p- D7 J1 K
double yiDuanShuJu_mean;8 ]' ^8 ~& O7 u" c" `
double yiDuanShuJu_LowMean[1000];
) F" s& `! \( K+ [+ F6 \ int ixstart;$ J3 ~0 V$ L( u% d3 V. M+ g
double dv0[1000];& W- Y1 q" g# d. q* o Q
comm_AGC pAGC;
- B8 d( g# v, L* ?+ h% N( } comm_CarrierSynchronizer pFineFreqCompensator;
& E- L& j' h$ Y- @/ k" n0 i9 A dspcodegen_FIRDecimator pRxFilter;5 t* i! }! S+ f
comm_SymbolSynchronizer pTimingRec;+ R( K, G: I; h. z
comm_PreambleDetector pPrbDet;
* b2 _8 Q" v' I6 y A! V& Y( K FrameSynchronizer pFrameSync;
o2 b7 d4 }" u( w QPSKDataDecoder pDataDecod;
* _0 u+ X# @9 B- |9 Y static double usable_left_filtfilt[81000];
$ s: f$ J' R2 G3 \+ k static double youXiaoShuJu_QuZhiLiu[81000];" p* M& V4 ~7 c5 n6 `$ R
double mtmp;
: Q" O" P8 p+ N: G% M. x int ix;8 v; O6 i6 g/ L) A) F- H6 z
boolean_T exitg2;( V, d5 u7 ~5 H) U7 M+ D
boolean_T exitg1;
& ^; A9 X* V ^5 Q double YiZhenShuJu[800];7 J5 Q0 r6 l+ O3 q9 p
double dv1[800];1 r6 M3 n2 X. y
5 N1 K! H7 O: z" [5 A
' c# T; E1 K6 J: E# p% \3 m double b_YiZhenShuJu[800];
) l0 B+ L/ [1 W# K double I_filtfilt[800];
- s' w* x4 P, F: Y double Q_filtfilt[800];
' K- S+ W: i- j" Y/ z' P; @# d creal_T b_I_filtfilt[800];: S) t/ Z) T8 N$ J0 L
creal_T b[800];0 r2 j' @. q$ ~$ [% H0 j
creal_T RCRxSignal[50];
1 V/ S, r) R9 w& k2 l) i' f creal_T fineCompSignal[50];: j. Q* u1 _& ?
double phError[50]; K, @( ?5 ~% B5 J
creal_T timingRecSignal_data[28];
/ H' N& h( ?3 n2 p8 ?! F int timingRecSignal_size[1];
: |, g2 J+ u7 O7 X double prbIdx_data[28];5 J6 \2 E1 [& G8 l3 |
int prbIdx_size[1]; J! ^% P% t) D) e% n, ?
double dtMt_data[28];
3 p: Z; d; A! }( `1 ^ int dtMt_size[1];+ u. |. i! i" n9 f/ v) T/ D
creal_T symFrame[25];) ^0 J; z$ f1 B {2 z
boolean_T isFrameValid;# k) B6 l2 O' b) Z
double unusedU0[3];
3 I U7 H' b7 S& Z% P( H
0 j: `; _7 |8 T5 W% a; R //调试过程中的变量8 T- R9 u( A; D. z \- r
int enough_data;- C4 y( N6 ^0 X J3 l
2 W. m& _# k3 @1 x* T5 u1 M int enoughDataFlag;5 A2 m( C! K# S5 W, J
int yiDuanShuJu_mean_int;
( m# I" N3 ?* ]' [6 h1 }* ? int int_sum_dv0;
: i$ D' |! v8 [# C9 ^6 z6 N8 r. ^% l int oo;
. M' i1 O `) m int ii;
7 F: d. F% b0 P7 U" ]# ~, K5 y myfuck=10;. r. R4 l) \! r2 G. Y$ e y
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
3 `& u) K4 e' w, F! g6 E& V /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */" `* h$ z' i9 \# F7 E! c) W0 I
7 D2 F$ ~5 ~* z& b8 r& E c1 r yiDuanShuJu_mean = mean(data1000);
8 j. h+ U! V# x+ I F ^1 }( p% Y( ^* o. G/ M+ s# n& o
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
: n" ]* T3 F$ c" j* N4 c0 L! J. w UARTPutc('A');
b, \' u4 h2 i! v6 j$ U# Z UARTPutNum(yiDuanShuJu_mean_int);6 p2 |4 F8 x3 k2 r% p0 @, X& ~
UARTPutc('\r');7 _) k* d; R" k& i" }2 H
UARTPutc('\n');
: F& |) h; j! N3 q0 D4 V8 g7 t0 Z* K4 O1 }8 o
for (ixstart = 0; ixstart < 1000; ixstart++) {& s9 P+ {3 M9 r: c9 X2 |
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;2 z4 w4 f: e0 }. z- N+ R4 _
}
- |: m8 P$ e7 _0 j+ }+ Y3 Q {/ A8 w
power(yiDuanShuJu_LowMean, dv0);
J0 x. ^( U: X/ u1 D& t; R& L1 Y$ R# B% {
int_sum_dv0 = (int) sum(dv0);; j S1 r4 j9 j( t
. T/ N8 g d, Y& l+ @6 T
UARTPutc('B');
' j% ?' u! x3 v/ P# r, L2 h UARTPutNum(int_sum_dv0);
7 C. Y3 B; T0 h! v& m! y UARTPutc('\r');$ Y8 |! p; @/ }1 E
UARTPutc('\n');9 e. M4 u6 M% g, O5 w
! ?) z6 v. D r7 |! J7 C// int compareFlag = int_sum_dv0 > 1.0E+8;6 x. s. J7 ]5 q( s9 N2 w- j5 D
" i: @: M3 O# j6 _8 u! p if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?) `5 \$ T5 m2 S# L% W8 R! D# f. B
UARTPutc('C');* s/ z3 W0 |' \/ V: |/ |
/* 比较信号能量 */4 v5 l& d2 M& W6 l P2 V4 D$ l
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
% z; } J) H0 P8 ]// yiDuanShuJu_mean = 1000.0 * youxiao_k;
+ ?% y: @+ D' `, j5 X* }// for (ixstart = 0; ixstart < 1000; ixstart++) {0 s n9 n" X* a; {1 e/ C
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =) Z' W* g+ X% y4 h; ?! i- _8 q
// yiDuanShuJu_LowMean[ixstart];* q7 z& L! J7 a: U5 J
// }
$ ?+ U% ?4 [# k+ O. [/ z//( \# F' t6 A3 c9 @9 _2 E
// youxiao_k++;
/ @+ `8 k% Z: n7 z// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
' v) o( E9 | Q% h# t// /* 感觉要取21个数,即0-20, */9 Z6 r. E) ^1 R6 m% I5 U
// enough_data = 10;//有效是10,无效是0
b* G* a* v, h) g' I$ N" p2 ^// }0 L! k& \9 d: P! O1 n$ R
}
' \6 }# M# V1 r4 y. m3 ?6 K1 G" d7 ]: y9 Z
/ ?4 u( a) G, K enoughDataFlag = 100;
+ r* `7 D7 H1 _ enoughDataFlag = 1000;" _5 N7 M1 ?7 r1 q; Z3 M3 K- _; s, R
enoughDataFlag = 0x02;
8 V2 _9 A2 m! l1 ^8 S! b enoughDataFlag = 200;$ S, U: t) j! F7 l. ?' X
+ E/ b" N C; k/ X
int myfuvk1;
3 h5 S. [# [; u myfuvk1 =11;
9 z; U- @3 i9 \) K H9 ?
0 o; j* A- _3 D, I8 A% _" r" w1 o7 G2 ^' A: O0 ^
enough_data = 0;5 s' ?6 f# e0 g+ @4 K
' j0 R6 j; p0 a) @& O0 g' C" @
// if(enough_data>50){
8 P2 n" v; L ]# m// enoughDataFlag=0x01;+ x+ t+ o# W: e
// }else if(enough_data<50){
) l' `+ e. ?7 b$ ^- H d* N// enoughDataFlag=0x00;//0x00还是不行2 t. u0 _$ G: i4 t y& H* d
// }
: A. y& z: u* H9 J M1 K* I6 o( [6 x$ x, x( ^
3 n& L% e/ W/ T oo=10;
: u: t5 H; [8 [# q( i8 z oo = oo < 5;
R2 M- Z# m/ L' } if(oo){
8 b8 n" i+ R4 \4 k ii=0;
1 _' E w8 ^8 _+ l }
, S% ?# C# k$ |/ n# D( Y% \ if(oo < 5){
5 h: Q: m4 D. ~) W8 }8 \& c ii=0;
' i9 r' o# i& r5 E! \( v' \4 C }
# p. p) Y3 X k. W$ N if(oo > 5){
E: |7 t- v1 t5 T* l ii=0;
# M+ z! f+ x& c+ W$ O }
! y0 \$ m% h& z7 k
! |. m1 B7 w/ X i$ ~6 p6 n% b7 T /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */) V. d" [- y6 a
/* 如果数据足够才执行主程序 */) P" x* [- l @: O2 |3 ~
oo = oo < 5;5 f. w/ V8 |1 q* w& C
enoughDataFlag = enoughDataFlag < 5;
7 r, B) t. |# G if (enoughDataFlag < 5) {, ] s; [: f. O/ d8 {1 \6 L
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
5 `8 Z* c4 a# q8 A1 f. v AGC_AGC(&pAGC);# p9 R$ j9 I! Q. A( v# U* g
$ d9 y6 L+ P. H! g7 Q+ ~ c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);3 D$ s; q) J; u n% D
FIRDecimator_FIRDecimator(&pRxFilter);
8 o ~% t$ M+ ]& g2 V
8 I; h. V* G' J% g4 D /* Downsampling */: H7 R2 O, _& a
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
9 g$ ?: H# Y2 H0 d
( t1 L, J3 f( N) H$ t0 U- I* _ c_PreambleDetector_PreambleDete(&pPrbDet);& i/ G0 J9 @* X; \! s5 v
2 T, x7 H' d3 r* R$ ?6 I8 \- E' y) m
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
) P( u& D. Z6 A {7 k( I3 y, \# e /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
2 |5 O7 D6 [, J; {/ }) |" u. u" G& [ /* %帧数量=100 */2 } y5 c/ t I6 T% @
pFrameSync.isInitialized = 0;
1 `* L* k$ }1 C( Y# p. S; B) j; R
8 Y3 P% T- l( _+ D( d' m /* [EOF] */
* n6 }0 B) n, ~1 V, A /* 前导码长度是13 */
; d3 T8 J6 h' A( l: K# Y /* %qpsk */: j Y+ k; w1 y% S- [1 c
pDataDecod.isInitialized = 0;# g' t* i C) ^* a+ K, q) }
# } E% k( h3 [* `% k* |
/* end */+ g0 ]1 _' M1 F( ]' c8 e$ w
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */, J4 |+ b5 g& \- i
/* Convert 3-dB frequency */
, A, O4 n9 O$ [' g1 N /* Convert 3-dB frequency */; u J4 b2 P' Y" I
filtfilt(save_buffer, usable_left_filtfilt);. i" U8 i6 A# ?! ~; a, [3 c# T5 ?
for (ixstart = 0; ixstart < 81000; ixstart++) {
' @7 I# n3 P* D- r" U5 |) a usable_left_filtfilt[ixstart] *= 2.0;
1 f+ P: x5 z6 s6 E* v7 r0 F }
7 B0 ~* r. P7 x$ @/ B
$ d W; {: q/ `- d( { /* 注意乘2,处理幅度 */
7 t5 J$ l$ R8 G+ y0 U2 ~7 { /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
' K' R9 T" \3 H& N, U /* %% 行列转换 */
L$ R7 h4 q- p yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
( p* Z. z- c0 e0 }3 S for (ixstart = 0; ixstart < 81000; ixstart++) {
/ t. C2 v/ q" \ youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]3 s* R Z/ f2 A& Z+ K8 R+ T
- yiDuanShuJu_mean;
}, o$ H+ k& g1 F }- X( @- S! Y5 h! d5 J
3 d& W3 l8 e7 }/ R; K7 D /* %% 应该对数据归一化,但是这一步放在哪比较好 */* r& B: G+ k8 _; T# z7 I
ixstart = 1;0 \% \4 h! N, c+ N: z
mtmp = youXiaoShuJu_QuZhiLiu[0];
8 A" ]% e0 Q. J. u if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {$ O- ~, R: s; n$ z7 s! ?7 A
ix = 2;7 Y0 V, l7 ]3 X6 {5 _( L2 P
exitg2 = false;1 L/ E0 F: \) l2 u8 f' I
while ((!exitg2) && (ix < 81001)) {' B# o+ \' M, I e# F6 }
ixstart = ix;$ L- V; r2 p: ~. L- J4 r& X
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {$ S7 F! a1 ], i- X" t- }# K
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];/ {5 q* h. i6 t: D- h& s; O
exitg2 = true;
0 g; d7 f- w) ?$ c8 }4 M( x } else {
X* X2 w/ w# v) U6 I/ j ix++;
6 O9 j' a$ B9 B/ e }
) P$ x d3 G' h" @& D: }+ N }
) ]- S0 k8 E7 m- ]3 X' m }
/ c1 A) Q' U8 S7 \2 U+ s1 i# e0 g: F) P, a* Z' u0 w' ?
if (ixstart < 81000) {& X, e1 E( C R$ y9 I
while (ixstart + 1 < 81001) {' O# W5 x& c1 \5 P4 e) {4 c
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
. i/ V6 _6 s' T5 k" `9 v2 ^4 y mtmp = youXiaoShuJu_QuZhiLiu[ixstart];0 v% W- y5 ~3 o6 M3 C: X
} [5 M8 H! g# N
3 p5 _( j M6 ], k ixstart++;
) _' u9 l$ i, c" r$ D+ y7 R9 f }% D- V% U) m7 w' q) l
}
$ n% ]( A1 C' G! b" o4 q' C% \5 L: p# l" w' d* _; ?2 x0 q
ixstart = 1;
% T! L) G/ q' o& t+ C yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];/ ]6 i% X+ g+ T N
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {- Q% z2 U2 K' \8 [/ ^5 Z. {
ix = 2;
! h! q2 M" y4 }2 h# U9 f exitg1 = false;* U1 ], F/ v4 `. n' }+ m9 r9 T
while ((!exitg1) && (ix < 81001)) {1 ^3 ?; c& G" R& G
ixstart = ix;4 i6 U/ r* {1 N3 j2 m+ Q# D7 c
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {$ n6 f1 [8 K8 h7 ~
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
: |9 N0 w+ A* b0 f exitg1 = true;
: J3 Q- F* A+ g) ?% c2 I- e } else {0 ^! |1 D5 k, _2 |: m0 _ n
ix++;- l6 \( P, I( ?8 f# x. V9 r: |' {
}- @' M3 m& C- N: v4 F
}! Y+ s1 u r) A: \
}
) `) u- o2 l* E& j" ~; H! V: u( s
if (ixstart < 81000) {
5 l: O" d9 N; O; K& k, H% I9 m, ^% \ while (ixstart + 1 < 81001) {: P. ^. k q4 ]5 L
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {. v1 F8 S6 ^1 i( }% R
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];: s5 v; w- z. K; ]
}
$ Y* M8 v! D7 _, Z6 w: k% F/ j) j$ A2 i* T( v5 u
ixstart++;
3 E' n# b/ G; o/ x3 b2 I# D }5 e) V( K8 D; a2 w8 h, W1 t0 G
}
p- i9 a' H2 ]) d
9 O- Z1 ^7 [! T, e yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);) [& Q2 y" ^8 x5 a( J, w! A
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
# f4 `5 f1 R! Z# b yiDuanShuJu_mean = mtmp;
; @& y0 Z; K3 r3 r0 v6 e+ z }$ @/ _+ I) _$ @0 E+ l3 y
% O b5 i v& b
/* 找出极值 */
B" I5 k9 x+ R. Z for (ixstart = 0; ixstart < 81000; ixstart++) {8 X2 o5 f% q7 \. q! c: J$ ^* Y
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
! M" @5 {/ Z6 Y' a+ Z }
: _8 F) ]' H% t M7 Z
! M' e0 ]7 i2 b0 O5 ~ --------------帖子字数限制------------------
' P* J& x3 u/ E1 V3 d# M; |% a}
# N% m) s) V0 d! h8 e3 ^7 [9 I+ t) Z |' c( i
& H# T% k' x* G
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|