|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
7 \7 @, R* t" s/ `7 m: T! x* Q! j+ Y' ]2 @+ y5 S
各位大神:
* ]6 P$ j8 g& q/ N 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
5 k) G3 m" S; a i5 q 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:+ U# |" Z+ ]$ U2 I- @+ Z8 S
9 U) R" c6 Z% v+ N( E: D
; }2 H) S% D$ h- x, t4 e5 ]' S这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。7 B) p# `7 @3 V0 b/ V
0 o9 x( }( m, X- i0 S6 G
并没有其他线程
! N, U7 q" R' m& R反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。( {! g% d& a' J& y* K$ L" J" S+ F
也说不定是和堆栈有关系。。。。。。2 G* y) y& q) |$ C" j
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
) g9 \! Z `: t" ? @3 i- J0 { ~2 ^. H1 S% A8 }3 m
1 d3 C, Y2 b/ G$ z e2 g
% J% y. x w2 U5 B2 ]9 w; Q; ]2 w我也很绝望啊,希望大神能帮帮忙,感激不尽,!
/ z5 o' V# R4 U) T# j# S- U) r) V1 j: Q5 L
8 _# J1 D6 T3 U! k: d/ O附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];3 \9 o+ B8 y1 C/ `/ U
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
* p/ c2 A$ Y% k, a; G& `
$ ?! c7 k q! ~+ R6 cboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
/ ?6 a+ G" P& N! D3 H5 N/ r const double data1000[1000]) {
% v) { f; m6 f/ x* ] N
k) n* e8 s7 L+ c+ ~2 L: { int myfuck;
# T& N+ K; |% _) P' L double yiDuanShuJu_mean;' `+ T( L+ _* w. o& ]7 O
double yiDuanShuJu_LowMean[1000];' Y* L G% r5 y+ B) g9 X: t U
int ixstart;
. g/ I; Z+ Z- k0 e- U: ~/ j double dv0[1000];* o$ C+ Z# X; z6 V9 T v5 W
comm_AGC pAGC;
1 G" X& k$ R6 S0 T9 o- F( ` comm_CarrierSynchronizer pFineFreqCompensator;
8 B$ Q; p3 } ]- V7 D dspcodegen_FIRDecimator pRxFilter;
0 ~; i: T( G8 e2 B comm_SymbolSynchronizer pTimingRec;
3 V. P& z& r$ `' Y comm_PreambleDetector pPrbDet;* O8 U: e1 f& M* c- u. j
FrameSynchronizer pFrameSync;
: g ^) S2 \% u4 i QPSKDataDecoder pDataDecod;5 K; I- p+ g3 l
static double usable_left_filtfilt[81000];4 M8 ]/ a) B$ E" ^* X1 R1 a
static double youXiaoShuJu_QuZhiLiu[81000];7 t. g, D, j/ q f
double mtmp;: _- @6 y! X" I7 p: X
int ix;
2 A* P7 c g. U, S- I boolean_T exitg2;/ [& q/ @5 R% y1 v/ R1 d @
boolean_T exitg1;7 U/ g4 U) z9 n9 _! @* O2 \3 _$ Q
double YiZhenShuJu[800];1 a4 n8 H g0 U$ y5 N
double dv1[800];
; P: L: F2 M' ^5 `- v: B3 c7 \' O7 C; u# K4 }% f$ b" Z& ^
5 h) _ A& c. E1 q+ ?, B
double b_YiZhenShuJu[800];
- [, w( Q0 L" I& C: o& G double I_filtfilt[800];; i: b( }4 X& h# M4 k2 {; w
double Q_filtfilt[800];
) l8 C. f$ j% X4 ` creal_T b_I_filtfilt[800];5 E0 g- a, F) v% f& F
creal_T b[800];% d( |2 u+ e# K- F
creal_T RCRxSignal[50];% t- b/ S. g. H
creal_T fineCompSignal[50];
, y9 K! f! r% U% M double phError[50];/ ] Q5 g* G0 ?
creal_T timingRecSignal_data[28];+ A& h2 c; a! P6 D8 V" R* W
int timingRecSignal_size[1];+ l. B$ Q: x; b# N0 e' E5 W
double prbIdx_data[28];# H/ Y4 K/ |+ B T7 g, a' }: F
int prbIdx_size[1];
8 k4 S( g5 ?/ ^" F/ @ double dtMt_data[28];9 M2 z7 ^/ v- g2 R5 P
int dtMt_size[1]; j& k: ^- K/ W9 \
creal_T symFrame[25];
$ U# R! W3 n2 b: q! G& ~, v boolean_T isFrameValid;
4 l1 `2 P8 F* i double unusedU0[3];
) j; h, T" E3 j }4 k3 k% y
( F5 p0 s% y# q9 o# L! |3 X% W //调试过程中的变量& D: W) B$ p2 X/ n
int enough_data;
' k$ ?9 R% m% k7 c2 E+ ?: R, |& A; h
int enoughDataFlag;% b7 d( O, P* o; e
int yiDuanShuJu_mean_int; Y% t% S6 w' b5 U& }3 E& W
int int_sum_dv0;5 _$ B3 e2 i3 ~) d
int oo;6 w) w2 W# }6 d. e8 g! x
int ii;1 l. ~! J q. Q9 s4 I
myfuck=10;
: y2 ~; M0 J( @1 `: x /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */$ t0 g) ]+ f9 Z; Y' t, b! i& k. O* m
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */2 _4 |# s. k! N1 J% \
. @& {$ |" o& j& O0 l- N
yiDuanShuJu_mean = mean(data1000);
\7 O5 w2 E; I/ u" r% @) H
$ n& p! p8 z0 h `1 N/ c! ~ yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;1 x' C+ P. Z! [
UARTPutc('A');+ Y. t: T2 `7 P; A* i
UARTPutNum(yiDuanShuJu_mean_int);( F6 x' E. N! v8 G
UARTPutc('\r');3 Z3 l9 F5 r$ `/ ]: v' d' ]4 A
UARTPutc('\n');
: n. @8 K' A% r" S/ m( m+ I ^9 h8 m) R, j) x# s
for (ixstart = 0; ixstart < 1000; ixstart++) {
) i7 _$ g' @( ], S yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
9 E6 l& C( |6 R }
! C0 `9 O4 a& ?4 a( P7 t, g# l7 R9 ?3 {3 G) ^$ A
power(yiDuanShuJu_LowMean, dv0);
& e; k9 ^# Y" T, w! T4 Q, e2 G4 ?3 ]' u1 Y+ r6 q
int_sum_dv0 = (int) sum(dv0);2 s# i4 t1 g0 t" m% {
( ^7 H- ~0 |; } UARTPutc('B');! r( x* o7 I# E8 p
UARTPutNum(int_sum_dv0);
4 {0 O5 ] } f1 o- m3 V UARTPutc('\r');
% G' X0 E0 `! m5 r* d UARTPutc('\n');
) v. ]/ n3 G. ~( P$ I4 I7 Z2 t4 C. {, m" Z5 S2 C% }( b3 P) w
// int compareFlag = int_sum_dv0 > 1.0E+8;) W, p. o; c+ F. F# J
2 K( ]; P( S: m3 r if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?3 |9 f7 l' G/ f5 k1 ?
UARTPutc('C');1 x& i# d2 p2 ` Z/ V
/* 比较信号能量 */! s+ A# W) k1 K7 u5 e- t' _
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */8 Z1 c: C. q2 j' y. i
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
" G2 {) h. C" B$ N# w6 h2 o// for (ixstart = 0; ixstart < 1000; ixstart++) {) e/ u6 B- x W: j
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =5 G6 Q3 a* G6 |$ s2 j4 l# N
// yiDuanShuJu_LowMean[ixstart];& y2 B/ Q+ ]2 X' j& [
// }
7 C- B0 g( C: @' {) @//" C8 k% v% X% _" |; S" r5 v
// youxiao_k++;
+ R* A* {% V9 \4 I' J- }& C4 e// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==4 W6 L3 T- I& y1 A
// /* 感觉要取21个数,即0-20, */8 {3 g% X2 I- [( w) G
// enough_data = 10;//有效是10,无效是0* D% V R+ f7 \
// }
1 c8 U8 |: x4 i }! ^7 D# E( X0 o& m
( T4 I; b, F( ^9 m7 X* a
' K5 i; p2 x) `7 \ enoughDataFlag = 100;
' H5 y* r+ I! N4 H9 b" e enoughDataFlag = 1000;, }% s* Z" b! ?7 `# M: j
enoughDataFlag = 0x02;7 g% P/ d# H% d: S0 m
enoughDataFlag = 200;
. N/ q0 R' G ?8 U) `6 b2 e3 i- p3 U3 k& Y9 I5 B
int myfuvk1;
' [- Y' C4 p+ ]( q! t# f1 G myfuvk1 =11;/ I) a# |4 z0 q4 k9 X
- L- c; {. ?$ V" g$ D
9 m1 u+ D. ^& v2 H enough_data = 0;
: _4 h! I$ q, P3 W
6 V) `1 w) n- B8 E! l& b4 r) I- c// if(enough_data>50){
4 a a2 t( x* U% c& w// enoughDataFlag=0x01;1 r$ _7 B3 }. @: C& z- u
// }else if(enough_data<50){
( B' }$ d* f! g) @// enoughDataFlag=0x00;//0x00还是不行
1 P% N |- e% j# m// }
; E+ T$ c+ X# [
( ] ~# W$ J) q/ F! n( M' `9 o( y
7 _- B3 `5 e# ?& o! B oo=10;
- E8 X3 x- g& K- X3 P* M oo = oo < 5;
/ u; r* o3 S$ ?2 G, l. K- @ if(oo){
. W& w9 e) w6 S+ t5 @( f ii=0;% I9 k3 e+ G2 e- ^5 R: g0 Q
}/ N6 \( R7 z+ M' Y. j" i
if(oo < 5){; \; d- _" w9 }- d
ii=0;+ ~3 k. t+ U, f6 w+ K
}' N0 S2 m9 U* Q
if(oo > 5){
9 g3 e$ _7 L' I ii=0;4 |7 t* P8 _' G p+ n Y9 c' ?( e! @
}
0 ~- A4 {% X2 Y- P+ w" ]/ W! D( O1 Y5 l: O. P( P. T" i4 U
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
3 n$ l! {1 _! M: s5 V# H9 x' K /* 如果数据足够才执行主程序 */9 [. j/ @- m. P" n0 G/ c: ?1 O7 O
oo = oo < 5;/ }; D# G R8 Z! _
enoughDataFlag = enoughDataFlag < 5;6 a7 L/ b' Y8 W. H6 h3 \# {. i& G
if (enoughDataFlag < 5) {* W$ o" J0 d3 P% a
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是04 E" v: v3 P! B9 Y
AGC_AGC(&pAGC);' w9 W1 K T, U9 C
) e: S: ~3 C# M- G) m
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
. s0 _5 v1 E% Q# N FIRDecimator_FIRDecimator(&pRxFilter);2 y1 \6 c# q, q# [6 J2 I: h& ^3 r" N
* t5 v' t+ }/ Q
/* Downsampling */- }' t# h0 N: _" E+ i
c_SymbolSynchronizer_SymbolSync(&pTimingRec);' S- T% [' ~5 n$ s( d
+ d& \/ y6 Q, e0 O+ D c_PreambleDetector_PreambleDete(&pPrbDet);2 I" F' F0 F$ y) Z7 R0 a9 A1 i2 s7 C
1 d. v7 Q; V1 @. G' Y- Z /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */3 F$ P; Z9 z) N' B, m& {1 r
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */% _ s+ K4 s* Q$ X1 q3 ^( [* O5 {
/* %帧数量=100 */
3 j' @- B0 A9 M* f' k pFrameSync.isInitialized = 0;
5 c R- H! E" _/ B9 u' @$ L( \% b( B. D. U9 V `" @; Q
/* [EOF] */" h' D- x, }, @9 I5 E$ j
/* 前导码长度是13 */, p5 L5 {7 _8 \# v
/* %qpsk */1 ~. G# k' R6 L5 L: ~+ X4 E
pDataDecod.isInitialized = 0;
. a' Y% ?% _6 @/ E3 |- ?
7 y H6 q/ i5 ]( |( Z% } /* end */
7 C# W2 T+ q# m0 R* v! c9 _2 c; G2 s /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
; Y, ]4 K; @) l /* Convert 3-dB frequency */
9 y, Y; p5 ]5 w; H) ? /* Convert 3-dB frequency */
8 a+ V5 P/ g2 T filtfilt(save_buffer, usable_left_filtfilt);, n1 u9 j5 ]- W" H, f9 Q
for (ixstart = 0; ixstart < 81000; ixstart++) {5 x4 I5 v) s X# ]5 L1 N
usable_left_filtfilt[ixstart] *= 2.0;. x9 T5 H/ W0 |" P G& I
}
/ E. e" z" O5 d0 w4 C y E6 |- S# {2 Z7 K* c3 E5 Q) ]9 L* n
/* 注意乘2,处理幅度 */( q5 v& k1 T( o x$ b/ b! t0 @1 J {
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
+ E6 |6 a2 b A: X /* %% 行列转换 */
# ]9 u; B$ Z _* j* t yiDuanShuJu_mean = b_mean(usable_left_filtfilt);8 l/ D+ P9 a6 C v+ J
for (ixstart = 0; ixstart < 81000; ixstart++) {
- J6 a0 D% F5 T youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]! G' v% S$ E1 ^2 ]/ R. d& m
- yiDuanShuJu_mean;
7 i; d- U# f, S+ F2 }' \6 b4 B }& q1 \. s4 ?# y8 {4 d. J
% ?, s/ U3 i. G: I' D2 V /* %% 应该对数据归一化,但是这一步放在哪比较好 */8 W; B% d4 D: [; \7 M) t( X
ixstart = 1;5 @' n0 o7 F* J" A8 y4 `' N' F
mtmp = youXiaoShuJu_QuZhiLiu[0]; ]: B* c) X# o9 S% d) f
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {8 _& R% j1 y! G- E
ix = 2;6 v& q3 P0 E& N0 Y u: \5 x6 j
exitg2 = false;
$ t3 l! Q+ i: D! |9 }* k while ((!exitg2) && (ix < 81001)) {
9 X0 {$ R- t, x, z2 ^3 O ixstart = ix;
) l J! Y/ P' X% y if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {9 n* {# v; D+ j* e; y0 k
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];7 K0 U+ E- B+ {! i) f
exitg2 = true;, ]5 q# [4 v0 c, X( T9 o/ Y
} else {
! E( v. }- _/ m) l# o ix++;
. O7 S* W6 H$ f/ f9 g% r' t }* e) U- J+ d! R
} e' C6 W, v; G) G! a- u
}: s4 q6 H9 G( B/ H) U
1 R" o" j- H8 b" d4 F3 c
if (ixstart < 81000) {
/ v7 F, d$ \8 E. j P+ v while (ixstart + 1 < 81001) {! B/ d0 ~% Q8 ?& J
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {) A1 S6 g- B9 ?( j; n' G4 f( c/ Q
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];! f0 b2 m9 m" o( b
}: A9 D1 O' T7 i4 e! d
9 k. n9 _: D5 A+ ` ixstart++;
' b- P* O3 b3 G' P, K }
9 F, r Q: w0 P3 O) D }
( l/ h! c, f# g* P+ @0 r
' T2 q) ]9 ^6 g7 v/ R ixstart = 1;9 a$ e) c1 z- `7 c, O
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
' A" y% r; }% o( [9 n5 f& m if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
7 o) {- x2 J& n B) ], R2 \ ix = 2;) o! }: @7 D# m; L9 g, U8 L
exitg1 = false;, k% @) E4 U7 f( X6 U
while ((!exitg1) && (ix < 81001)) {% D0 ]+ n, `1 f5 ]: z5 j% y m$ r
ixstart = ix;3 g& X8 O1 p: r
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {% l+ N; v6 j' p$ d
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];7 K! c- H1 ~* a! F; ^$ u# u
exitg1 = true;
% M3 a9 n; t5 T3 g" U; [ } else {
0 |* X# ?3 F6 y- O, P! t ix++;( X( q$ M3 @. Z& \1 v% u
}4 C* c" ]. ~. C1 _
}
3 z# _1 ?# K7 ^ }
( \$ x6 P+ T, O2 T3 z0 ?# t: W! I& Y% O; \8 s7 a3 k: P
if (ixstart < 81000) {% c1 u, l r$ I5 D# ?' [2 N) `
while (ixstart + 1 < 81001) {
( a1 ~0 h( X s if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {6 g8 I! P0 ]+ O+ z; C
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
, Y4 S9 \# Z5 u) b }
3 }" _$ C/ z7 D2 O! S5 f# {* o3 i9 h$ t6 c: p4 [
ixstart++;
( p% [7 b! Q/ c5 }; h+ A }0 E9 q5 v3 T: \0 C# S' k5 b* f
}
. L$ V( |/ z1 n8 l i: m; k7 z! _, i' r( ` O7 y; C
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);0 y3 D, J8 `1 k# f- g* z
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {0 b* v5 P$ S+ z* e2 o* ~( T. N
yiDuanShuJu_mean = mtmp;% a/ |) E: p, N- |8 T' r
}3 B6 Z7 |3 F! g) B4 \- S
3 i# R5 [" o6 Z
/* 找出极值 */. o, s* G, K1 y( H$ h
for (ixstart = 0; ixstart < 81000; ixstart++) {
: i& }0 n1 S" R2 o) { youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;: j P d! l/ p; W3 }& a
}3 x/ X f+ O4 M! w. D+ B; C
- M9 D4 d( r3 ?! P. t
--------------帖子字数限制------------------
# M c" Y+ U P. h, D1 o% X) D, ]}. [# {/ s$ m; F" c0 h6 V& j; r
7 P" s4 U% Q; P! O2 x l: t2 m8 p
. F$ ?/ _# }+ a
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|