|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 , n0 |2 B$ p A7 T- A
* `+ c3 S# u) G6 Z; H6 n& B5 t各位大神:
! @* R5 P8 w* p5 \0 g. c 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)" T# J T' I$ x3 f/ q
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
2 T) C+ f ?! A9 I1 ?
3 \/ ^9 t! ?' z( u" ~ : ^6 y' x$ V) \+ C2 M& R7 b
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
* z$ j# w& H$ m0 `6 y; B& e4 `" G7 B, k- \+ [9 `( g1 \( @* v
并没有其他线程4 R8 w3 n. w6 i. m2 a& l
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
" Q! o4 t) P: |5 A) a# j/ M- p也说不定是和堆栈有关系。。。。。。) o( A( O$ j0 x: p0 Y
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
% A) A8 P; E( K2 F* @
9 L" Y, t( E; o" {3 O5 O
# ~' a- L) v& H0 }
2 I6 F I0 B: u* k我也很绝望啊,希望大神能帮帮忙,感激不尽,!- S2 G3 f+ W- l2 P) i% m' |
) g; b3 ~, a8 S
; q9 |" V; X% ^8 W: h4 @( L" `
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
8 ?5 g2 z6 }4 R static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。, |7 |; s8 x; ]; f3 k
: J( W$ @. `! A6 n [- x
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
8 \# Y8 P7 w6 b2 d const double data1000[1000]) {) p' O7 t: |2 N# y
# h x) q! k5 ~. z. h/ }
int myfuck;; f7 s# p; b" i; w, Q- v( }
double yiDuanShuJu_mean;$ |: C l: g2 [. I l
double yiDuanShuJu_LowMean[1000];7 o; r4 M1 U8 L# U" j7 C7 H
int ixstart;* m( K- \% v# ~$ H) f2 Y$ J
double dv0[1000];6 H7 e0 u# x0 o' z0 Q, Z
comm_AGC pAGC;" G/ _4 {9 {; q" i. n- f# c
comm_CarrierSynchronizer pFineFreqCompensator;6 O5 O/ I2 P' U7 R6 s
dspcodegen_FIRDecimator pRxFilter;
3 P/ D7 y( T$ ]+ m! Y8 Q" J, F comm_SymbolSynchronizer pTimingRec;
+ i+ o; n4 e' G$ M3 H comm_PreambleDetector pPrbDet;
# d# R; b3 c1 u) Z4 c2 @ FrameSynchronizer pFrameSync;
, |- g# t0 K4 b) j: W% d QPSKDataDecoder pDataDecod;
% G) `8 n. t# f% ~+ [; q static double usable_left_filtfilt[81000];
2 ?7 `% R+ E. O2 x; W static double youXiaoShuJu_QuZhiLiu[81000]; G* l1 n3 Q8 {; f6 b
double mtmp;/ g2 t: I4 L/ ?) V1 d% a
int ix;
7 {% Q& j; O& Z2 Q+ F1 x boolean_T exitg2;
1 x' [8 Y4 M0 ^' `% D boolean_T exitg1;
% H" e4 ^8 \# X T1 J' J1 _ double YiZhenShuJu[800];! H0 j \% i5 j% g
double dv1[800];& b/ k H6 z6 N$ J
1 h% d" M0 e% i
( _4 l5 h5 v2 {
double b_YiZhenShuJu[800];
v* ?0 K8 M7 d, W1 y. N9 f" c double I_filtfilt[800];4 s: ?% ]) g% N9 A2 s9 i' D* @- B
double Q_filtfilt[800];6 _- i5 g1 {7 P8 i
creal_T b_I_filtfilt[800];
' z! n" c, A/ X' ]" i3 B$ B creal_T b[800];5 F$ @) t4 f0 y g2 t$ G) ]
creal_T RCRxSignal[50];
: J9 G8 P+ ^: p2 N" O creal_T fineCompSignal[50];; K. l, z& [2 O; A
double phError[50]; u% ~- S4 z% G- z( K
creal_T timingRecSignal_data[28];: Z- \8 ?% o- r: G; ]; u
int timingRecSignal_size[1];
1 N2 \' [+ z9 [$ _2 l6 B' U double prbIdx_data[28];
: {# l7 x1 }0 ]* a int prbIdx_size[1];+ p( r4 F4 F/ C3 i3 I# k! C
double dtMt_data[28];
3 O( k- A0 n7 h int dtMt_size[1];
) X; C/ I5 b& U0 }" X creal_T symFrame[25];
$ ~- f/ w5 N; D% Y# @' L; | boolean_T isFrameValid;9 w K$ k! `, C, ` B a
double unusedU0[3];& V7 g! g% b. L. a
3 P6 r1 z5 ^5 I- L6 \+ k/ E
//调试过程中的变量
, _* T+ G$ |% e! G3 y T int enough_data;$ p& r+ w( P$ q9 k
8 ?& Y/ t8 p' b/ ]) l: I
int enoughDataFlag;+ T6 L% k* e* n+ q. T6 U, {
int yiDuanShuJu_mean_int;! J) r6 U" p$ r. j1 U( ^
int int_sum_dv0;0 U0 l! j9 e/ J6 N8 Z
int oo;" C6 e% |' | F
int ii;
& g7 P/ h4 M$ E7 E. w myfuck=10;7 d9 B& Z8 c+ U& J) u+ c# H( _
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
% N( v7 R8 l4 o; }) s /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */$ j5 O# @+ N3 D! N4 t
: _& D; @' {) Q* f2 e# }/ s
yiDuanShuJu_mean = mean(data1000);! z5 H% I: l' ]
1 H H: N1 T, ]* x1 N" Q5 U yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
+ K3 s, o/ U6 O5 U UARTPutc('A');
$ w/ g: o, g# w) q UARTPutNum(yiDuanShuJu_mean_int);% h/ ?2 ?8 b& z
UARTPutc('\r');
6 z6 C7 R4 h( ^, D UARTPutc('\n');7 n. [. u5 p9 x, a
8 A; x# h5 c7 W for (ixstart = 0; ixstart < 1000; ixstart++) {# f! x3 g) v- r% U/ K B
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;/ d* z5 J- P# y1 M* U/ J8 s* S
}
8 e5 O( V0 W$ F: T- d: r; V# t
2 E7 T* \0 y; b0 K% g- L power(yiDuanShuJu_LowMean, dv0);
) p; b/ Q' O+ I7 i* m
7 p( ?7 s" y z9 O I4 f int_sum_dv0 = (int) sum(dv0);
+ p* C7 g6 C$ ~3 [ A! \
7 G; E1 P) [) V) }0 c) V UARTPutc('B');$ }, E; i4 ]# h# S! ~
UARTPutNum(int_sum_dv0);! U8 c; |3 h; M" }- ]& f# f
UARTPutc('\r');
( j# h- V$ ]1 p UARTPutc('\n');9 C2 o g c% Z7 w
' ], d. Q0 w$ O// int compareFlag = int_sum_dv0 > 1.0E+8;- A( |* U. d y! ^' G. {% H
" z3 K4 Z. H: X if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?) c1 s$ a6 g V6 Q# ]6 k
UARTPutc('C');
( ~. X* C9 ], \7 m8 y! ` /* 比较信号能量 */
: g# o1 O9 b- c) l# C9 ?- N* h /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
) S8 {" [2 F& C$ G; O* K( h// yiDuanShuJu_mean = 1000.0 * youxiao_k;1 r# S/ s, ^) y4 p5 S7 t4 H) y
// for (ixstart = 0; ixstart < 1000; ixstart++) {$ c3 d5 `( T2 C
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =- K3 E8 k# [6 h7 ~- Q
// yiDuanShuJu_LowMean[ixstart];
! O* P' c" z' p+ z% \; l/ v// }
' I" l: X( G) a& o( o% X//; }; `$ y" s0 m5 R+ ^4 L% n( K+ j
// youxiao_k++;
# J1 b8 V: L. c8 O( T( ]// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
8 p1 C1 a. y/ N, y9 Q1 `4 U3 L// /* 感觉要取21个数,即0-20, */
; D: T3 L4 w* w2 A7 a' X+ C// enough_data = 10;//有效是10,无效是03 h$ g: @/ _) s9 \& F# `
// }
8 F+ c; h1 S+ s( l1 ] }
( B! e- i1 }7 d
( d: x5 O d8 l. F$ G; @$ ~# L( s: c$ Z# J* y) u
enoughDataFlag = 100;$ c4 [) {2 y1 \- V
enoughDataFlag = 1000;! Z7 f- [% j2 e# a2 v: x
enoughDataFlag = 0x02;
`9 \8 V9 i3 L7 f) o. w4 ^& J# O enoughDataFlag = 200;$ a/ R* C1 y, { j- f2 x+ O1 P
7 e I0 ]' u z! R) m6 @ int myfuvk1;3 `4 b1 R4 O# t/ z# z7 g7 E+ N
myfuvk1 =11;
* d! s8 p' _, J/ |( V3 b( }6 T% h' {# s( o1 p8 c* I6 n
0 L% a8 |' ^9 l, l* V: C enough_data = 0;
! p' Q% A, _' p6 c- l! M2 Z/ |( ?9 |7 F+ |) V
// if(enough_data>50){" }4 a1 ^- F1 r6 y
// enoughDataFlag=0x01;
1 r8 b9 E8 D3 {' ~: j$ ^% k// }else if(enough_data<50){
/ t, U. t, X( P4 L) E$ i2 ~9 ?// enoughDataFlag=0x00;//0x00还是不行
* E+ ]6 ^, c k: ~// }
$ c$ s5 o, J! p f
- g0 P# ?+ N( L/ `: a2 ^5 i& ^$ n- |. |1 I
oo=10;
/ n! @: E$ K4 r% ?4 G- _ oo = oo < 5;* ^# D- m; G1 L# ^% Q
if(oo){: |9 U9 I! I) f* x9 I) j5 R
ii=0;- x4 e/ n0 m& B: h2 H$ E
}# R: m* X5 A2 ^$ p: J, G
if(oo < 5){
- E6 q& q, A% S: b- J* `, ? ii=0;8 b9 g/ a" C$ G! W# y
}
* g+ z+ l7 \: m" ^- v: { if(oo > 5){, T, O% l: v6 _/ o- ~7 f
ii=0;
: y+ P. b, [( l }
! d- h+ p8 x9 |; B @' x' s! |+ K5 i; i! _, \3 a
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */, k, `' E" Z! N1 O: k
/* 如果数据足够才执行主程序 */6 Z* o& J: r9 T3 W8 @$ ?
oo = oo < 5;: U8 W0 O M* A- k7 @
enoughDataFlag = enoughDataFlag < 5;: X9 n# @. b9 ~& @+ [* g
if (enoughDataFlag < 5) {3 \/ E5 e/ x; T( l! V2 J
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0) ~# j$ e2 L8 q/ G8 W
AGC_AGC(&pAGC);( G4 i0 H% V8 q# {
% G# R9 E5 `3 r- ^/ z, q( r c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);+ o; e ~+ ^: N% y N4 f1 }4 i
FIRDecimator_FIRDecimator(&pRxFilter);2 D- k- y6 E' d) F& y& q
& ^" Y1 @* v6 Q' t9 o8 [
/* Downsampling */. l0 o; I( z; g% r6 K: b$ a
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
5 L- N) L9 d( \" `2 i5 x( ^3 H- F& V! p+ W
c_PreambleDetector_PreambleDete(&pPrbDet);
- k7 `6 S$ X7 j) a5 H6 |8 V
: @) Z" R% K/ J& O+ X1 w- B /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
6 [6 y: c9 C: K, Q4 w /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */0 k* a. m, `; q! Z% M# ?/ e
/* %帧数量=100 */
: T! p/ }7 n" X$ f; x* ^6 b pFrameSync.isInitialized = 0;
" V7 Q$ h2 \7 E" i, A$ [1 v& }3 k# v e2 v
/* [EOF] */& |) N( {, D, K6 F% L) T
/* 前导码长度是13 */
4 T1 t3 d! W2 t, S' P& m- ? /* %qpsk */ ]) R1 C1 u; T1 e1 Q
pDataDecod.isInitialized = 0;2 P) ]+ |% y4 Y* h
$ ^4 }' `: b! v% d1 z$ ?
/* end */
h4 H6 k! i! b; B /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */# V9 C9 N4 D9 e* T) @0 i
/* Convert 3-dB frequency */8 p" f3 D' W7 A0 B5 |; }
/* Convert 3-dB frequency */
/ [' _+ X! _+ n8 C' i4 w filtfilt(save_buffer, usable_left_filtfilt);
5 \; d9 `8 x0 y2 [, J7 d, f for (ixstart = 0; ixstart < 81000; ixstart++) {
* q: _# z2 w# n+ R( m' H" V0 i usable_left_filtfilt[ixstart] *= 2.0;. q9 l ^0 Y- Q0 [: n( ~% a+ W
}& N9 j/ a: ?& B. t, E6 l8 b) n
4 I0 a# J. F3 `8 W9 C/ Z4 F6 g
/* 注意乘2,处理幅度 */
; F+ w& I U; o2 w /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
4 o2 F$ W r6 k, P1 l' p /* %% 行列转换 */% ~( g/ M" F' m; F1 M0 W; {
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
1 T0 g* q1 U5 |2 v% v( X+ j for (ixstart = 0; ixstart < 81000; ixstart++) {2 N& q- b7 j8 c2 u& O7 a3 J
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]- i6 m1 l& n/ s8 h" H
- yiDuanShuJu_mean;
- n( K f. X$ M5 y" ] }. F5 Q1 @1 p" q
$ `- c: C% l1 B5 Y6 }. |" k /* %% 应该对数据归一化,但是这一步放在哪比较好 */( _* E* i0 \' o9 R
ixstart = 1;
! K' L0 }. Z9 G, U" n$ P/ D. E) C mtmp = youXiaoShuJu_QuZhiLiu[0];1 l! T# w! A: L
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {7 d4 R0 M9 b- T7 g( R% [
ix = 2;
6 V. L7 u# K2 x2 D. } exitg2 = false;# \7 S( @ W$ s" c
while ((!exitg2) && (ix < 81001)) {( l( G3 r5 V1 \7 b9 {1 h
ixstart = ix;1 N; y% J& q% S
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
6 ], K9 [+ ^0 S; t, ] mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
( p4 L2 B# i9 O' p exitg2 = true;
7 G3 P( J+ I9 Q+ y } else {! o/ l8 Y3 @& w0 f+ s$ F3 k/ r
ix++;
1 H8 H# L5 E& C" ] }0 V# w% t2 B4 n% S# \/ F0 x8 D
}
) w" `! W+ ~% l! L$ {. V }" v' z( e9 j: i0 _* r* @
* T! [' d" m+ y9 g7 w& H0 P if (ixstart < 81000) {
+ y3 O/ A( G+ S. R, ]6 u3 `! A/ \ while (ixstart + 1 < 81001) {
: r3 u" J' c; B6 }. ~ if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {, S, c8 J4 O1 S& Q
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];' |" ~/ } ^, K! \2 ~
}
: W. {& M4 X( a2 L! |# P! V# M1 m3 X
ixstart++;$ G# W) D2 K" M- k
}: v0 s/ d5 A; m; e7 w/ _6 _1 B
}
5 y& T" w0 M B! s6 _
c9 o J, t) E/ L ixstart = 1;% s; e* z- w7 K$ q' G! R- t
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];( [9 M- ]) [2 g# _: j9 e/ v
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {5 J" D* t5 J, K# s
ix = 2;
! j& c ]9 x! {' x+ A exitg1 = false;
, t, Q! L6 `5 S; B' a# u while ((!exitg1) && (ix < 81001)) {
$ |5 M# e- z1 S7 j$ R+ J8 ~4 O* S2 N ixstart = ix;
. N5 }2 u- R- F) Z2 b7 R if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
0 c3 T% z, [) E& T5 N6 j u) P. Y1 } yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];' y4 r, n& `" D; T3 F9 N/ v! }
exitg1 = true;3 E& j" [5 I4 m7 [' q
} else {
+ h# [ w8 Q6 |4 E, [ ix++;
. q. }! t! M$ Z9 e+ V! V }
5 u# ?) T% K; F H" O4 E) u }
$ g5 N6 Q: j& z. S/ d }3 u9 [# ^8 h' M
! i1 y' A) P/ r' w( T( B- J if (ixstart < 81000) {$ a% A1 [$ D I3 Z" s
while (ixstart + 1 < 81001) {
# }3 w. }2 G) {2 i if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
X! k" L% @: F! |4 H" H yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];! G3 O) u& Z( M
}
" N! p. y. L% A+ z' u* Q9 t: |) g8 g5 m/ H; X
ixstart++;- I& W7 Q! [: A0 m# w9 P
}$ g' Y9 L$ [+ q. f1 e* a) V0 ?
}
* G2 t5 y4 _- m- D: n0 v8 ~. d0 x& x0 v/ S. h- _0 Z* ^4 h
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);* b8 D9 h% X# y, F4 a* }/ l
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {, A; H2 n% D- j7 @/ |/ n* n+ C
yiDuanShuJu_mean = mtmp;
# {3 G5 v X) ?1 ^- M( M0 \2 s0 ~5 K }
* r, Z0 D' R; E: K* k
* U' N7 v( @: q$ {; Q /* 找出极值 */
+ J! `' W- J! j0 I' I for (ixstart = 0; ixstart < 81000; ixstart++) {
& R2 F) w: ?' I1 N youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;8 Y4 |+ t( R' {- N5 O; M2 E
}
* e! C$ c) g K) j: A P$ l% k$ k" ]$ E5 V
--------------帖子字数限制------------------
. U7 i: y3 A5 `0 B7 g}7 ^: K% m7 L/ \5 F( ~
" J2 n* H- Y+ i& b! n0 x7 f. S/ v$ ]
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|