|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
9 [- Q, g" x: X
Z/ P0 D/ _3 ]' r1 e+ A L3 G各位大神:5 b' _: v" K4 W; c
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
g* U9 v; m) [$ e8 K 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:" |+ W& M: [; F: x6 Y5 i: E
+ |6 T$ g& Z2 f$ N! Q9 P
" ^, e* e8 I: y: \& X1 q& K4 r, ?. _这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
# ^7 Y1 h5 }9 R
* |& l4 `3 Q4 A7 {- V并没有其他线程8 u, E; [3 Z, M, A/ Y) K8 z
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
5 O& ~ T5 b( s% i( S# V也说不定是和堆栈有关系。。。。。。
" A: Y& E" s: C" |请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
2 N. {# \6 K: _- s* C' S9 b( y. _9 i. [$ _7 {
& O0 D- D1 s- f2 N8 @. A3 G+ P
! S( J: M% @/ L我也很绝望啊,希望大神能帮帮忙,感激不尽,!
* |* v$ ^1 c7 o8 H. r! F, i; [0 v3 C+ n9 N( t. b
* d: H: n: t# j1 `
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
- r: p0 F5 E, G( e0 f5 |: B% k static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。) `9 b, C- E0 i9 M2 F7 e3 d
7 \% T" O2 O8 _1 V2 ], C3 dboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(& S" z& U& y7 V+ P+ S/ z7 P! }
const double data1000[1000]) {
8 e! I* L/ K1 l( A' g3 Q( \ ^, ]. A) m& v) d- [/ d
int myfuck;& A5 q) }% f4 S7 c1 Y, g# }6 A
double yiDuanShuJu_mean; J7 R* b+ N6 k
double yiDuanShuJu_LowMean[1000];
( q, D$ i0 j# ?. A int ixstart;7 P$ c! e8 |5 ~$ l
double dv0[1000];& y- C$ c5 n2 D: {& U3 V, |3 i
comm_AGC pAGC;
2 r' o! d5 ~' U' l+ r% B comm_CarrierSynchronizer pFineFreqCompensator;+ R: D% ^/ q7 y. X
dspcodegen_FIRDecimator pRxFilter;/ P* b& W$ ~7 a0 x2 X r3 a" n2 N9 p
comm_SymbolSynchronizer pTimingRec;
0 e( E _! ]! o/ a7 L comm_PreambleDetector pPrbDet;7 d: C& [4 ]1 m; g; \# v+ N
FrameSynchronizer pFrameSync;& k' B! E. j( u4 f
QPSKDataDecoder pDataDecod;
" l p E! J/ T! M static double usable_left_filtfilt[81000];8 K h" m3 z4 G6 ]& Z. P
static double youXiaoShuJu_QuZhiLiu[81000];, {+ U* J5 T; S6 y/ }- w
double mtmp;
) K" V" G/ B) \' c% R int ix;% q9 B: }$ R- }
boolean_T exitg2;
. ]7 t* d3 Q* w9 N boolean_T exitg1;
. C, H1 S: V8 J( r, t( [ double YiZhenShuJu[800];
+ S' L+ ^% C' A) G) E9 | Q: D f E double dv1[800];) B+ e3 s- V# K3 h
, \% c( d9 K: _
4 r0 E+ U" a1 y& c! S z5 i double b_YiZhenShuJu[800];
. G! a$ l/ v, l" y( \1 V) d' Y double I_filtfilt[800];
' P3 D, U, ]3 V+ y; b9 d- f double Q_filtfilt[800];4 o9 O: q8 [4 ^* w3 F9 O4 f
creal_T b_I_filtfilt[800];
2 |0 `9 `2 g7 o5 A creal_T b[800];& w$ T" q! k: K+ \# V
creal_T RCRxSignal[50];
* V: [ D8 c8 F8 W! m, u creal_T fineCompSignal[50];) d! S: L. m o
double phError[50];
" j) @/ q- F/ v0 t; H9 G. V% \9 H creal_T timingRecSignal_data[28];& c+ ]% {; F% ~/ m2 N6 E0 Y- C
int timingRecSignal_size[1];
, ~7 L- x f) P' A2 g double prbIdx_data[28];# O/ m9 C2 g5 V! q: A
int prbIdx_size[1];
( G/ w4 I$ m" I! m' d double dtMt_data[28];' K: O# E; t8 y
int dtMt_size[1];( z0 _% @" `* q {
creal_T symFrame[25];. z( f, s: h# [9 F' `8 p
boolean_T isFrameValid;
( D* g* b. Z6 ?" {- Q) W double unusedU0[3];+ D; e, W: l9 {" w- f5 l: `
8 Y9 D6 D! B) Y0 F3 _
//调试过程中的变量8 \4 z0 W$ w l$ k9 v5 y7 J/ c2 X
int enough_data;
( _, z h' H! {: R1 \6 S. i, q- B0 L
int enoughDataFlag;- W6 Z1 L" K3 c# \
int yiDuanShuJu_mean_int;
1 |- z7 O6 V `5 m int int_sum_dv0;
3 Y) R. U4 l( t# u$ U; w int oo;& c0 @ X$ ?" S/ E
int ii;2 i4 N# q% W# }8 s
myfuck=10;* \& }0 W" K8 ~; O
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */0 B: g0 W' f4 v" a
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
: ^9 @ z8 {7 a2 x$ }" Y* b3 b, d$ x9 _
yiDuanShuJu_mean = mean(data1000);# d; ?$ ^+ S3 e2 n4 J
" g- |* o2 N( ?8 H3 e
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;( w e& E. v$ S0 j& G
UARTPutc('A');
$ Q6 t. H6 n. l4 [ UARTPutNum(yiDuanShuJu_mean_int);) X1 S4 M8 S& `7 Q, p0 }
UARTPutc('\r');; A: s- p( I: g+ q" p) d1 N- {. u2 _
UARTPutc('\n');/ @: G4 a& ? n6 S* Y: V; G0 U
4 g7 j# v$ C; U+ Z- { for (ixstart = 0; ixstart < 1000; ixstart++) {
: m! U( @+ v1 K. k& c# A# V yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
4 [* {, \( K) _. k v) Z) Y }" T3 Y W" |3 v" ]: u2 ?' a
" z1 B4 s& X- h: F! O" ~0 W, Y' T# W power(yiDuanShuJu_LowMean, dv0);
7 x$ W4 N1 x$ L
$ ?' D2 t6 P+ ~0 R b int_sum_dv0 = (int) sum(dv0);/ n+ ]7 l" u% b9 ~; ?
+ f/ i' F Z/ j UARTPutc('B'); b a: N) n& }5 W( c
UARTPutNum(int_sum_dv0);
+ X w8 J7 P2 R" i& k- S. P7 X, X6 M UARTPutc('\r');
' o+ r! _$ r7 y8 L9 F3 o4 { UARTPutc('\n');. g3 ^+ D& ~+ n6 L$ ]5 F; @) c' G
$ _0 ?: L% G2 o& G
// int compareFlag = int_sum_dv0 > 1.0E+8;
3 i- ?2 s) Q: o8 F: T! K, r% ?0 A$ i9 O
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?9 t j( F) z# W0 X5 A
UARTPutc('C');' O0 n4 a& q1 r
/* 比较信号能量 */
, ~+ R) z/ q( m) U /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */2 H: S7 C! ?2 Y0 V8 {
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
2 {3 ^) c+ E% x: x/ l$ M9 c// for (ixstart = 0; ixstart < 1000; ixstart++) {
* z* l! }; u0 d* x) Y+ @8 B// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =+ @3 p# ?& r- Q
// yiDuanShuJu_LowMean[ixstart];
- I* @( U) |. \: m* B, `9 X" ?// }
" e' g( [6 Z/ A O//
& a: C) |( {( Q* A// youxiao_k++;+ f* O- n1 Q/ H2 c
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==0 H' e- U# o2 k. C" T" N
// /* 感觉要取21个数,即0-20, */4 n( k& h7 L0 R# U
// enough_data = 10;//有效是10,无效是0" L, ~% w+ m- D5 c
// }
- y: k3 m* y2 n$ [ }6 ~( _* B& C o" ^: n
: u0 i+ w+ S a( M. P {2 k) n3 t- E& X i9 ^8 J. l( g
enoughDataFlag = 100;5 F) _3 x/ u% J7 D% u
enoughDataFlag = 1000;
/ w4 {: Q% g( k+ c- A enoughDataFlag = 0x02;8 _- p, [& L6 O+ l: m2 |5 a
enoughDataFlag = 200;
1 K$ V9 t' M; U `
+ ?$ R0 o2 H! \ int myfuvk1;# i' I% c0 E- R
myfuvk1 =11;9 e& P% m9 t9 O1 [
' w$ J8 A: b7 _; F
3 `4 u( S* D D9 r' i% T) a/ k! L enough_data = 0;
( t4 S, Y* e2 Z1 S+ K9 S+ ^2 e. o" w* K( J- E V# J1 t# x
// if(enough_data>50){
) o# E% i% D: p/ D7 T: Z5 m, Z# C7 A// enoughDataFlag=0x01;. g5 n' Q8 I/ F# S, d
// }else if(enough_data<50){
/ S- i2 V8 O: i; u' H// enoughDataFlag=0x00;//0x00还是不行8 A( G a( [5 L: Z3 e7 I
// }
* f8 D4 t' H3 a8 u1 k1 L) r. @3 R
2 b7 q& V" L( z& P; Z, I; F$ m& X! R' x7 j! J( Z3 H: A- c+ D3 @
oo=10;- h. e* t- L4 l8 y/ t
oo = oo < 5;
# l3 p5 K7 {) O% q6 @ if(oo){5 @( i) [- I! ^0 E2 N; c/ r C# r
ii=0;- G2 n. A* N ]9 s; i6 F$ P
}0 n2 b& ]( W1 ~& \/ b6 g+ A) S
if(oo < 5){1 v$ b' o5 j) ^
ii=0;% b- E# _( n' h6 m- b7 m' d! j
}
_+ |4 k' t' v# u: I; K9 h% N if(oo > 5){
) Y, c# P" H" D( G ii=0;
' b- P' N8 n, q; U( G$ Z4 C }
# z. R; w' ~5 _7 E W: y0 F$ J; ~/ g" ]% ^
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */& p0 Q6 d& D( u- Z/ X i
/* 如果数据足够才执行主程序 */
' ]( y0 r5 M' [9 T# @' h oo = oo < 5;
2 N& K/ ^, p: D9 n" |% b enoughDataFlag = enoughDataFlag < 5;
. I0 M' a" u/ f/ o+ p+ } b if (enoughDataFlag < 5) {4 J3 U) y1 d+ U
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0$ W. H! b' z+ s5 m! g' F9 V
AGC_AGC(&pAGC);' u4 t: d! }' k. c
. M) {& G* i; a' \* N8 i
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);0 {7 I7 b" Z, r: b
FIRDecimator_FIRDecimator(&pRxFilter);
0 n" V5 S. n2 ^6 q" g T; q) m# ` U+ H4 D) J1 @8 P" b5 r
/* Downsampling */
1 @3 P* t1 s9 u; b; I c_SymbolSynchronizer_SymbolSync(&pTimingRec);9 J( F3 g2 p3 }, U* E7 U3 Y
9 Q, h; l5 T0 y3 k4 I, [ c_PreambleDetector_PreambleDete(&pPrbDet);
7 z' k6 w, H: y5 l0 V7 f
0 w* O {/ o6 i- m( l' O: g' o$ [/ h /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
) n( i2 ~$ J. X7 a/ E' u /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */! q+ J! ^! G& J) L! R Q
/* %帧数量=100 */5 i- b; a# g. f: m+ l
pFrameSync.isInitialized = 0;
Q+ }7 H0 G: v# A! Q% f
' y, N) u! r1 i /* [EOF] */
$ v8 s7 f. ^% J0 v- R" ] /* 前导码长度是13 */
4 Y( F" D l& ? /* %qpsk */
2 ]- b2 U" m5 Y& X8 b pDataDecod.isInitialized = 0;
1 o$ l- H* M. _
$ f: Q9 P1 f; r/ B. l /* end */
- e& V6 { K, h: r; w- E: g /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */6 R, X; `+ c+ W3 v
/* Convert 3-dB frequency */
6 S/ D- X: o# Z. V: Y2 k /* Convert 3-dB frequency */
3 I3 j7 E: j0 `. }0 ?1 l6 c: ~ filtfilt(save_buffer, usable_left_filtfilt);& ]% i1 b6 C' `+ X) U0 `
for (ixstart = 0; ixstart < 81000; ixstart++) {. F+ U0 `; ` U* `- _
usable_left_filtfilt[ixstart] *= 2.0;( J7 G/ m& l5 Q/ u& x
}
3 U$ @6 X, S! M
- u( N3 W2 F) ^6 G$ v k9 u/ h /* 注意乘2,处理幅度 */
' | ^7 C: T5 r /* %% 我发现带通之后其实就均值为0了,不用这一步了 */# a' H: i6 b) ?- i! u# R
/* %% 行列转换 */ U7 c4 v" Q4 ~. f D6 d7 m7 i; X
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
, ^7 {! b/ q @1 g$ u- V for (ixstart = 0; ixstart < 81000; ixstart++) {
}( L- {; E& H" J youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
0 b/ ^/ {' i$ r - yiDuanShuJu_mean;
7 N$ v) n, K) Q6 j }
9 }( \7 \6 { Z+ k8 b7 \' {! r! T* o
/* %% 应该对数据归一化,但是这一步放在哪比较好 */( H% R- N* F& x
ixstart = 1;* B( t$ g3 n* X/ `/ B% n" h( T
mtmp = youXiaoShuJu_QuZhiLiu[0];3 P9 j" @- t; r9 C
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {, W" c. h+ D0 l2 b* u0 ]
ix = 2;: f8 ^' L- ]/ @
exitg2 = false;, G; u9 _$ ^1 Z8 e3 @' i9 t
while ((!exitg2) && (ix < 81001)) {
+ W: I0 F# y5 q2 _" n. M6 @5 `# e ixstart = ix;
, J+ m; W5 v8 ?- s' G$ O" p- d if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {3 ]# q# [5 V0 h {2 {
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];/ n( L- [$ f0 Y! B4 q5 ?1 B
exitg2 = true;% P4 t) b2 b: B
} else {
( j( B4 S1 U* G3 \$ U" M6 q' n3 H4 Z ix++;
. ^' W: U0 |0 \( M }7 a8 [+ @( S& l5 |, j9 q
}
) B' c) _- B2 O3 u& \0 A }4 ]7 N( Y+ e! C/ l# y, v9 R
" C- {3 p. s0 O* k: h# g if (ixstart < 81000) {1 E: K1 v( L1 G3 W0 f$ L
while (ixstart + 1 < 81001) {$ H6 y! x/ s6 H, w; J
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
0 O; h. W+ t% z! o mtmp = youXiaoShuJu_QuZhiLiu[ixstart];6 F) m& v/ V* ?5 a
}
0 E; a0 S+ J! `2 E* Q& y' M- L, w5 y6 ?
ixstart++;
% f8 b9 F! @# e9 L" w }2 I( l9 b9 i5 y2 q6 j
}6 d5 k/ }" X5 A$ v! d. t5 M
7 S3 W ]. u5 y. ?; [6 Q& b7 c/ x ixstart = 1;4 B0 F; l9 ~' b9 f- l/ ~ S. h
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];, S( R! o: n3 c# @9 e' P! W
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {9 l; T% w# b" a4 Z* u0 k
ix = 2;
5 f$ S( G8 ^/ x+ L( |+ U* y exitg1 = false;
/ r( Y. ? B+ A5 v while ((!exitg1) && (ix < 81001)) {# S7 I, i) G4 |8 \7 a
ixstart = ix;
/ l4 d$ s7 c6 P) C- I' i0 c- y if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {& k9 a# i+ y/ }: `/ \2 n. P
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];3 s: ^; ]8 x3 L+ K/ {, O9 C
exitg1 = true;( _! h! p9 g: m* Y: {" W8 e
} else {
/ n% h G, E5 [ x8 T5 u8 l ix++;
5 o* z0 L: c! |- Y' O2 W% U/ q }' b4 ^4 N* h8 X' }; E1 E8 ?
}
! V" T: E* Y" D3 C w. h }1 ^0 p4 Y0 f7 u" J
$ }6 u7 p' p! D6 m9 r" J! A
if (ixstart < 81000) {9 K2 E; \9 K P" g* a! Z+ n
while (ixstart + 1 < 81001) {6 w5 d8 t+ b# d4 Y& @$ Q o
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
7 e( a0 b* J o7 S$ Y- Q+ d yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];' x# p/ b$ m$ E: M- A* i( e4 L
}5 U( q" C( e ]7 u# s/ I
0 l9 O( J" Q0 S$ K! M4 s
ixstart++;
* ]. d9 e6 w z4 M }
; r8 c6 d/ Z. q+ p% t/ x }4 h) t5 Z3 h2 A4 i0 x# Y( ~' V
6 l6 Y+ y- [8 q7 a1 ] yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);* c1 f8 i0 E5 ?& b0 n4 N- f% Q5 c
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
+ q" N: E! O: f& s' E |" j( V, R yiDuanShuJu_mean = mtmp;
( p; B' d$ J! L, L$ i/ Y; x }
7 O3 b# a, a* ]" W: H- R. H. ^* ~- F6 u. r/ q2 [
/* 找出极值 */
2 B, @2 M4 {8 @6 U" E+ {6 a/ m for (ixstart = 0; ixstart < 81000; ixstart++) {
- w! y2 X& z1 C9 c youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;; v+ ?* H3 Q* l& @5 { Y0 J
}1 X' F* Z* O1 F! H" D* D% U
! q8 K0 t1 X" Y B9 \) B5 u4 x
--------------帖子字数限制------------------( ?# S q! A1 J3 i3 ?' W
}
- x: `1 N/ U7 |! T4 o& I, ~9 q! E7 ` T8 l
7 `0 S. O: K# K
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|