|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 ) u. B; {( Z+ ]) W
# `5 w) K3 E" D8 G3 \
各位大神:% a" _! W8 C: k M9 g. }
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)1 g& ~# y- Y0 b S" D* e6 Y
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
) @* a: H0 v% V7 b$ T. e! E+ t' ?+ W/ F0 Z, V
% A' O# T i( Q2 s
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
4 G6 R8 ]; y, B( g# C& ^ h, R$ @* _. s, n) b
并没有其他线程
. N' g( E/ P5 ~3 v% g反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
2 O B# }: G* `, c- }+ Z也说不定是和堆栈有关系。。。。。。
9 ~0 W2 \- T" f% D6 }请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
9 ^7 ^9 F. ^) Y$ ~% P5 O( w+ I3 \. n$ r' o7 t3 R" }
' i/ o& s6 W3 |9 [$ r$ w W
1 e O1 }: X# E% v' e2 e% D8 w1 {我也很绝望啊,希望大神能帮帮忙,感激不尽,!6 E) {5 ]* h# k3 e
5 O( S3 L7 M- v: E' n
2 ?/ x" H$ c [* ^* ~7 J; q9 `
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
; s8 o. S) R0 N8 N4 E3 m! S static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
2 f8 D, t& A. y: W
7 h" z* M# k2 T2 Cboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
8 f7 V9 }! }5 B% a) P/ q+ j const double data1000[1000]) {0 o* \7 I0 s `4 \
, O5 U* W; P# |% z/ G' J int myfuck;
2 f3 H1 ]( T3 u8 V% ]0 x+ N4 B double yiDuanShuJu_mean;9 `8 U/ r2 H; I9 L4 \: f/ N* s
double yiDuanShuJu_LowMean[1000];
/ W- T' Y1 y0 p7 I% h, ^" T$ O int ixstart;# b# e2 `4 [0 \$ j2 l
double dv0[1000];' }# n) g% ]) T2 y4 h" H8 r* M
comm_AGC pAGC;6 P* I; [8 [5 y# ?" w7 N
comm_CarrierSynchronizer pFineFreqCompensator;' Y) ~) P% r: y
dspcodegen_FIRDecimator pRxFilter;
; X2 R1 F- u' i2 ?- L% F comm_SymbolSynchronizer pTimingRec;+ P- J( Z z$ F# q1 Y
comm_PreambleDetector pPrbDet;
. S; F1 s9 L. M# w, m: Q- T FrameSynchronizer pFrameSync;
" h0 ^$ D" \+ Y2 @ QPSKDataDecoder pDataDecod;: \ t+ V! G& x
static double usable_left_filtfilt[81000];
+ w+ w' z1 f) h' \ static double youXiaoShuJu_QuZhiLiu[81000];2 H: [4 y% ~' u/ \# z9 Y
double mtmp;2 s# \2 B- o; ?9 Z% u
int ix;
; o% x- G1 `4 L+ N/ F" G boolean_T exitg2;8 Y4 _- l' c5 Y- e' c) M# \
boolean_T exitg1;$ G. b3 r1 e* I* [5 k
double YiZhenShuJu[800];
4 w0 o/ K9 d X, k. }" r double dv1[800];$ U! ]" ~! g) X& `/ s l) Z3 w- a
3 `& B* n+ }: ^9 N. B, Z3 J
& l G: g V5 p4 [' f: {0 _. f- j double b_YiZhenShuJu[800];; {5 W- s% ~& l( i" W
double I_filtfilt[800];- D1 y3 C0 ^; y& S; `3 o
double Q_filtfilt[800];
6 W! j0 ~+ s* {( l) a s! W creal_T b_I_filtfilt[800];- i* F! l) m' s: @3 D) j% p) A" u [
creal_T b[800];
! n7 L0 [; g7 p5 \& Y creal_T RCRxSignal[50];
3 `/ u' U2 [- I5 x creal_T fineCompSignal[50];$ M V6 ^. s4 U i, _7 N, R
double phError[50];7 _! N h y; @3 J$ D& \3 e
creal_T timingRecSignal_data[28];
& N7 [- E* F8 D2 J int timingRecSignal_size[1];
, U" o$ Q+ e: m1 h double prbIdx_data[28];
" O/ }9 U3 i8 T9 \6 p+ Q3 N int prbIdx_size[1];
M- Q9 J! f8 f" C" ~; | double dtMt_data[28];
1 l* ^6 d6 f- n1 k int dtMt_size[1];
' s Z3 U3 N3 V& X creal_T symFrame[25];
$ A3 H6 x; N2 l' e7 s boolean_T isFrameValid;3 d; P; v `3 q& }
double unusedU0[3];* o3 o1 z" ~( ?" x3 h4 Z8 y% A
! ^6 W! _: {' w: H2 [ //调试过程中的变量
$ c( }; c8 s: I. Z int enough_data;
3 X3 p9 e- X4 P" ^$ r2 {# _9 S
/ b- _8 ~2 w4 Q [/ s% H int enoughDataFlag;% K& ~6 X; V: h3 }
int yiDuanShuJu_mean_int;$ [+ U! w# f' ], O( m$ R
int int_sum_dv0;$ T- s% ]5 j0 a: k) Q" g' f
int oo;
( J0 ~8 S$ t; T+ O t, l int ii;7 u) l6 ?* Q$ }7 ~+ S; O
myfuck=10;3 Y' O8 E; Y1 V' @# J+ ~
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */7 ~ S3 g6 S. K
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
U2 ~7 P* }6 @7 c
8 ^- y" l6 i$ f yiDuanShuJu_mean = mean(data1000);
( D6 b0 K9 E! h' Q: h
( E0 R. c' G { yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
' e+ {& `* [' a UARTPutc('A');4 O9 k, |) A; C( [) w$ G
UARTPutNum(yiDuanShuJu_mean_int);3 s7 H6 j/ v0 n; G
UARTPutc('\r');
/ \ B9 _5 [2 f. `+ S8 G8 Z4 V! K UARTPutc('\n');
$ j% J$ {3 a8 U8 Y; ~3 [6 H8 ?- K* e0 H$ r. h
for (ixstart = 0; ixstart < 1000; ixstart++) {
! H4 e& Y7 I& g yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;2 l: ^& P ^$ a' A- k4 K0 w: ^
}) R" y# J9 o* M3 j7 S$ r; w
: p z/ m8 y( {( l# n7 N V# o
power(yiDuanShuJu_LowMean, dv0);
, ^& V# P) a# c2 F) z4 V
* f4 Z" m" t! o" A8 b6 }+ l int_sum_dv0 = (int) sum(dv0);6 Q8 l+ W2 s( }6 m
) [7 e* i2 b' } ~! o6 v
UARTPutc('B');& Y/ B3 l- A$ B, _4 ]
UARTPutNum(int_sum_dv0);
! Q, c9 j, C) p) b7 m UARTPutc('\r');
1 y) p { \" I# P* Z UARTPutc('\n');2 Y2 n/ f+ q: d- m
* R2 d2 W1 U6 R+ w" g- |' ]// int compareFlag = int_sum_dv0 > 1.0E+8;! H% ]& C9 A& ^9 `+ Y- u1 w' W
/ X0 j% w. A/ R: f+ s: H
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
% |9 [" E3 N, v9 ` UARTPutc('C');$ D5 u' x; [( E* s3 V' V# X" i
/* 比较信号能量 */) ^& o* B" y0 j( y8 { [) [
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */0 Q- _) }) S0 X2 v" W5 x
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
2 _% ]( v/ p6 U" B3 m2 B. L* q& Z% m// for (ixstart = 0; ixstart < 1000; ixstart++) {
/ }( M( M- `0 P: Y- }* N) n& d8 d- x// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
: }( N V1 h7 k2 i" V. r// yiDuanShuJu_LowMean[ixstart];) T$ m" Q0 h v- W
// }
" }# v- P& g: v$ f8 y4 k//8 H: w) }2 d" L- k# \9 I
// youxiao_k++;
. H X9 X3 D! Y5 a: e% Y// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==; @4 V4 ~/ o0 _7 S
// /* 感觉要取21个数,即0-20, */. I9 Q8 c7 \! s1 X' C" ~1 ^$ t
// enough_data = 10;//有效是10,无效是0
9 V9 G' \& G; n3 _$ I2 F# D// }
# ?! _& s2 p' X* ` }
- v6 f( e# E4 u& r" B, y3 R! U
; r. ~; m. b+ ^# F3 G: I; a( O: X8 L8 A: J
enoughDataFlag = 100;( @$ t9 \. X0 g
enoughDataFlag = 1000;
) h+ B- Y! v/ c* f6 i0 t) N* o enoughDataFlag = 0x02;
' l- j( @, ] ]0 [( i4 U+ B enoughDataFlag = 200;
7 ^( p( D: k9 G5 _. x9 l5 l0 S) t4 F2 i6 m3 t
int myfuvk1;7 _9 }+ A. K7 ]1 x' l6 y
myfuvk1 =11;! C: Y. L; b# d4 |% Q- n1 l6 `
: p* s9 y! C6 [) _" n# K! y3 j7 \
% f! a3 U. g8 R$ H+ _4 v enough_data = 0;2 b8 V- x8 Z7 T3 o' O' I3 Z
, g* @" `3 l7 O5 m0 v
// if(enough_data>50){+ ?( g1 K" j6 }3 d8 c" p2 q
// enoughDataFlag=0x01;
{$ ?8 y' r( A! X$ W; n! S# h5 \// }else if(enough_data<50){
l$ x- Z4 d; ^$ {// enoughDataFlag=0x00;//0x00还是不行
' V% X( T& s# c q8 j// }
4 }9 s0 m5 Y0 K8 q: R) T' v3 Z+ A$ K# ~
( |. I# v: x; d+ @& P. S
oo=10;
6 X/ l. w* Q$ N- H% c$ f oo = oo < 5;. u5 P$ r/ i q H; x# f1 b
if(oo){ n6 f( o, j" L8 Q' V/ N3 a$ f W
ii=0;
/ x; L/ G- k+ L }
! _8 o) G1 e3 ] if(oo < 5){( t' R: l( ^6 f9 T" t0 i0 F
ii=0;
- s+ Q0 e- n; o! w( o }* b; d& T4 }. n* @! c1 @; t9 C
if(oo > 5){
: E, Y5 I6 ~5 N5 D) V' t ii=0;$ n* W: v r. ^& p6 M1 a, d$ ]
}
7 ~, p' F2 s- a, p# q6 L" ]2 ~1 J. f& ^8 ~
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
" L& k1 ~( u6 b) v% A% U /* 如果数据足够才执行主程序 */
* Q) B; X1 ^$ |, [0 l" X: i1 [ oo = oo < 5;% r5 {" q% J6 g/ W0 P
enoughDataFlag = enoughDataFlag < 5;5 t$ `! z9 m7 g0 c
if (enoughDataFlag < 5) {5 F2 H3 S* _1 ~' |5 y6 H8 E0 R' f
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
* R& j' h1 D6 | AGC_AGC(&pAGC);4 m8 C( y L$ t0 t* v
% i* v5 u( V) g, L1 D
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);1 O( ?. H+ R. @: h& ?
FIRDecimator_FIRDecimator(&pRxFilter);- l1 ]$ F' }3 M" z" v
; J4 D$ V9 _/ }) ]2 Q% a /* Downsampling */
. G: e4 Y- Y7 M, d5 J c_SymbolSynchronizer_SymbolSync(&pTimingRec);! K" Q! D" t- G0 A, i+ E
/ N& B1 ^( a# }+ J
c_PreambleDetector_PreambleDete(&pPrbDet);: u: ?* Z7 I3 F7 x# J" J- P
' W$ s9 ]& }$ |) V! f9 b
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */, X$ d+ M9 _) E# H" @: Q* [- ^) w: C2 ?% L
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */7 i+ a0 \8 I+ X- _. B ?
/* %帧数量=100 */
9 O4 k/ `$ i5 n- B. c pFrameSync.isInitialized = 0;
9 u" ?1 Q7 O v) p! I" h: J1 G" ]9 {6 @5 C0 [ H" f! v
/* [EOF] */
% m+ Y6 g% U# d( _7 Q+ q /* 前导码长度是13 *// |: _) d0 n, ~ ~/ O
/* %qpsk */ A4 ~, [3 i; J. h' p& E8 A: Z8 @- z+ p
pDataDecod.isInitialized = 0;
8 C# L4 o0 f% A$ A2 i! o* w9 q6 t' V1 i6 K& T
/* end */
$ S( e0 Y( p$ g: o4 d7 R1 l3 D /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
& Q* `3 P% b* @ U, G* z- [ /* Convert 3-dB frequency */
& C# p2 C. v+ l Z* t /* Convert 3-dB frequency */
7 O0 e& D2 R; g+ M7 ?5 C4 r& ] filtfilt(save_buffer, usable_left_filtfilt);
2 C, T0 V* G, m' W! P8 g$ k, _ for (ixstart = 0; ixstart < 81000; ixstart++) {
. l9 N" N4 A. i" Q1 N0 Y$ Z usable_left_filtfilt[ixstart] *= 2.0;+ k0 E# C) B* G& n6 N7 l% ?
}
" K: Q' J. v# b- \& d& `; W0 g! L
. b' z& p9 F0 h# c) o' s /* 注意乘2,处理幅度 */' n- Q7 O" r- x6 h% Q7 q4 u7 w
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */+ \+ ^! f; |1 D* p1 H" f6 _ N
/* %% 行列转换 */& h! g9 Z. s9 \' C) A
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
1 d0 u% f8 v8 f! N$ l for (ixstart = 0; ixstart < 81000; ixstart++) {9 b8 e; J, U5 [8 U6 C6 \6 f
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]4 [$ ?1 ~' N. I& V/ t- ]/ z
- yiDuanShuJu_mean;! B* Q/ _: M' a5 D$ s) S+ K
}2 I( K$ r3 y1 [( R- x' c' \
$ T" L% x5 N) E; z
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
. ~! e$ J9 Q0 K4 V) F ixstart = 1;
& K: X: M- Q( y mtmp = youXiaoShuJu_QuZhiLiu[0];
8 `4 ~+ T% I0 L9 O" n: N! V3 ?5 [ if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
4 R1 t$ m$ C6 T" A+ o0 U ix = 2;
9 ?% w' ?( M! v+ m% D exitg2 = false;
% x, `% G' ?" W+ _: B while ((!exitg2) && (ix < 81001)) {0 G1 g0 G/ e. z0 f" ~2 J. |. m
ixstart = ix;" y# ]0 e9 l& Q
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
4 U0 D3 X ~' e" G' R mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
5 `- X- c3 f& e$ _2 r4 c1 E exitg2 = true;. D4 P( d$ @; |. ?& S# |/ O
} else {( A" p8 R2 Y6 b- G( k: A* A+ I
ix++;
: p& s/ L; Q, K" a' M/ x }
; j% h" I! N0 M5 r3 V }
3 g+ N0 T( Y- d3 Q! V }
/ K& r' z; @. V1 H5 k% F; `( H1 I; e( T2 Z7 }
if (ixstart < 81000) {3 v. ~9 n4 k7 E% s2 H
while (ixstart + 1 < 81001) {4 g9 D( @6 h$ K2 F% Z
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
( }( G; f% D/ T3 S0 W5 E2 a4 g3 K8 q8 | mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
% A% z3 P5 R) |% E }/ r9 m, ^5 N ]: D8 ]% A
( w: _7 c0 {. d+ B) B) n0 ]9 g ixstart++;
" E& T: e V! ?$ f+ J- | }( ^+ J" {& r: W- [) }
}
6 K- f) F# l3 }4 i! D% b9 o0 W- m7 ^- R* X6 E) g0 _+ ^/ D
ixstart = 1;& v9 | c# @3 r, {
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];1 D! J7 F* ^$ l" V0 K, B8 m; }; [
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {1 _. M' v8 D }. m
ix = 2;
9 x5 e, t# \1 j1 l9 S# ` exitg1 = false;" K6 g$ H9 v1 [8 c# J1 a T4 x
while ((!exitg1) && (ix < 81001)) {
+ s; }4 V, o2 ?4 r) [% j+ Z/ U ixstart = ix;5 @4 H9 y9 d2 h4 ?* g* p2 x) R
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
4 v. i6 b4 Y f, w; C yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
. o, a" K3 E( K) g2 y/ X0 j exitg1 = true;; u, _: u0 N: }" d$ E
} else {
x& {4 R, ]' } ix++;
1 B1 c, j/ u ?# a3 V }& `, t8 Y& j3 Y& U
}
' U# `* {$ d: Z/ Q5 \- M7 w }
! W6 v" ]: @1 k) o; s. H6 q0 P K" |( ]6 B4 o0 d4 m+ i/ e
if (ixstart < 81000) {5 k' v# p0 `7 p4 ?9 P; I
while (ixstart + 1 < 81001) {
$ o" g' L+ Z1 ?! P' _* J if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {* X( B- x& s2 k. P
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
) _" p7 P) E a8 r% m { }
+ t$ H" _) X) h4 O# v2 g) l9 S* Y. G* }
ixstart++;
" v5 f; ], k X( V }
$ ]& @: u$ V, f" v' v% ` } r: n T5 O& Q9 C* t6 d- j( |
( ?) K/ x2 n& K" z( t
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);6 j* w; b. V2 Q
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
1 Z- N* [' e, f; N& W6 E- m! t G- s yiDuanShuJu_mean = mtmp;) N5 U$ E( ~5 _7 I1 e: m
}/ \7 e3 x$ P8 Q' t. g3 ?" z2 C
( `- s! j1 O1 Y& |2 D4 A& | /* 找出极值 */
. G* d+ K1 U2 h( z! l* k for (ixstart = 0; ixstart < 81000; ixstart++) {
, C' e3 E, J6 Z7 M, A youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;& |. U- ~; v( h3 d1 _7 g
}+ u3 d* ^% P( B& m' D! U( t
( o# U' _# J: F3 C. f/ p) F
--------------帖子字数限制------------------: {; R& m4 t4 b% |: i3 q) `
}
6 U b: u" u9 B3 |# @+ n/ ^. P2 e( E3 R( h! ^" Q
" Z' u! b% ^* u9 h* D1 O
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|