|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
( T% q, u% j9 c% j' F0 @8 L5 V4 K: |& o, [& H$ Y- {$ `
各位大神:; d$ }3 s3 {- ?" d* j
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)7 n) }7 J& @: k" f& m, B+ d" w& e
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
( s# S& b; E I4 x# R9 C6 N
* x& c1 B+ b" n4 p+ @- \- y * @* _ P3 o9 ^( u; D
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
, e4 b( }4 f4 U/ n
& q& S; x' l( N% m. `& P并没有其他线程
, i6 @$ X" |! |反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。/ x- B9 N+ n# w7 n# w, o
也说不定是和堆栈有关系。。。。。。1 Y, `! Y) }, J3 l& t+ }$ T5 J
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....* Y" T: g( Z# g; V
6 \3 o6 c! |. c9 Z; X
% Y& }/ v' |" Z! K
# U- N! `0 @4 J: {- L' H我也很绝望啊,希望大神能帮帮忙,感激不尽,!, m" f( ^+ D" t* z" B* w; ^8 A
) S3 {5 ^' x, P5 M4 L
0 P, S$ K, d2 N4 @+ i% U$ Z
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];, P5 e7 \) y' `# G1 g9 r' v* S8 E" O
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
% R- f! r/ c4 X. q0 C9 O9 K& X$ p5 y! T$ ~3 O
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(( ~9 l/ D5 f8 H! d
const double data1000[1000]) {5 \$ y2 O% p; ` C( F n
9 v/ p7 e+ a0 r6 I5 f8 ]' X int myfuck;# L( h+ E( N3 o% O
double yiDuanShuJu_mean;
8 E; o+ q) @$ `& S. E double yiDuanShuJu_LowMean[1000];7 g- o& B( o! T6 S
int ixstart;6 c# x! K8 K, ^+ R7 X3 P& o% Q0 x
double dv0[1000];5 b* C2 }& b, H5 `" w; h" @, F1 V, Q
comm_AGC pAGC;
2 _8 u; B- t+ Z, d' b( [ comm_CarrierSynchronizer pFineFreqCompensator;
3 h+ a5 d2 ]8 f7 F# {5 \ dspcodegen_FIRDecimator pRxFilter;
5 U! I K# }9 \' Q' A4 L comm_SymbolSynchronizer pTimingRec;) J0 s6 t# w+ i' G. R' k
comm_PreambleDetector pPrbDet;6 h' G0 W5 n" H) Z: G+ i Q
FrameSynchronizer pFrameSync;3 i$ f. R0 H* Y" ?) s$ t4 k2 m1 n
QPSKDataDecoder pDataDecod;
$ A& Z2 o8 R9 C/ E1 Z+ N, s static double usable_left_filtfilt[81000];- T& j5 \* [2 y1 h- @2 U+ |* g
static double youXiaoShuJu_QuZhiLiu[81000];4 V1 l+ o, B8 b/ i+ N0 T' u1 d, Y. ]
double mtmp;
$ ^, X, v9 s3 G: K$ } C int ix;$ j6 ^1 L, v. p: o' X1 F/ |
boolean_T exitg2; E7 c6 [: h D$ u6 F# Q
boolean_T exitg1;
/ I$ c6 ?2 F9 F- y double YiZhenShuJu[800];! f+ T1 [! _: j0 d4 a
double dv1[800];
) Z/ T ~3 ^2 d5 [
* x$ z4 C6 @4 h' Z
! p" w6 A" d, T double b_YiZhenShuJu[800];
7 s" u p8 u9 g/ J3 i P double I_filtfilt[800];. {% p7 T9 Z# I4 j
double Q_filtfilt[800];
5 x+ O4 J5 {! R: z creal_T b_I_filtfilt[800];' K, D0 m: E; J$ ?; b
creal_T b[800];
1 j0 e7 a, E! D3 q/ C! L, m8 ]# b creal_T RCRxSignal[50];, T h* A6 f* @# p
creal_T fineCompSignal[50];
+ t+ w) `" u7 a. V4 w! J5 i7 ? double phError[50]; S4 y1 J B0 G) ~% H9 V
creal_T timingRecSignal_data[28];0 y/ Q2 j- Z! K O8 a
int timingRecSignal_size[1];$ T% O, U7 j/ D$ n
double prbIdx_data[28];5 I2 m0 y) x7 s8 b0 L
int prbIdx_size[1];' s( i# R \9 B3 o7 w/ ^
double dtMt_data[28];
+ k2 C+ H; o- c int dtMt_size[1];
& X3 w! A, d" Z+ A B, c2 _ creal_T symFrame[25];" G+ g# S: \9 I& h( ~
boolean_T isFrameValid;$ D% @7 l5 x9 Y1 ]9 e8 U' E
double unusedU0[3];
2 r% \% z$ ` E8 K' ^" t ~+ l+ H
//调试过程中的变量4 G/ l, h' h. y
int enough_data;% O1 ~; E- \* B) y- Y( n }9 w/ I
' n9 Y- u/ ^8 y( R( a int enoughDataFlag;
; t% p5 Z7 ^ M9 N int yiDuanShuJu_mean_int;
- c% U' }) K3 x( A int int_sum_dv0;" r$ c5 O' N/ }, E! }
int oo;5 q1 [8 h' Q4 P
int ii;# g5 |/ }: W! n% t
myfuck=10;5 T; e$ i; e/ b
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */, g3 F. {$ V) f5 B6 A. O+ F
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
$ g6 o E- c8 B
~8 g! L" t3 p8 G$ w yiDuanShuJu_mean = mean(data1000);
* M7 m+ J' Q5 u" g* w9 Z) V- [! @: e( r# @; w6 Q f% R& n$ P
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
s4 f( ?, c. F# j* N4 N6 T' O UARTPutc('A');
" t; K( g Y/ r: R UARTPutNum(yiDuanShuJu_mean_int);( O; X' a; R$ g
UARTPutc('\r');
( u) l: s: b8 [ a8 G- `# J: b! A UARTPutc('\n');/ d& d! `+ S7 j, j& W% D
* g. {/ }& P+ j! Y& [* C f$ ]
for (ixstart = 0; ixstart < 1000; ixstart++) {9 v' d8 R/ b) u- b4 T- d1 J. r( u1 c
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;! U8 g S% j$ M
}
1 _( `6 x2 R. l; }! @( H9 O' q
0 \# r) \' _8 C6 u$ l2 | power(yiDuanShuJu_LowMean, dv0);4 Q: t! @6 f8 k/ V7 G
# d H. P. t4 v) A% w
int_sum_dv0 = (int) sum(dv0);- r4 U* [7 O" b, {3 v& F9 s) b
2 r# i1 N% i( w! t+ c
UARTPutc('B');5 n1 v" P7 P" e d: z* D# d5 `# J
UARTPutNum(int_sum_dv0);2 N4 f7 s, M) {9 C+ O0 w2 Q+ ~
UARTPutc('\r');: E- e8 C0 q8 W7 u
UARTPutc('\n');1 p( ]* m' ^* N+ q
1 F" `% q; P& ~. `
// int compareFlag = int_sum_dv0 > 1.0E+8;* c' @ c0 S' R( b) Q
% r0 y9 v) w% {5 Z& \/ \ q if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
/ f: {: ~, [ q8 A6 o r UARTPutc('C');4 Z% s( r# R/ v, L
/* 比较信号能量 */) U) {0 h- K& Z8 B: M5 U3 c$ R
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */' b' @! i# s: | j2 X, @5 K$ |$ z
// yiDuanShuJu_mean = 1000.0 * youxiao_k;, e6 g. B" v, I( t3 r6 R
// for (ixstart = 0; ixstart < 1000; ixstart++) {
p8 f3 m5 n3 ?* D1 q+ _. G// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
* c7 Y f& p m2 m7 V- ^" e// yiDuanShuJu_LowMean[ixstart];
7 v& _# l7 H2 q0 y, p5 L, g// }
: d% F% n, @5 _6 ?! e! u3 l//
$ z0 p! \" e! |! q- d& X- x/ e) M// youxiao_k++;6 k4 @: G( L# Q5 t
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==2 g7 r1 i+ c; n' w$ Y
// /* 感觉要取21个数,即0-20, */
' u3 _2 S7 Z3 D% g4 }: e+ l// enough_data = 10;//有效是10,无效是0) u0 G& d5 t6 ^: }/ X: L( ~
// }' U" c0 z0 H& L" K
}
8 ~# K3 o/ ~6 j( _! }0 U7 U; T; ~: @: C5 E" r% F6 E
# v U# x# }, P( m( l; _
enoughDataFlag = 100;
% d' S3 p0 S4 i: F enoughDataFlag = 1000;
6 q8 o" G4 o+ w1 h9 g2 Z enoughDataFlag = 0x02;
4 x% |2 p1 D/ c7 Y& e4 S enoughDataFlag = 200;
1 n/ V9 T' k6 g! B9 {
' ?6 y7 x4 w! _- i$ C int myfuvk1;3 C- I' m& J, N- J _- p& P5 q
myfuvk1 =11;% B" l/ |; C8 G, e
- X" t8 Y/ y2 _3 V0 P( Y: y1 a7 m5 [2 r* I: f% c5 O
enough_data = 0;2 P8 Y1 y) p- o. _- v2 Y5 G
( f+ ]( S0 c0 H, l- h0 M
// if(enough_data>50){
( Z4 A6 L1 a) d( T6 v, s8 Q4 {// enoughDataFlag=0x01;3 A) V6 x+ w8 |0 Z* e# m5 m I6 r. u
// }else if(enough_data<50){8 C$ A7 W, [* _- ^
// enoughDataFlag=0x00;//0x00还是不行
$ h! w H2 c. `4 b- k ?// }
/ A) F3 X1 r, O1 z% Z! m7 r3 i4 P O1 |6 k2 h" |, g# F! G
& @& x8 h" R+ R" M+ {. x
oo=10;$ ?9 o3 J) p; J2 e# p) p& y
oo = oo < 5;& M- M! @9 ^- E. T. u
if(oo){
$ [2 l1 d4 ?$ t' o/ z/ k ii=0;
+ k# u& w0 P% |+ K5 j" m }6 s" i" F$ Q% K
if(oo < 5){; C9 y) ^+ \4 b; v# i, ?
ii=0;
) z1 q0 f6 w. s, p& C' j" X }0 _3 Y" u7 L9 ^4 C
if(oo > 5){
1 W7 Z9 r8 U1 `5 F6 F+ a0 r: b/ ` ii=0;4 J. x r h c
}0 j4 z5 @% o8 }! {! ^
\1 F" k, H% }$ ] j" G /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */' s1 F6 V0 [0 `6 [1 y& a: g3 i/ Q
/* 如果数据足够才执行主程序 */
. E* `4 b5 b- F. |1 o( g/ Q oo = oo < 5;
' a: H$ \/ F8 c9 a+ ?% p enoughDataFlag = enoughDataFlag < 5;0 b) A+ L6 ?# G
if (enoughDataFlag < 5) {, I. o; z0 W7 k( H# H5 N' h
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
' _# P: r; e ~3 M* K AGC_AGC(&pAGC);' P- L+ `: y- h, @7 w; Q
t1 m* y5 Z4 s2 Y
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
( p7 n6 `( c5 Q. c/ K2 K; T FIRDecimator_FIRDecimator(&pRxFilter);
6 h7 G5 U0 n ?5 Z" `0 ~* s8 e r7 |) j" s, w4 z5 @# d" M: J+ C( |8 B6 I) i+ A
/* Downsampling */
3 {; d4 r2 p3 z! [- F c_SymbolSynchronizer_SymbolSync(&pTimingRec);
: i+ C; Q# G3 c+ v: S- [: E8 ?+ F! @% y. _
c_PreambleDetector_PreambleDete(&pPrbDet);! |0 @9 J1 F, E( L& T0 J
& U! Q1 }# D, D8 l! e /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */# Z/ ^1 q; E% _( |( |( Y1 p6 T2 g
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
, e, U. a( y3 S4 [; N# n X$ \ /* %帧数量=100 */
; ]& m( i2 e7 R% Q pFrameSync.isInitialized = 0;
/ @/ k# N7 U* [+ @! c" x. B9 e
/ F9 |/ L( `. |" Q /* [EOF] */8 @( W$ w/ ^8 W' k4 Q
/* 前导码长度是13 */
2 n" k G: ~0 k8 Y* K /* %qpsk */
! c5 f7 Y6 t! r0 f' T, l5 D pDataDecod.isInitialized = 0;; M- Y/ P6 A; E1 z5 h
( O% F; E& _3 X /* end */3 L9 |& q- x1 M+ S, {- X j i
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */* B1 T$ [6 a+ F1 B2 N6 ~6 i, q
/* Convert 3-dB frequency */
- `/ X$ k! E0 u/ m3 s /* Convert 3-dB frequency */
/ ?1 W# l- C% B filtfilt(save_buffer, usable_left_filtfilt);6 q5 P7 X. Z% E0 n% k3 _
for (ixstart = 0; ixstart < 81000; ixstart++) {
) [! Y' g) ` r- d: T6 R& ^- g5 h usable_left_filtfilt[ixstart] *= 2.0;( Y) x" E. s. A# ~
}( @" S0 l; E0 i9 r# u
( T- c1 s9 A1 A2 U) x% Q& Y
/* 注意乘2,处理幅度 */
. u. g9 t. s( R* S4 {1 H /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
6 E1 X9 ^7 Z P. n8 w# B3 \* i3 F /* %% 行列转换 */
: `- F8 H, n& O9 x* I yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
' _. y( c3 | ~* T for (ixstart = 0; ixstart < 81000; ixstart++) {3 ~" C2 o% s" n: w2 B% c
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
( b% j# E( R! d% I$ ~1 R - yiDuanShuJu_mean;
1 l4 k/ ^2 X/ u9 S, i }
- b/ b/ h! q& _9 Q: H
5 u' O' M! F( D9 ]6 f( H /* %% 应该对数据归一化,但是这一步放在哪比较好 */
4 t" O0 y" P0 ?6 G5 u8 x ixstart = 1;& S) n& }+ p& z- X) M% s8 l
mtmp = youXiaoShuJu_QuZhiLiu[0];
3 {' ^# T5 Y5 _8 U if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {" |& R1 t- B3 F# c% Q2 ]2 B; T+ x
ix = 2;
. a; k% ?( T; w- o$ [7 i& t exitg2 = false;& F% R% L- P4 K; O5 } g1 P
while ((!exitg2) && (ix < 81001)) {0 ]* J1 {2 l5 G! A) M& ~3 J
ixstart = ix;
1 X* m6 T. Q4 f! M9 u if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
6 U d: j+ H) ~4 v, N5 |* a mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];" E2 d% x8 R. s: A2 D
exitg2 = true;4 [, F( d Y7 n3 x
} else {3 w, y6 p& ?- h% G; w
ix++;, j: J! F8 J2 d+ A( `6 K, T; ]
}! b! @1 T# k% d3 O6 P
}
6 | K$ C9 A% ^6 S& f3 V7 S2 s }+ V" h2 d" Y% Z1 |. f* P7 B* z
: S" ]; D2 u) A* v: J! x8 X# P& m6 U if (ixstart < 81000) {
9 V" c% _" [: R3 ?( V K3 @0 p while (ixstart + 1 < 81001) {
- L! q) \7 a% g$ e4 L4 P if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {& _# D4 Z) T5 o
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
0 K! |- ^9 H0 z* O2 v! c6 O }
; h# e2 _6 E" ~3 l1 A; x$ L2 k) ?+ x% O8 ~
ixstart++;
0 Q Y" w$ T: ?1 c+ h5 k8 i- i }
" ?* `+ S- h8 @% m( d3 v }
" T* U9 m& N% t) g4 G2 R6 t5 |6 a4 Y5 \, ` H, d$ `
ixstart = 1;2 a/ [, ?0 h/ x. b6 V
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
3 {! N8 [) O3 k" @# H3 v( @ if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
! E4 a1 `2 L' H ix = 2;
; @% }: R$ C/ F. X exitg1 = false;: f8 \, g2 b' D% d, x
while ((!exitg1) && (ix < 81001)) {
5 t/ l- }3 p# A3 P1 v) e* ` ixstart = ix;
5 u& C% ~3 S/ s) @: G2 ? if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
2 E" c0 R0 X2 E( U0 F7 N yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
- h; H" x" j0 H& P2 h exitg1 = true;% m& h* A) A! a1 d% g- X
} else {) X6 ]# o I! x, w$ v
ix++;; Y8 e7 [5 V/ a. X5 B" \
}
2 U: q, E: h# P# k: n, y }7 k" F! L, ]) ?
}3 ]1 b8 p9 }' ~
, g, P7 ]( D* f2 ^6 U" P( U if (ixstart < 81000) {
& }. P# c, J3 {1 B while (ixstart + 1 < 81001) {/ k& o: E; M) n: J$ v$ y# A" \
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
( {! N$ h5 \- c7 A% L7 s/ p$ Z5 l yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];# B8 Q3 R1 j: ]
}
1 P, m5 G& y A& }& _% F; N, e" {2 v) H% [& C4 V- T
ixstart++;# Z0 Q5 C8 @6 {+ I; ?) ?% q
}
, V7 S) f* {7 k u: {: A }
, F4 U# d* q# G9 ?5 C
4 C s+ j0 b4 ?3 e R$ R5 T/ | yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
: N4 X0 G7 r+ x$ i$ r" E6 k if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {' E. g" Z) {/ G6 U! J8 {$ i* R& b
yiDuanShuJu_mean = mtmp;( q3 F* E/ ]5 U
}) z& f6 w& S- O( g% y# n
& `" f c# h$ B! ~) h
/* 找出极值 */# K: Q* R2 `- V0 L2 c8 _9 [
for (ixstart = 0; ixstart < 81000; ixstart++) {
; U* |6 b- X6 L, D4 |3 o6 P1 Q youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
# q$ O) d* M9 a6 }0 H" m }% _% G) l( n- e9 g o- b
5 j! G- A+ }% P; L+ t3 g7 h$ ^) D
--------------帖子字数限制------------------
0 x- e* j) p6 w5 S! B5 {}/ h+ H6 y1 n7 K
/ ~/ `2 l( b j5 R/ P; ~& l* a% A2 u' C4 p/ _1 E
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|