|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 # i& T+ J5 X/ P8 n! s9 I
6 o+ m$ A4 [" G: E) O! o各位大神:) h" s; Y7 J7 d* ]
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
1 ^5 W4 r( X; S7 K7 v) b- e 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:% A0 {2 X6 x# n! d. s
; _. U. W. J! m7 q; _! H# Z3 S 4 v( v0 {$ ~! N" C7 n* z
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。/ W9 F9 H9 r3 P+ ^* l
+ G F" h# p& e9 \3 `, b9 o9 J
并没有其他线程( C3 J2 h% P4 H0 G# n0 s/ V1 j
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
. N% W* `) l7 @也说不定是和堆栈有关系。。。。。。$ ]% j6 H$ f' i# u' C( @
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....8 m4 a6 Y. p$ Q
( c" |; M* \; p3 J8 j
' q% k2 s5 p" m8 U- i/ C) t
# k) T. Q) g7 G我也很绝望啊,希望大神能帮帮忙,感激不尽,!
" f. |" z, m' C6 m- |6 B
) Z: C" h+ n8 {0 t2 @% N+ Q% K7 y6 t! n N; k+ |
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];5 s, i/ W: b/ W$ z# P
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。! m) D- Z$ d4 l9 w! Y! I# Q8 s
( z3 L4 ~* B5 I) Z# U+ x; X- Q
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(/ H8 R% b, N6 y! G3 s
const double data1000[1000]) {
+ o- { q+ ~8 e$ `
. c: ]& D$ N5 q! W& t+ r5 M int myfuck;! `2 H8 `2 \$ H; [. d
double yiDuanShuJu_mean;
+ @' D% }" c" i6 ] double yiDuanShuJu_LowMean[1000]; u$ h F3 W% n+ e1 w: y, I' \
int ixstart;3 n2 d, T5 E! _7 C) {4 D( q
double dv0[1000];7 G# {0 E8 h8 ` _8 J7 p
comm_AGC pAGC;! Y3 o. R K: `/ |% S) H* z' O \& H
comm_CarrierSynchronizer pFineFreqCompensator;
' b& W9 b0 R/ |0 h1 d, f" T. p dspcodegen_FIRDecimator pRxFilter;
3 D4 a r, o1 {& {9 ^" i5 ` comm_SymbolSynchronizer pTimingRec;4 P+ {: f7 Q! U% n. c# K
comm_PreambleDetector pPrbDet;5 k+ D& K8 g4 H3 v3 N
FrameSynchronizer pFrameSync;
) _0 O; p6 V' g; a! X1 j' p QPSKDataDecoder pDataDecod;
0 Z2 j1 P( m( H! j$ y+ R static double usable_left_filtfilt[81000];/ R3 K ]! {% {5 F! X% P+ ]
static double youXiaoShuJu_QuZhiLiu[81000];
* d$ b" I d" Q, e# Q- C double mtmp;: a' y9 Q0 p* e2 |+ `4 s* d
int ix;+ X+ [3 V2 `% n
boolean_T exitg2;
?+ h; R# c; c7 r$ J) J% r4 ~; ]0 \6 C boolean_T exitg1;
, [% b! z7 m/ R0 L( ~% Q double YiZhenShuJu[800];5 U4 R4 m; E0 @' d* `6 ~6 s. ?
double dv1[800]; q* X6 c# I( a2 k
; t" \" P( K* J0 T8 q/ a
9 d) v4 m7 I) C
double b_YiZhenShuJu[800];
, w* ^# D- x; q double I_filtfilt[800];
( s/ T7 [! h8 x* y& n" e8 ^1 |: H double Q_filtfilt[800];9 F' {1 `5 Q* R1 \3 v
creal_T b_I_filtfilt[800];
0 A* ^* @) h. z* r& {7 A creal_T b[800];
4 v, R) _8 ?) b creal_T RCRxSignal[50];
( i) G3 ^1 @" S% [ creal_T fineCompSignal[50];$ l! q! l$ U5 ^- J8 }7 V; _
double phError[50];
" E. O- p& B; _) n0 p9 n7 v creal_T timingRecSignal_data[28];; `/ \/ T5 P; s. Q' R5 g. `
int timingRecSignal_size[1];
8 R/ `, y. b: E! ^: Q double prbIdx_data[28];; E2 n8 L1 ^ Q7 A/ e {
int prbIdx_size[1];) Z: a5 A- ~/ S" g; D0 Z
double dtMt_data[28];' C* j0 B# H, o3 ^0 g, \) u( f/ e
int dtMt_size[1];7 w- t/ s2 q1 o+ K& R; K9 g* m1 Y
creal_T symFrame[25];5 q* L4 o$ R7 I
boolean_T isFrameValid;
5 V# s) i( `: c' v2 V$ y double unusedU0[3];
6 Y5 } o& e: U: M: `; M2 i( l" {8 L6 U8 Q
//调试过程中的变量, @0 n" s+ w! X4 C% X
int enough_data;% D' B( E; I7 J- l, R( b
7 m- j1 {5 l6 {5 w- n4 R* l$ s2 a
int enoughDataFlag;8 j# t: ?6 w9 X6 E% H$ ]
int yiDuanShuJu_mean_int;/ s! n3 T0 g! t+ }) B: l
int int_sum_dv0;
" _: Q& a3 ~! X+ _6 ]% x/ V; Y int oo;: c9 z. b! U6 |- ^* M! Q# |% Z
int ii;
2 u1 c# n! d+ ~$ c; y myfuck=10;
) K+ N- O/ H; E, U /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */3 |1 G' |. `4 d5 H; D1 c
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
" l) D% m: j% Q4 O1 I* X6 ~
. Z- A# h1 e g7 F% f | yiDuanShuJu_mean = mean(data1000);
) a/ L( x F( I0 @9 x7 q; o' M1 \
* j3 b& X7 p0 X# t# z3 [* x yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
2 f& Q- ], W+ S- c1 `- i UARTPutc('A');
# p# S" ~ t. @9 @: Z1 K) B UARTPutNum(yiDuanShuJu_mean_int);
2 c" f M( Q$ |4 v b UARTPutc('\r');" x- E% X1 x9 A
UARTPutc('\n');% r- ~! v2 r; v/ i3 S
; R) ~% N2 @ i8 R8 [# C
for (ixstart = 0; ixstart < 1000; ixstart++) {- R* f& E1 U$ G# Q, @
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;) s E2 w* J6 a; y5 L1 B
}
. q8 P* I& n- [9 _- X9 | @$ R9 P) t+ N' I/ L+ ?7 \
power(yiDuanShuJu_LowMean, dv0);' R' A+ K5 p" y
7 p" [0 h- h: f7 F) h; k7 `: F int_sum_dv0 = (int) sum(dv0);
' M) m9 }) \1 b- g4 A$ M1 S3 o1 v
& B" h" ]; O( b UARTPutc('B');
( l8 t [' l! p8 r! r% Y2 c# Y UARTPutNum(int_sum_dv0);
! u) l* y1 @" ~! C* k! u UARTPutc('\r');& R7 Y) p0 k# g
UARTPutc('\n');
0 T& U9 s: C# [
: b" t8 ^: \' ]8 v// int compareFlag = int_sum_dv0 > 1.0E+8;4 ^( r6 e6 L2 m; R; A: S F
+ A" l8 ]$ K |1 y4 ~
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?8 z; u0 q" Z$ Y; ]& `; U
UARTPutc('C');
; z5 N, p+ M; b /* 比较信号能量 */
4 d! C, Z- x; T: A7 {: k0 P /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */5 N& s6 a+ I! v& ]' J
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
9 l7 U8 u2 d! h; {! W// for (ixstart = 0; ixstart < 1000; ixstart++) {8 O. M% B7 h5 a- O
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
" |- T1 i* y) |! [// yiDuanShuJu_LowMean[ixstart];
3 M( o% n8 c* f" a// }
4 U# t& q7 ~: Q9 K// ^! e- @9 X# ~+ s' A
// youxiao_k++;. p" P/ j# P7 X/ \
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
5 z- h6 {! f5 @: o& Y+ [! Z6 S8 g// /* 感觉要取21个数,即0-20, */
0 W6 ?% @! ]2 x/ w// enough_data = 10;//有效是10,无效是0
# x* k+ {: h4 T// }1 i9 l0 S; e. B$ p. R* Z0 C
}
0 s$ }; ~ Y. w8 G# T9 m) }0 R9 A6 v2 ]# {
; p) E7 x5 ~ n9 \) g: w
enoughDataFlag = 100;
# n( P7 L1 F7 O5 q enoughDataFlag = 1000;
1 N" ^9 y( b5 s4 v% M- S enoughDataFlag = 0x02;
7 _: S6 m1 W& B% U2 D: C5 T6 M enoughDataFlag = 200;
$ f) \1 ?1 J* \- [3 f. B0 ?% s3 O( }8 C/ v) r9 s
int myfuvk1;
5 N0 t" l) }( S5 ~: d( F myfuvk1 =11;
/ A" ]- w# g' E
$ Y; @* @) t/ r% [' x: M8 G- D
6 b$ e; f/ l4 z6 y: z enough_data = 0;
7 K, a( f( u* w7 G. Q
0 `. R) R g, q// if(enough_data>50){
! R0 t/ w( q; d. ?/ N// enoughDataFlag=0x01;( V( E$ d5 _) B! I( U
// }else if(enough_data<50){
* f4 h( L4 D2 D' j// enoughDataFlag=0x00;//0x00还是不行- @6 d9 e! w5 D; ]
// }
$ u# } o8 z0 b# ~! J" y0 H& W2 Q7 l3 E/ a
- o( H2 T( {7 O, N% [ oo=10;& ~6 _! N u. H. [* T q
oo = oo < 5;$ `3 _, C. t! g# x
if(oo){
3 Y7 W$ H, I1 M \8 U ii=0;6 t4 {9 D* [$ g [' k
}" ]3 X" K. n) _3 k" C! i" k
if(oo < 5){
! U7 J+ x. Z/ G; _ c0 [6 ~) J% ~ ii=0;, G4 F$ k+ L' Q
}7 ]( Y5 L$ t6 c6 ]) i! F
if(oo > 5){( ?. C& [- v& x% L4 ]3 L
ii=0;
3 E" ~4 n1 U( ]" i3 M' v }) r/ L5 O: j4 t0 r% L4 y' \
5 f( D# ^3 ~) r+ Y /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
7 c# n/ p% [( n. h1 F /* 如果数据足够才执行主程序 */
; [# {/ ?) X0 ^; j# o" M& g1 ? oo = oo < 5;! e7 ?# V% |4 h( ~$ @
enoughDataFlag = enoughDataFlag < 5;
5 W- L7 Z! T4 [4 b# ?( s if (enoughDataFlag < 5) {
# @6 V3 N/ q' W+ d6 m/ b d, [// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
# c& X: ~4 _! Y( f" t AGC_AGC(&pAGC);$ I! _. ~. ]+ T) \3 W
2 d9 g+ Q i' B' [" N% {
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
& P' H, @# a3 J FIRDecimator_FIRDecimator(&pRxFilter);
" E) x$ `' c3 Q! b, I$ d: { b- k/ l& \( s/ m0 g, Y
/* Downsampling */
1 a" E3 E* H2 K+ @' O c_SymbolSynchronizer_SymbolSync(&pTimingRec);
& e2 Y0 j1 r! u4 ~
+ l/ q/ d- R* \9 L: Z& i5 Z$ N% B1 Q c_PreambleDetector_PreambleDete(&pPrbDet);
2 K" E, }9 Z. U1 U: W7 b) d0 w9 R1 e: d" d* ^& g9 b+ }
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
) w7 ~/ q# \3 ^" i! z/ T /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
9 r4 A8 O1 \' A) u$ J3 D /* %帧数量=100 */
* D! ?2 w. d. C' L- s: y4 R pFrameSync.isInitialized = 0;" W2 ?8 N# E, r S, k$ F
) \6 _* B; F% l) z
/* [EOF] */
; j" S! ^6 `1 N2 ~( e0 a! M2 z8 @$ D /* 前导码长度是13 */3 T# b/ ~8 h( c* E2 z
/* %qpsk */
# U+ D8 Z" T0 ?/ r$ i( m" @' y pDataDecod.isInitialized = 0;- l$ T5 j4 O# B
9 ^3 W* n3 j, b T7 [7 h) {; k, I
/* end */6 i5 F/ X# a6 q, D! N2 B
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
2 F! {2 u8 z# u% U /* Convert 3-dB frequency */9 Y& G$ A$ Z4 G7 A
/* Convert 3-dB frequency */
0 t( ?- R' a& r& F u, S3 m filtfilt(save_buffer, usable_left_filtfilt);. i8 v6 r, `: D( {+ v: P. y1 _* s
for (ixstart = 0; ixstart < 81000; ixstart++) {8 U6 G& r# d5 w7 d# l) Z
usable_left_filtfilt[ixstart] *= 2.0;7 k+ i! ]) Y5 U; ?; y+ W
}) a2 h+ [/ O- @ z% D
$ ]* ?- B5 Y- M3 n$ v0 q /* 注意乘2,处理幅度 */' S. D* ]5 N! H# `% z
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */0 e5 s- z" R: r+ R% r
/* %% 行列转换 */3 E5 }. J/ {% O3 O( R# ]
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
0 }/ |. v4 ]8 k: @ for (ixstart = 0; ixstart < 81000; ixstart++) { J0 m1 n0 q$ I1 F% \+ C |$ Q
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
9 \8 ]) [ |8 \8 N+ n; F7 E4 D - yiDuanShuJu_mean;) L) }0 \/ o# i! p, k7 d
} V2 Z# T$ r. Z. W+ V
# R$ Y3 ^3 f2 y7 x) [: ]0 h* V /* %% 应该对数据归一化,但是这一步放在哪比较好 */. G* P9 r; Y; {. h, ? ~6 m$ F. a* H
ixstart = 1;
' z7 H+ W0 w7 [" S! S5 |* r9 Y, d mtmp = youXiaoShuJu_QuZhiLiu[0];
% R. o# M8 z0 Y* r9 O6 y5 e if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {- ?( M3 p1 [* ?1 |5 x
ix = 2;
( _- d f6 c- t7 i5 B$ S1 a$ K1 G exitg2 = false;
9 @6 ^7 I1 f" f$ a while ((!exitg2) && (ix < 81001)) {
6 C/ Y. u& B9 l' A ixstart = ix;
x5 C2 v5 h' m$ U/ i* o# T1 g7 H8 F if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
$ j+ M1 ]5 e- e7 F" V/ X7 d3 u mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
' V7 e4 u9 _4 w9 J4 Y* K exitg2 = true;0 N9 P/ z \: s! c) T G) b9 [
} else {# M' A: w( w6 X& k+ k1 h [( M
ix++;
/ d3 M' ]. b+ o8 E2 Y' t) C7 b }( u. p! o8 V- M {# ]; x! H( }% C
}1 U" \* M' I% |2 b i0 t3 I
}
; W% f& r4 X7 [! t
5 ~% ]( ]" s9 K6 t/ Y( ?2 Q! U if (ixstart < 81000) {& i& J9 a: f+ Z/ a
while (ixstart + 1 < 81001) {
6 y' A% K- J+ n5 c9 Z" C% T' @ if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {/ H1 j) @; G6 @) x. G
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];- f. f4 h! w( w3 Q
}. x0 _0 |; D9 Y; j' ]9 C5 S' X2 H
' o1 w2 E. d g& w5 T5 Z t
ixstart++;/ X7 ?1 }1 t2 N
}9 U E5 q! o" h( d9 g1 y# I6 V
}! l) @' a- d* o6 H' e# Z" {- q
3 F, g: h% }; Y$ r7 g9 @, K3 I ixstart = 1;
2 l) Q9 F2 _! H% [ yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
4 q1 R: j: a# E$ J4 P9 N& ^2 f if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
: M# z" f8 r! d/ c8 c( r: x S ix = 2;0 C3 [" o% _) o+ c R& n5 i, W& o
exitg1 = false;3 `3 J+ i* j3 G, U4 q( ]
while ((!exitg1) && (ix < 81001)) {% p& R- v6 }1 |! a) S6 T3 G
ixstart = ix;
& |0 w) G+ J6 U, o1 [ } if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
' f; R# b9 ]+ B8 k; j5 j4 D: I yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
* e1 C, C+ v, \0 S exitg1 = true;5 d, z" Y# q5 h5 d& d( {' W8 ~
} else {* V/ ^ h+ j9 w* Y$ M" M# J- d8 T
ix++;
! q6 H* w. O: v- P }
& N: q1 c6 R% |+ Z0 I }
" V* n; c; b- L s" S5 l }
5 N: ^; s" P* H+ s C. N# s& o* U x' |3 d
if (ixstart < 81000) {
: q4 y' ?$ C, ~- Y+ a- C% q while (ixstart + 1 < 81001) {
/ H* ?: m. D9 k# D7 u0 Z F if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
+ D' g3 @+ a0 w yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
( K# A7 T; d5 S% n+ Y3 N# Y( R' C }6 f4 V+ j2 d8 R4 J9 e7 R
( J' p1 U% P3 U* q
ixstart++;) B* a- b: b( L( B
}
3 `7 J( X) G# G/ ]4 J- l* U }" y; N8 r5 X% Q! D7 B
* e4 X6 S1 p& _* ?# m( y* m yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);; \0 p* G: f2 }$ x T
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {; G" X9 p& S3 k* Z
yiDuanShuJu_mean = mtmp; U* |! c5 M& l
}6 N7 U$ Z2 }0 B. L1 F3 E; x0 e' d. v
1 \+ Y( U+ f8 f- z! n( b7 a
/* 找出极值 */: n# b3 L9 w( Q- }5 M# o' F% g1 x
for (ixstart = 0; ixstart < 81000; ixstart++) {
9 g' S, U7 T0 ~! I9 Q" K9 d+ [% o9 J youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;8 w) s! s4 P2 U/ Y ?, B7 _
}
( |* T+ N! z _. }7 N( j5 E& A; L
/ A, k& Y' h. y/ I& V! b --------------帖子字数限制------------------$ e! G( {" m: {, G
}
# Q( y' ^- {( ?) @ D |3 g0 l" S, {. v: |. l& T/ B! y
5 F" I& g( J6 g: G" f4 R |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|