|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 * V: x6 z3 z/ | W# _2 o( Y! G! ^; b
4 p4 H- u/ x8 b3 E各位大神:
6 h, ~: T6 t( ^+ w' z+ F; e1 _ q/ h 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)" v6 L. G9 w" J1 O2 L+ g
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:! f. q* u: O+ b8 Z
2 g5 V0 d, U( d9 N1 v v, N
8 s+ V% w; Y! B# Z这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。; F! U5 C1 Q& @; r' g$ B. d# X; h
. X5 S$ g: q' t% F* `' N
并没有其他线程' I0 H0 M% R. c7 P
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。; R% k4 Q; V Y" j7 Q9 F8 m
也说不定是和堆栈有关系。。。。。。# P. P/ u0 Z5 f! X, j. @
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
. [. D! c. y, P8 \9 H
# M9 z6 H F* G# n( O7 y! h6 A- Z: }; E+ o
5 T, s6 q1 n7 L# Z( G x* J1 E: H" f- R
我也很绝望啊,希望大神能帮帮忙,感激不尽,!9 c: p' q4 _5 [4 R/ Y# X+ R$ D
8 G. D: Z7 Y- V t2 z9 q' ]: g' X% X; T3 T3 u$ C# p
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
; s6 H6 L$ ~0 Q( a. o4 ` static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
6 A. ?! L6 V; u3 a* h5 t; m
' k ~* O) w& cboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC($ |$ M; B; h* q( E2 p5 [
const double data1000[1000]) {& v# Q/ w2 q5 F F
( ~6 z$ ]: }5 ] int myfuck;
. A. d$ x* m! ]# V1 ~5 X3 G4 k, ?0 X3 a double yiDuanShuJu_mean;4 V, N G2 f& T) e5 D( |$ ~
double yiDuanShuJu_LowMean[1000];
) y; t6 a4 p% m" Y int ixstart;
- P# B" @+ Q' b+ j5 j double dv0[1000];- u( c1 E5 ~+ ]+ N; j
comm_AGC pAGC;
* B2 z6 d* @, }$ ?. P( H7 c comm_CarrierSynchronizer pFineFreqCompensator;; w3 T1 R$ @/ R8 h, C- d- ?% J' N
dspcodegen_FIRDecimator pRxFilter;
3 ~+ ]3 X) n1 S( X4 d/ _ comm_SymbolSynchronizer pTimingRec;
! G% f `+ K. i! V0 @ comm_PreambleDetector pPrbDet;
" F& y+ V1 D. v2 K FrameSynchronizer pFrameSync;8 P( o- [0 ]1 q7 |1 K* k4 n0 `% c
QPSKDataDecoder pDataDecod;
( N! p1 L' a! C/ a static double usable_left_filtfilt[81000];
& d$ P, i$ |2 w2 X8 ]8 P9 b static double youXiaoShuJu_QuZhiLiu[81000];
5 T6 X) h9 p5 p' |' q! ~ double mtmp;# q8 ?7 u5 K$ f
int ix;
j! I6 e ?9 _, h1 W boolean_T exitg2;7 A- o: B k% g3 I0 V
boolean_T exitg1;
' R% S3 c1 z7 H, j, }' W double YiZhenShuJu[800];( s" u1 W: o$ `8 r0 }* p
double dv1[800];
, V! V+ N" G, B5 l7 V# `3 t3 E; i1 T' N) f6 y s
* l- z" Y6 k2 [; @0 N! S. [( ]. I$ M double b_YiZhenShuJu[800];
3 q' N% @8 Z5 n3 |; T double I_filtfilt[800];
* \9 y& x- f7 O double Q_filtfilt[800];
# N Y o9 l6 t4 n8 X/ e+ P creal_T b_I_filtfilt[800];1 a+ Z# |( _0 r0 i s
creal_T b[800];2 c3 @* ] _3 ^' M8 |
creal_T RCRxSignal[50];
1 i: n9 _, K9 S& V" _ creal_T fineCompSignal[50];: ]" v0 b0 E# U: V9 }3 W
double phError[50];
+ h5 C3 s9 V' C( ?# M creal_T timingRecSignal_data[28];% z, p+ f9 K( E0 e2 |
int timingRecSignal_size[1];
; c) i/ [5 n" ?! H: h double prbIdx_data[28];
2 S4 c" ~* n7 i: p0 G9 P int prbIdx_size[1]; U( L2 S$ i! t8 z8 H: v o/ z
double dtMt_data[28];
( o9 ~0 D. L7 w. T* z+ D. \ } int dtMt_size[1];
. l) M! T# i! _( j* I, c8 l creal_T symFrame[25];
- ?5 R- n9 x/ T* Q boolean_T isFrameValid;
' z _! s7 _" m, M2 @. y double unusedU0[3];
8 B: l1 R4 I a3 G* ~* _8 G. k- q0 ~/ C" ] m0 R
//调试过程中的变量
: s( J, q' c# z! U$ x5 j int enough_data;) L* g5 d/ _4 @
' o+ p6 _' {, N U
int enoughDataFlag;' M' s9 \ K4 x( O' U% p E8 _
int yiDuanShuJu_mean_int;
7 @; C7 c/ D4 N+ _ int int_sum_dv0;# b% v) r! x/ H" Q) a
int oo;
2 y S7 W; T: t2 c6 B int ii;
' g0 |! U! K( d$ r* ~" _/ z myfuck=10;+ |! P; W9 [7 w
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
% C) V4 l) s; }1 q! D5 ?) T /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
a3 u! j$ J( [$ }8 [$ z8 y3 J. {1 v* Q8 r1 R: m" L& X) L
yiDuanShuJu_mean = mean(data1000);* a+ ]8 K3 k9 v- d
6 O( z. r3 r/ r! `. P8 r7 g
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
' d1 N; e6 A7 [; z6 S UARTPutc('A');
2 N5 i, h$ M$ L- D6 z UARTPutNum(yiDuanShuJu_mean_int);
. a" J7 A* X/ M UARTPutc('\r');
) x+ ^ n2 G; c/ E0 w" i UARTPutc('\n');
+ y! K0 v. r% G4 T# S$ c; h' Q4 W9 b- T) d: c. r% r3 T
for (ixstart = 0; ixstart < 1000; ixstart++) { |% O* }* Z n( Q3 \
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
* x- u2 e1 y& P3 g2 O }
+ f/ G& r6 M! g7 Y+ z9 ]! N$ U6 x
3 h8 _) r( `* J/ I- q$ [ power(yiDuanShuJu_LowMean, dv0);
8 e/ A+ c; x' O) ^# P7 p
: \) a) ~. s7 g& w( v* v+ l; F3 c9 s int_sum_dv0 = (int) sum(dv0);. f# V5 B- R7 B/ v- v y9 J( B
* k4 T, I0 s; P! b UARTPutc('B');
& u, l* i$ C0 K* m/ a( f* @ UARTPutNum(int_sum_dv0);
& d/ ? i' V& }0 `# \8 K4 l UARTPutc('\r');
# D, l% p; X. z' L& Z9 W% m UARTPutc('\n');
9 u# U8 V* @: E, r
) Y4 l5 J [9 G$ Q. V1 C// int compareFlag = int_sum_dv0 > 1.0E+8;
9 _+ i$ m. |& l) ^! `3 ~" `, {" P4 l! u7 J/ P
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
& G9 v1 Q* T3 {0 N5 y% s) a UARTPutc('C');
" h9 J. F6 g& [- \8 G X /* 比较信号能量 */
% X& d- i$ d$ N, c6 Y, ~3 e# w. u /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */ o7 w$ F5 [( R6 B& \( P
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
- Y4 m4 |; ?" s// for (ixstart = 0; ixstart < 1000; ixstart++) {
+ `# z# ?/ D- k+ T1 Z2 r6 }, M// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =% D/ [4 p1 T' R' Y' k! u4 o* T. q
// yiDuanShuJu_LowMean[ixstart];, E& W+ `& _' g- M% _
// }+ @ ^+ [3 h5 y! ^
//7 k1 m; M. `; K& z8 G0 q
// youxiao_k++;
+ c7 i6 x( g* l* V8 y) h// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==# l g6 o& U" G- L( o, i+ ?& B
// /* 感觉要取21个数,即0-20, */# z: m8 @# G6 T1 n1 z& x
// enough_data = 10;//有效是10,无效是0
( n" w- T! ] w4 W) P8 f" r// }5 h3 h0 a2 Q' A3 m9 H% M% l# U: s* M
}0 @& |* o! A0 T# v2 f) q% W* B: I" [3 ~
# n5 w2 \8 e2 w' G& q7 X1 w
$ V, O9 h8 R% V4 V& _2 M enoughDataFlag = 100;
6 `' C: @( h. t; ]5 R% H" N enoughDataFlag = 1000;
8 T- y& r1 X; f$ ?7 M enoughDataFlag = 0x02;* u8 k# [. g# L. a G% }: p" A
enoughDataFlag = 200;, e% J& K3 O- r9 ^
0 x9 C; U+ H# Y! ] int myfuvk1;
8 C1 o' T5 t4 a, Y myfuvk1 =11;
3 L. M% u/ i% a% {" E& i {7 ]
. d) [) Z( q9 l7 G+ m0 S5 L5 ]
8 x" X4 w% W- p! r* k% ?" Y enough_data = 0;
. _( v) K! e# T0 ?4 N' @
" J2 s% c# m! n6 ^1 s4 ]// if(enough_data>50){
3 e( c. K5 {5 [+ g// enoughDataFlag=0x01;
f2 @, B6 t1 v// }else if(enough_data<50){
; [, y; }3 o! A V; B Z// enoughDataFlag=0x00;//0x00还是不行
( }9 m7 g& n" ]& ]0 A* u) S) L// }
+ }& J3 i4 u1 C% u2 |3 P% u5 x* ?& g/ o) [8 B
7 }0 o) u; A; R T I: _) p1 ? oo=10;, D9 `9 G) q3 {: p
oo = oo < 5;
8 | i( |; }1 ^7 o# k+ x& P if(oo){
: G$ q+ p2 m! l8 Y ii=0;
0 {! e. F7 N/ ]! _3 C }1 v/ k( n/ N* u8 K. v
if(oo < 5){
8 I, E1 d3 T) }# A* f% W/ n ii=0;
8 ?3 [/ @. q C7 T0 b- } }3 R/ |9 [* a0 ?: g8 R0 g
if(oo > 5){
" X3 @1 n( S/ W: u- d; v ii=0;4 |" p# ~, ?& E/ a; x3 i3 Q
}4 K8 k5 g5 Q7 x
- D3 f1 {3 H/ u' ^ /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
& }7 @3 W, T3 {7 o$ | /* 如果数据足够才执行主程序 */
& c5 w* B! w" H z9 |' `# h# L oo = oo < 5;; ]8 p, a& l! P% @
enoughDataFlag = enoughDataFlag < 5;
# ]: {% I' L2 u7 R3 _5 Z if (enoughDataFlag < 5) {. k. {$ y# o# K( R0 @5 o ~2 E
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0$ G7 z& R# n3 o- Q* w5 l- N
AGC_AGC(&pAGC);
. [- N5 V! N3 _) n0 w# X
4 F" W! h9 [ R d$ n3 K c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);+ i1 a+ O2 g8 ~$ I7 M
FIRDecimator_FIRDecimator(&pRxFilter);
( A8 V+ `2 k' D, F t/ \% [
( R1 g' P, l- M& @ /* Downsampling */
B9 D& n9 N- o) d1 u0 E2 _- m c_SymbolSynchronizer_SymbolSync(&pTimingRec);
7 J* N1 ~! G& \& [" Y- o1 ~" B3 B- Y
c_PreambleDetector_PreambleDete(&pPrbDet);
* ?" }6 I0 Z: [8 v* t' v
" p5 O* k- t/ V- s) R9 ^ /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
5 F9 o. q. ?* B /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
C C& u a( ^ /* %帧数量=100 */
6 V) u) c7 w. R pFrameSync.isInitialized = 0;
' g# k( a; s2 G' C. c7 F& v% B/ v* Z4 }, U+ ` M3 v+ x
/* [EOF] */
. s+ K w3 a G1 |: O1 J /* 前导码长度是13 */
# j* k* Q% ]4 M /* %qpsk */9 n+ ]; j+ q0 ~2 j" K+ U4 y# C. z
pDataDecod.isInitialized = 0;
, t. K) F4 S, o5 v, p/ V$ Y
3 G4 p' O4 y- S# F7 C /* end */* }3 n% j1 C" ~' v2 g
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
* J8 B0 u9 v7 a" m5 s0 [* W7 E, L% l /* Convert 3-dB frequency */
" Z& M* ]$ J# B$ C3 N+ }4 x /* Convert 3-dB frequency */
% ?8 g- ~4 I- @/ r. _: ~ filtfilt(save_buffer, usable_left_filtfilt);' k$ ~* U% p' l5 l- k& L
for (ixstart = 0; ixstart < 81000; ixstart++) {- N, S7 _" ^& M7 [# r3 i0 [
usable_left_filtfilt[ixstart] *= 2.0;& O2 {; _! {5 m& z* N/ k
}
% @6 X+ n* B* i/ c% Y, K1 {, B A p( C7 [9 \) B" K
/* 注意乘2,处理幅度 */
+ z. }2 J) u ` /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
! S# X& l( O1 P, x$ I* t1 C: D /* %% 行列转换 */
4 f8 J0 ^; [8 }& N! W yiDuanShuJu_mean = b_mean(usable_left_filtfilt);. I% h6 J. j w% C& d# @) T6 c
for (ixstart = 0; ixstart < 81000; ixstart++) {
5 p6 O) S4 y, G5 P2 | youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]$ w: g% B3 R2 ~: F' b3 M7 K( ]% D
- yiDuanShuJu_mean;; H+ ^7 j& k P" K* R
}5 H* d' k4 Z; K0 f. n
6 V b( {" N6 @) f% b5 t) g% z /* %% 应该对数据归一化,但是这一步放在哪比较好 */
1 H9 b- B5 b3 p0 q* M ixstart = 1;
3 }7 ?1 ?$ Q: A0 y) ? mtmp = youXiaoShuJu_QuZhiLiu[0];
1 p: j j/ Q3 k- b' J* ] if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
3 s: w1 }& X8 O' g ix = 2;
9 k5 P Y8 x9 \; k: L8 G) {$ O exitg2 = false;/ ]7 N! V4 h! C
while ((!exitg2) && (ix < 81001)) {+ q6 u& ]' J0 }9 u$ B/ I
ixstart = ix;
R' q2 P3 {! V if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {8 t6 A; f/ h i. U
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];( q- g( b0 ^9 o/ o" E" M# {# b
exitg2 = true;7 o( G. X) m3 F( G% O& i
} else {& \; W* v( }2 r' ^- E. U
ix++;
5 a V @* u' ^4 Q3 j }8 Y! n5 W. l! K& m% E
}
; R; {3 ~8 K. }: b" [5 S }
0 Z/ l' f1 U$ x& x/ y: H7 w0 d6 w G. u* S, T" W
if (ixstart < 81000) {
, E h. l D6 F- S4 m: _' P7 E while (ixstart + 1 < 81001) {
# b9 u0 V& Y6 } if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
% R. r' |4 @* ~6 ]# {* ~ mtmp = youXiaoShuJu_QuZhiLiu[ixstart];+ F- A, N' E/ W3 c
}; w- O1 }8 w- r2 O7 v4 p
# z* D/ r/ g' n7 t" }
ixstart++;2 r4 P8 P- f0 v' {
}6 c1 _/ R5 ?- g8 K4 @" {
} S% y: o$ n5 K- L. x$ m7 @
- n6 |* X0 w1 g+ y4 ? k
ixstart = 1;
8 w" V$ h* Y1 ~$ M9 p5 \; H7 P& O9 C yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
6 g' q! b( S5 k if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
+ _3 ?; i. ]7 ?' F- `/ Y4 [- y: u ix = 2;" n, W$ j( x/ B, p4 q
exitg1 = false;
4 R* h7 ~1 O- \ while ((!exitg1) && (ix < 81001)) {$ M) E7 ^9 n3 w* Z4 `4 g
ixstart = ix;! o0 Z1 |: S5 c# G
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
# `1 C8 o w0 P" l# [* \/ Y yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
) j' J K5 Y) \( B. S exitg1 = true;: W6 _: m1 M+ a
} else {, L- }9 q* d2 U1 m/ X3 x
ix++;; U' E# o/ F& q) J, S" G
}
! c. y1 s7 e- p) ]' R }
- E" F1 C8 R/ Z9 |" k }
V1 W' \4 g% G+ }/ c' z6 K' w4 e( F2 X4 C" n' J
if (ixstart < 81000) {
0 K5 t3 }" a6 B# g while (ixstart + 1 < 81001) {$ Y3 c% q% {. ~- y8 g
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
i* B5 E9 t* `, x yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];+ t2 @ u1 f3 G# s
}) i& J% v- I" @/ Z
+ s, k s1 N6 I% \& A
ixstart++;7 d& N, z: y# R: U
}# ^8 I n1 l# s; ~0 e( e
}
+ s- k: O( t& A- y$ r+ S' x0 P& e. r& l# S
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean); x7 h( T3 K4 p
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {, v) D$ }- D3 E7 d* O
yiDuanShuJu_mean = mtmp;
1 W) F( m1 _ K9 C# h }
7 Z* d' B, I( L j* m3 H: T; N3 Z" B0 I8 l3 v, `& q
/* 找出极值 */
+ n" X, \7 z9 s6 w Q for (ixstart = 0; ixstart < 81000; ixstart++) {
/ ~& p- [' A" p6 O" P8 D! v) D9 | youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;& N& n$ N3 g0 ^! j Y6 N& B N
}
0 j4 a* w: Q5 @" y8 [8 W# F# F; J5 q# z
--------------帖子字数限制------------------
5 V9 I2 ~9 m9 e" J# a1 }7 w6 G}/ _+ R- A+ z' K- R+ Z
6 |# i# O# e9 x4 m) n
, q! U$ O( W4 n" B, B& T |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|