|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 % l# `0 S. a: Q
( J3 w ?' s+ ~各位大神:# k0 K1 [: x$ {; y
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
: M( Q( f) w* m: d 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
" O( x' X2 C: t0 {: a
$ e: _0 x# |/ @* j2 i* R$ V2 R
, k( P8 d% N0 W" Y6 @9 ^; Z这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。# M1 x- s' W% X7 d! z$ @8 |
1 `" I) ~2 P% g* x3 }% c
并没有其他线程
8 {9 x+ [& Q. z8 }* ~反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
; U. t3 ]) y0 y) W( D也说不定是和堆栈有关系。。。。。。6 V" U6 g- k( H1 y; a, q
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....1 c. q* {+ S, h9 Y/ ~7 R, [% L
1 L9 X _* ^2 n" c& S
. S* u- \6 j" ]
1 d+ I) L( Z, [1 j2 M8 ~
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
! O6 K, j0 U; s v# H+ \% a# R/ @" T7 T/ s2 D7 o; v( v G" w7 {
! e+ ]0 I3 {+ \
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];/ z- z( H2 Y5 O) c7 [9 r, q
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。) i5 g( r9 A6 E5 z( R
* o9 _9 [2 r5 W* P. d2 l. yboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(9 t. U' |" n) n! Z
const double data1000[1000]) {# Z. G: X5 h! C; G: O
/ E6 n |) \; c+ j+ E ? int myfuck;
+ p) i7 ~( Y; ~- p/ H4 I# G' |% m7 z double yiDuanShuJu_mean;
5 z" V) G7 u6 }0 {- p- N% o+ E double yiDuanShuJu_LowMean[1000];
. e3 G T) E; Z& H4 w! k int ixstart;
3 f5 C q) c; {' \ double dv0[1000];
3 u' d; g D# S4 e# N comm_AGC pAGC;! x6 I; ?- `9 e" x) e/ I
comm_CarrierSynchronizer pFineFreqCompensator;
. K" r8 M: l0 j7 `! B/ \8 Z dspcodegen_FIRDecimator pRxFilter;
' ^1 e# K' O2 [4 A* S2 u N# M2 v comm_SymbolSynchronizer pTimingRec;
! j0 @% _: |! u$ V0 A2 c( H comm_PreambleDetector pPrbDet;" y! c( s W7 | F3 v3 d$ `
FrameSynchronizer pFrameSync;: j8 M4 b" j) H, r8 G p. C
QPSKDataDecoder pDataDecod;
* j9 x. b% u3 [* d$ w- b/ ^ static double usable_left_filtfilt[81000];
1 x- T+ y6 I& x% Q2 a7 c; L static double youXiaoShuJu_QuZhiLiu[81000];, I7 H5 A$ U b( e% Q! c( U9 ~( w
double mtmp; J# q- U0 o6 D9 Y
int ix;
; E9 i6 A2 Y/ f* y" E boolean_T exitg2;- Q% H- g: p0 l* k$ y V
boolean_T exitg1;' L1 }8 ] u& R, n/ s
double YiZhenShuJu[800];
6 E8 p0 v/ r% ~$ ~7 D+ I double dv1[800];5 c3 Y! ?: F( f" f1 ]2 E
; ?0 j2 k6 F; L7 D r& {: g+ ]! K, W% Z$ O. R- y3 I+ I
double b_YiZhenShuJu[800];
1 d' ^% q* l3 J/ n u5 x: f. U double I_filtfilt[800];
# f( A$ l4 r7 Z double Q_filtfilt[800];# i$ n! r' z* [& D+ \: d; B
creal_T b_I_filtfilt[800];0 @+ a1 N: ^$ h/ d
creal_T b[800];9 _1 p6 E( P, s$ E# c" S
creal_T RCRxSignal[50];
: q/ g0 ]" }4 c( U* j creal_T fineCompSignal[50];
0 o+ ]2 N8 x8 B6 a7 g' } double phError[50];
# N6 |3 X9 ]1 T- T- j+ G creal_T timingRecSignal_data[28];
( ^$ z9 G/ }; h/ w* d int timingRecSignal_size[1];
- z7 @) [. ?7 q& n; }1 D J; T double prbIdx_data[28];5 F( n; Q& q9 V: X: S
int prbIdx_size[1];
+ R* s, T+ H# M double dtMt_data[28];
$ Y- E) `0 \. i0 X6 P) V% U int dtMt_size[1];
; A$ C- v: n& r; @, x. l creal_T symFrame[25];
) C: p! W. t: T: m/ h2 y2 e boolean_T isFrameValid;
9 G3 E' I5 h. n' Q k& M double unusedU0[3];5 u" a' ~& T* N3 _/ v' [
/ W/ N5 {0 x& O8 ^; i2 M4 e" P //调试过程中的变量
% Y+ ]1 x" U5 Z( G. I2 E8 M: v" I. B int enough_data;1 Z% ^8 U+ Z& x* r5 ?. P
; c, a. q" }. r5 N% h& [1 u
int enoughDataFlag;- {1 G' X2 k9 z: R3 W! x3 I' P( ^) z2 r
int yiDuanShuJu_mean_int;
; z9 L# Z- K9 Z$ n8 S$ s0 f int int_sum_dv0;
$ j7 z& M; s- d6 J8 U. B int oo;
3 l% Z, |/ f9 F$ p- _9 i; w int ii;
9 V- g ^9 r( r" q: o3 i6 d1 Q myfuck=10;
( v5 p8 U4 m5 c0 Y9 K! h5 V /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */6 X6 _$ U" S& C& J
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */# Z4 J* o" {7 q# `: O
9 M) ]. ^ R- N2 z9 a! f
yiDuanShuJu_mean = mean(data1000);) w/ a0 l& g( Y
, s! N- s) r8 O/ L+ O yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;9 A' |$ h2 F* K3 U" N
UARTPutc('A');9 X1 @4 v/ U, ]
UARTPutNum(yiDuanShuJu_mean_int);
9 Q8 [2 |5 v' r/ q" [- F UARTPutc('\r');
. v* }1 L9 R$ q t( r: b UARTPutc('\n');
" E( ~7 B9 ~/ c* e& t- R) E g1 G, I( K0 g9 w/ y
for (ixstart = 0; ixstart < 1000; ixstart++) {
& D3 X- f- R l yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
2 o9 K/ ?! _ A% L8 d6 L }/ \8 Q, ]' ~9 I i
}+ U4 {# e9 U, A! V8 `/ L( C
power(yiDuanShuJu_LowMean, dv0);& N$ G$ X2 e: b
6 T v1 B2 w! j8 w; K
int_sum_dv0 = (int) sum(dv0);- H5 w! {2 @; x8 ]
" j) A0 P1 S. i5 m$ W UARTPutc('B');7 N h( o. [" J* u7 w' R
UARTPutNum(int_sum_dv0);9 O1 f5 J+ x1 b) l! `/ c; |
UARTPutc('\r');$ M, k4 ?4 x% ~
UARTPutc('\n');2 V& T$ M) u: y9 \/ u( v9 I
' l" P2 z& u$ T2 X// int compareFlag = int_sum_dv0 > 1.0E+8;+ G _+ j8 b# a& o5 Q! e/ e3 _
1 k5 @" X$ c! J3 S; Z7 n if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?* [, r- e9 m5 n& R/ ~0 R
UARTPutc('C');
# a5 c# W6 I8 G /* 比较信号能量 */
0 h* A3 X- d$ a! } /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
5 C& c5 t; @* l% Z// yiDuanShuJu_mean = 1000.0 * youxiao_k;/ M, U& ^8 @4 ^1 p
// for (ixstart = 0; ixstart < 1000; ixstart++) {
" _) \: G4 x+ | }// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
+ C! O- x) Q; E// yiDuanShuJu_LowMean[ixstart];* U; m5 [: J) ]! Y
// }
6 O; X$ y5 T0 W, k5 n) Z7 A3 h. D//
/ z: `1 v( `2 E6 `7 E5 d. a// youxiao_k++;
" N% ?! Q9 X3 s; J) x/ q6 f* h// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==3 D5 w3 t2 d5 f& e: B
// /* 感觉要取21个数,即0-20, */0 D7 X, }; y# @+ Y. S2 q" \
// enough_data = 10;//有效是10,无效是00 A z# M5 ~+ Y) H
// }9 u3 k, P! a, L# W4 B" q
}
1 _/ Z; R" c& K8 K3 F7 _$ B- L# X5 X8 f. Y0 k% ]
9 t6 @8 d: v) I1 ]7 i4 @ B* Q
enoughDataFlag = 100;
8 `0 `" p! M9 d f1 i8 j0 [ enoughDataFlag = 1000;& Y1 H! _- g" A* m( o, Z
enoughDataFlag = 0x02;( g, [5 P6 t( s' M" a
enoughDataFlag = 200;7 {3 K2 ~: b; ?# q( Q7 T# Z% Q
' t0 g4 \2 P5 f- | int myfuvk1;
0 m9 h5 w5 O) M3 R9 T/ d$ i myfuvk1 =11;0 U, O4 G& H9 @) G* r" Z
Y5 R( S' [/ }7 w
2 O# |$ |& z' T2 V) }; J# s
enough_data = 0;! o8 |4 t0 U# ]# U9 Q/ \6 E
( Q6 j# x! }( [/ D# Q9 Y
// if(enough_data>50){
# M: A. G- W% m0 x* C% R// enoughDataFlag=0x01;
% X' z( q" R) d, T// }else if(enough_data<50){
/ \" y4 Y6 k6 ~; }; t// enoughDataFlag=0x00;//0x00还是不行& p* C7 h7 w* V: I0 _8 f% X: F v
// }$ O0 ^" Q5 Z3 P( M
- n# m: U& x& ?! m: Y# ~8 x* }4 X7 d8 j3 L$ _: u
oo=10; y. q9 Y4 g& D$ A7 F
oo = oo < 5;
6 x' \" G3 K0 A& p- U if(oo){
# o% h3 @( m! R9 T1 e ii=0;- y1 M: P: ]! A8 a& P" E4 v
} x- A$ X2 Q6 q6 @
if(oo < 5){
( Y8 f8 f3 S5 A7 M) n" b ii=0;) _. s' L a+ ^! C1 I
}
7 n* c7 _" ]$ \" j( t( ]+ d7 T2 Q if(oo > 5){5 _. P/ X! C c' v
ii=0;( z3 ~1 f5 `: p1 p# y6 F
}) G2 r% F9 ]6 `
" w/ A' j c4 |" @ |; O2 e
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */, {1 b: `, e& U
/* 如果数据足够才执行主程序 */! R1 P7 n$ j$ l- q9 ~
oo = oo < 5;: w4 \# S( Y" }3 ~: t
enoughDataFlag = enoughDataFlag < 5;0 E) t& k( K2 l: z; `( x
if (enoughDataFlag < 5) {
) ^6 B) `. h; Q3 o, H4 t0 y// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0 n6 C5 S2 W1 O+ A
AGC_AGC(&pAGC);& h- j& D) M& l4 M$ \1 Y
$ ]; R9 X* n: l3 W0 v# u' L' ~/ ?
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);% {! V i& Q$ ^4 C
FIRDecimator_FIRDecimator(&pRxFilter);" q* v# I; S" l& N$ m% m
8 D+ B0 d' ~$ p) g; ? /* Downsampling */* g- H4 _ X3 O5 Q' k
c_SymbolSynchronizer_SymbolSync(&pTimingRec);& g, S; W$ u& u: n- L Y
9 Q# ~+ n0 n# t6 T! u) ]7 G4 ?
c_PreambleDetector_PreambleDete(&pPrbDet);# B6 J$ g- |5 X Q6 v* @9 P9 I& T& F
, a; n6 }( g( ]9 ? H /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
$ `" O5 @& X- `# z+ W$ a9 e. _' I /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */4 x% |& A% g$ i5 q& C# W: k
/* %帧数量=100 */
" l/ q0 w# U1 ^2 _% I pFrameSync.isInitialized = 0;
* T8 Q W* R6 K) W, R: l" V. p: e& W& z" i8 D" \8 \' n
/* [EOF] */
* D& I" o9 B9 `7 a /* 前导码长度是13 */
8 [- J2 F2 F4 g /* %qpsk */7 w! ~* ~% K, `7 I" M3 m0 N. [
pDataDecod.isInitialized = 0; Z9 g( V% z7 }7 P& r
# P7 h, L& p6 l$ `% p6 K /* end */" ~: H# ^2 n; x& ]
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
3 _9 Q/ T: E" E8 V /* Convert 3-dB frequency */% m; L: B' a' R! {
/* Convert 3-dB frequency */
' C+ Z* v3 C \/ W' |7 i- B& W! E filtfilt(save_buffer, usable_left_filtfilt);
i2 Z" d; c. T, _& |" E* X for (ixstart = 0; ixstart < 81000; ixstart++) {
2 A X4 v6 s0 c. l, L7 d( a usable_left_filtfilt[ixstart] *= 2.0;5 g4 c4 D7 G# f$ j5 ^* y
}
2 {4 f7 X) R' y1 y3 ~" [4 u; p0 ^$ P6 A) \
/* 注意乘2,处理幅度 */ k6 M3 A+ e1 H' J. T" T
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
* A5 M# g1 u; h3 c' F: l /* %% 行列转换 */7 t! @3 Q. b& j5 u1 z9 G
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
( L# j( T W1 `, [0 [( o5 a for (ixstart = 0; ixstart < 81000; ixstart++) {
* J% o: ^' s1 c% A. l1 S6 U3 @( g" h youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
, S; T9 f, X0 c) E - yiDuanShuJu_mean;
8 }+ Y, o) ]- N$ u' J+ V/ [! X, { }7 l @, |0 [0 j9 j+ h6 I
1 C. k* ^# g7 x' a& E& H
/* %% 应该对数据归一化,但是这一步放在哪比较好 */1 `& X4 b2 ~1 f0 r) q& y& B
ixstart = 1;
S ?) @* y; H+ U; s) Y1 d* D mtmp = youXiaoShuJu_QuZhiLiu[0];
, K" H0 P2 m' Z+ p& b) V if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {9 E1 |" Z- ]8 r$ D& `
ix = 2;
1 x. ~( s4 O. Y exitg2 = false;4 s0 |0 k- [/ g1 I
while ((!exitg2) && (ix < 81001)) {
1 f0 M( K& |2 x, W0 q ixstart = ix;
5 o" f1 @; {" R8 H* T: y, [" x if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
# K8 _- U! b" R# A/ X mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
4 _3 @3 v" V: [; K4 F exitg2 = true;5 _) h" i( ^# i: j
} else {
/ z% o T4 s) F1 y' C& v( G ix++;
9 W }; c8 I( v$ i! x# o0 ^ }
( e o7 N! s8 r* t }+ P! H }
5 |. |, t* M& E$ X }
0 N3 f4 `- n: X. ?+ ?4 C7 T! \! L* D0 w! g5 ?- c' Y
if (ixstart < 81000) {
( I- E5 r6 g$ ]9 X" w while (ixstart + 1 < 81001) {* r" R4 d9 v1 @
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {4 t. W" a0 B' E0 e
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
" |8 ~, B+ I* i6 f }/ `6 \! I2 L) N& e" P
. a; E/ f9 t1 {5 y- L- C ixstart++;
! [; i7 S4 @. r0 a: T }" d7 ^/ Y3 A3 P! r3 [6 A
}
2 {+ P$ |5 Z0 X0 ?2 a. @) L: y& `8 f2 M
ixstart = 1;
2 Z; k( Y O: ], ?8 a yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
4 Q: I6 m6 D5 O* M if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {8 T* Y8 B$ w; g. H5 S# L) h
ix = 2;
8 R; Q; t) Y9 u/ g0 I. h y2 y exitg1 = false;- v0 p9 ]. R; B. b
while ((!exitg1) && (ix < 81001)) {
* ~% h9 A' A& M( I ixstart = ix;3 U9 S7 q% M+ u, _
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {+ }' J) Q1 P% w3 e0 h0 O
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1]; M* F% p9 Q8 q5 Q( @/ r9 ~
exitg1 = true;; ?' K2 v5 F, d% t7 c+ C* P5 A
} else {
1 m$ T6 w9 L" @. q ix++;! T7 N" Z/ ?( S0 e2 Y3 T3 |# v
}; e) K+ h" R% a0 b5 w+ E f: t
}
3 v& t/ p1 M/ V* N# m' }8 L }
! I7 f& w3 r) Y$ O4 b! y4 X0 X0 H. L( u1 A+ L
if (ixstart < 81000) {
1 W) Y& J1 d8 @4 p* w while (ixstart + 1 < 81001) {
! ]. z! @, A1 Y) P, y' A if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
/ v$ y6 t4 I1 K4 x: u9 z* T5 c yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];2 D) s" h3 J! L) U6 j0 P4 n
}1 K W( {( l; K7 c2 g ]+ G: u
* `0 i, c/ e* l$ n$ ^ ixstart++;
: S6 p+ L3 u; z6 U6 L" } }
: m1 {+ i& g B4 O% m }9 m1 O" p" `. i( c! x, }. D7 ^
2 E" b( ~4 t1 q8 v/ N
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
5 ?. V5 m7 P0 l% \" y0 o; ? if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {# Y( E! ~6 R5 w5 d
yiDuanShuJu_mean = mtmp;
+ {" W7 Y* u: C5 C* J, } }" J0 v+ W! Q+ f) {3 p
8 p5 U( }- t$ q% x9 y4 [ /* 找出极值 */
' y$ @) S9 V: ~9 `, Z: b& A for (ixstart = 0; ixstart < 81000; ixstart++) {; g' p% J' P% \7 Y( l
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
, {# g$ B4 Q- w; a }( s/ W" ~% A/ I |' I. l: E/ A+ N- k7 L+ [
. }# ?8 l8 Y& o" s; v2 `
--------------帖子字数限制------------------) |+ y4 `3 X5 f( L: O* i. p p3 m3 Z
}
$ c) d0 L3 @6 J' c, L+ B/ n
# k# A4 J: k7 i3 o6 B
- E: O+ I) N) l$ f) _3 }" Y: U: D5 F |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|