|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 7 @ j- [; S C) M+ E1 y# Z
+ H q- D/ Y' e各位大神:
9 z9 k1 n4 g' R 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)) h# i' E, r, L$ \
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
6 Q! C4 e7 _" I4 S: W
' o" L+ z4 H1 P+ e
$ ]( u, v' n: v, U2 Y这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
( `( i% e' [5 f6 j/ E8 q( q# y$ J2 ^; \# U: d* Y2 I, L% B: Q
并没有其他线程$ i) Q: V! c( z
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
' ?( Z1 f- c; Z; |" R. U( d也说不定是和堆栈有关系。。。。。。% [+ f! m/ }: G' X v; o
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
; C# P$ c: o# ~" L9 @) k* {* n) ?7 a4 `3 k
4 u) H4 Q# _4 B, K4 j( i
2 u% W% [6 S1 ^我也很绝望啊,希望大神能帮帮忙,感激不尽,!
4 m+ @% f- G# i4 W& Z+ I$ r7 L7 h3 {# [
( Z! U ]; O4 c5 n7 c# M, \" J/ V+ u附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
9 C" k D, t5 X5 j9 t ~5 n; W& ` static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。! x& O4 U) F5 p3 l
/ \" U' U" z) V
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(# R* o$ b. Y5 d+ Q7 A# d# I/ F
const double data1000[1000]) {& G! R* c; k7 q/ D5 j
% i; m* l# e* z4 y, h; |3 J, L, D4 C
int myfuck; ]1 d. ~3 J1 X+ M9 o9 }
double yiDuanShuJu_mean;
! Z- w! C9 a, k% ^! J* S double yiDuanShuJu_LowMean[1000]; d4 s8 C K8 Y' f
int ixstart;! Q, s0 z/ E% b' S
double dv0[1000];$ y- x2 g h0 J8 x/ O
comm_AGC pAGC;' {# I* `& _* r$ Z7 i n; D& H
comm_CarrierSynchronizer pFineFreqCompensator;
# a( C) n% i$ k% B5 V- c dspcodegen_FIRDecimator pRxFilter;! D0 [+ @0 b% X- [# t. E
comm_SymbolSynchronizer pTimingRec;
3 C3 @( h4 `0 o% g. O comm_PreambleDetector pPrbDet;$ |+ j7 E! `: N1 B$ d5 b
FrameSynchronizer pFrameSync;3 D! Q% u) R% S! Q8 z
QPSKDataDecoder pDataDecod;
$ H! I4 N6 \5 t$ {# E* U- W static double usable_left_filtfilt[81000];
- ?! B ~3 ?' z+ _% p8 ~! V6 h) Y static double youXiaoShuJu_QuZhiLiu[81000];
, P! H E/ v ~0 F. @% V# |+ L double mtmp;
, g: E2 i" v$ z1 e( l R2 y int ix;
# Y! s- a: \$ J- t9 m U' q boolean_T exitg2;
. S3 R6 u3 B( N6 ` boolean_T exitg1;( ]% d" A4 O; v* N
double YiZhenShuJu[800];
u+ g5 {2 f5 @$ ~5 \ e double dv1[800];! _3 i9 M7 h" D8 R: z) E, s
. @, m5 O7 Y5 A+ ~
% x5 V! }- E H double b_YiZhenShuJu[800];
9 A, t; K% }1 @ double I_filtfilt[800];- F# S6 R# C2 n
double Q_filtfilt[800];( h& N# t: J! H$ `
creal_T b_I_filtfilt[800];
) H& u' A2 e/ l+ ~ creal_T b[800];' s( @$ P' ~2 t9 g
creal_T RCRxSignal[50];
: L* C7 b2 W, k/ R creal_T fineCompSignal[50];
/ ?2 C2 X" Y% l; D s6 q0 Z! w double phError[50];
6 ]4 d% |( {7 y, m7 [9 `+ D/ v creal_T timingRecSignal_data[28];' ?3 ?7 D$ p' V" j9 F
int timingRecSignal_size[1];; A$ E' k. T* q9 V% d' U# n
double prbIdx_data[28];1 e0 c* }9 d' C- C/ w" j. p
int prbIdx_size[1];
2 S# W- G3 x: J3 [/ S% _; s' w& c double dtMt_data[28];
5 Y# p' y# [7 O" Z, F int dtMt_size[1];; f7 f4 q2 i. g: X
creal_T symFrame[25];# g4 \. N- ~9 h) f. C( N
boolean_T isFrameValid;
1 I7 I6 ~4 z1 x; X; P: Q. y double unusedU0[3];( O7 r3 p" Q* I# G/ \$ k) W |
& c) t0 t& p% }, K. ` //调试过程中的变量1 ?8 e, J1 h6 Z' d: l) }. [; U) Z
int enough_data;$ s5 A2 z J# O1 _/ N
, B) B% [' ]4 m4 _' v. @/ ? int enoughDataFlag;
C1 I, q# \0 U3 z9 M8 ~6 \ int yiDuanShuJu_mean_int;$ X9 {% Z8 N" b: r+ g+ u% Z! R" m
int int_sum_dv0;# r% O" B. V3 a4 _
int oo;+ y3 P. p4 q( Z) G
int ii;
" H v6 U( a% s$ w( [ myfuck=10;
. @" L; k$ z& D9 E7 g' n; o; Q /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
9 r k" c8 ^ O. d5 |+ \7 N+ R2 o /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
0 _- l2 Z# T* u+ I. e1 q3 J/ k9 }! h ^. ?
yiDuanShuJu_mean = mean(data1000);
) g5 @0 e! B9 y! u) A# ]1 K' w$ ]
7 s% I7 ?! H6 c9 u4 K0 E1 X2 Q yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
$ T, v8 F, C& P4 f0 g UARTPutc('A');
1 {2 p0 a& ~$ w1 C UARTPutNum(yiDuanShuJu_mean_int);$ S" c- N# {/ I, S
UARTPutc('\r');, y6 G0 p$ W t( Z* M; A. V* }
UARTPutc('\n');3 M8 X' f. @+ D2 i: W
6 U. U- f) y9 E) ^4 s. `/ A: S) n for (ixstart = 0; ixstart < 1000; ixstart++) {, t4 G' P. u$ F' c7 R: M
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;; O8 T. s( p& h# V
}7 T" l5 E C1 [$ @" G8 m! n9 n
6 s+ u! r$ H6 [/ J8 y power(yiDuanShuJu_LowMean, dv0);
# I& t; s3 W8 O2 r& d
3 ], a- F: t5 P8 i3 q int_sum_dv0 = (int) sum(dv0);8 z$ H2 X/ H1 J; P" J" j
$ i1 G6 C4 n1 y O- d" K+ L UARTPutc('B');
0 X. X& c; D5 P" t UARTPutNum(int_sum_dv0);
% K8 Z$ v3 u& L% l UARTPutc('\r');
; b' ` e/ e5 c, J UARTPutc('\n');
( R W0 {( m2 X$ V) q$ r9 |1 t4 s& U0 O7 W7 p1 m9 u+ I0 G
// int compareFlag = int_sum_dv0 > 1.0E+8;- h8 k1 {$ K! ?, v# B& K6 V. U
: p& D6 n8 e" Y$ _- `$ p if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
' e! a$ k$ Y0 ?: N- w3 } UARTPutc('C');1 U7 m1 z! ~8 l' f5 a$ w" i5 x
/* 比较信号能量 *// F3 O& H+ V5 I
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
" h3 Z' G% l) T. y: E# ]( c5 _// yiDuanShuJu_mean = 1000.0 * youxiao_k;7 j" o7 @# x- F' r* D1 } R
// for (ixstart = 0; ixstart < 1000; ixstart++) {) ^" L) R( z2 C8 X- t0 W; w$ ]
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
' I, P# ?) D6 l: w+ m2 _// yiDuanShuJu_LowMean[ixstart];
% S0 Q8 t v4 A- z% h* }3 p// }
! |9 k; N2 g$ f3 W, e//4 w9 P' P: }7 B2 s C8 I D
// youxiao_k++;& U2 l; L6 r6 q5 _' b a; c* f
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
9 o* l- ~0 ?. B: `) f* ^0 I: n, G// /* 感觉要取21个数,即0-20, */
( Z' ^, b$ N: q; d$ J/ G// enough_data = 10;//有效是10,无效是0
1 g2 R" Y& O8 M7 S/ |// }
7 x7 t5 l! c2 V/ S8 q! u+ Z8 J }
}6 W6 L: H& I3 N
; G7 h! {1 n3 R/ E7 ]
( F3 h+ f6 T u5 ]8 R. a enoughDataFlag = 100;
" ~) B8 Z/ T. m8 a! D+ f enoughDataFlag = 1000;- L3 T# f9 }! t' b9 u5 |& l
enoughDataFlag = 0x02;, |# W7 n# l9 r5 I
enoughDataFlag = 200;
4 w9 k7 N% M* o- e1 Z
3 ?; \7 f8 S# k4 D4 [: S" P7 R int myfuvk1;
4 L( X6 e/ W) Y4 P' w8 P1 e$ p myfuvk1 =11;
?" {" r8 ? V% H) g( z. o2 z3 A m% m$ e. e, B3 ^
9 c8 g' O$ e# ]- ?, V/ m6 o
enough_data = 0;
( Q5 r5 [! ?# D+ u- Z
& s5 W- | g" e( |6 O; h! e// if(enough_data>50){
$ t6 d5 d2 h: \* Z% W* P// enoughDataFlag=0x01;
5 `; D3 n1 Y1 B$ I4 a0 x1 {7 i' I1 s// }else if(enough_data<50){% k6 ]5 W9 g, W
// enoughDataFlag=0x00;//0x00还是不行
! V( _! X' Y% E" V- ~4 M E% z// }
/ }! I3 J- v- ~" ]% |0 O$ r3 W' e' ^1 F; _3 H
) a; Z, g4 ~% S; u2 Q7 n7 O1 ? oo=10;
* u& \$ V( j0 N' |4 h: F. `, z; J oo = oo < 5;
% w2 Y( w2 j& B+ [; W if(oo){
/ N b8 |. A M% c# K$ p- W( `) T ii=0;' n% K* K$ R* m: m9 F! c9 p
}" {, W% l. m& e& C
if(oo < 5){
7 x5 n. P' l! O( i- M# } ii=0;% _5 {9 `. {8 O
}
& O3 Q8 G' x% X( K& w2 A, _ if(oo > 5){9 B$ u' j3 T- I4 s! O% j: z4 W
ii=0;& u+ g2 n9 w# w; T8 u
}0 x. v+ f6 N! |8 e9 n
( l; C/ ], W/ b7 v' R: T
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */+ u/ r, U$ l1 q' c
/* 如果数据足够才执行主程序 */
8 c: P7 i+ p3 V4 f+ ~9 m oo = oo < 5;
' J0 S4 D S; o( M* ] enoughDataFlag = enoughDataFlag < 5;7 r, L- r/ }1 o7 o9 G& k7 z5 I. Y, O
if (enoughDataFlag < 5) {
# O- w+ X9 ^4 {* u# O0 p1 Q// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0" V. s# } i4 y0 L
AGC_AGC(&pAGC);
8 x/ [2 M9 t: K' m0 w' t- M! U: a+ L/ z2 j u7 d( f$ o
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);' G7 P. x5 {2 g2 f
FIRDecimator_FIRDecimator(&pRxFilter);
6 u, m& r/ O4 p2 J, b) a* n9 B: D0 ^+ n& g2 P0 e0 k0 u7 O
/* Downsampling */
- g/ |4 v! d0 ~4 D c_SymbolSynchronizer_SymbolSync(&pTimingRec);
4 q, r8 d# x5 }. v- B7 Z ~/ J* d, C4 t3 l" |9 U1 j3 X3 `
c_PreambleDetector_PreambleDete(&pPrbDet);, a0 V7 n3 Q: y) p/ `
% T: s4 M" s; _6 M3 f' T- n5 ` /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
" B% H. V9 f8 x0 e3 o' p /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
4 o8 N- Y' n6 y+ x: D3 t( ` /* %帧数量=100 */
) h P5 c7 ?4 H8 {: I pFrameSync.isInitialized = 0;1 Q2 G0 e% v. n+ |- u. N: |+ I
; {8 s" i! q' a
/* [EOF] */! G6 H3 \- n! }+ \4 K2 W
/* 前导码长度是13 */" t. ]; E: Q3 Z9 \
/* %qpsk *// F7 m5 Z& F& e$ b4 w8 ~( ]
pDataDecod.isInitialized = 0;7 w9 [+ X+ Y# l- o* d$ b
! F- Y! `0 S0 Z
/* end */2 n. c" z3 z/ e9 V% p1 ]( Q3 R5 Z
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
/ I- W: T+ Q$ x; ~0 u, x /* Convert 3-dB frequency */- {6 Q+ I4 P6 u( z+ c: F; {
/* Convert 3-dB frequency */
" s+ r3 B% \! N: o* {- z! |7 N/ j3 x1 P filtfilt(save_buffer, usable_left_filtfilt);
) F E3 a! L9 [! j for (ixstart = 0; ixstart < 81000; ixstart++) {3 ^$ X% S- J, e. z& p0 @; N- H; b
usable_left_filtfilt[ixstart] *= 2.0;4 S! Y0 P. e3 O$ g
}
/ B# S' m4 b, G4 o
! r+ K8 J0 Y3 G /* 注意乘2,处理幅度 */ F9 M( A* r* F6 @, A. q/ o
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
7 Z9 ]* k+ J, }7 u/ U' Y /* %% 行列转换 */, q/ b+ B& |! j2 ~ ^/ ]" H
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);; R! e0 T, A g! z4 s" {; \% J
for (ixstart = 0; ixstart < 81000; ixstart++) {
% J8 T7 N! I# u" H youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]* I6 |6 u9 Z. a5 ]
- yiDuanShuJu_mean;/ R8 p" z+ v9 K3 G
}+ U; ?% h( S3 ?/ h; t; n
: U( d/ f+ _: P( m /* %% 应该对数据归一化,但是这一步放在哪比较好 */0 d4 D* s9 U( ]8 m3 f+ @
ixstart = 1;
4 q6 O6 M" x/ M7 n u% v4 n5 U mtmp = youXiaoShuJu_QuZhiLiu[0];. |- D( _8 r3 C2 {" b2 ~
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
1 J; d- D8 c" k6 M. t* X ix = 2;
# h! m0 b: p( ] exitg2 = false;0 y" q! N! j5 G+ b0 J2 [/ K' x
while ((!exitg2) && (ix < 81001)) {3 A2 x0 n& |$ c- c, w
ixstart = ix;: P- g8 @" b1 B6 c6 z R
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
7 B/ _$ Y' I8 y mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];' t% g- h! `5 o
exitg2 = true;3 J6 z% `7 W" c* d% |, R. e6 C8 X
} else {
/ A( z B& o8 ?2 E+ ` ix++;9 U3 \8 V2 | x: M7 J
}/ P* Y3 k- s e1 d9 W
}
( b4 j6 l7 D4 V }7 L: i- @3 d+ p$ L; z
% w9 U7 x* [* _, c if (ixstart < 81000) {
( O5 i+ U. z0 ?% a while (ixstart + 1 < 81001) {) `4 q/ G- v$ ]7 D9 x i5 Z$ V
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {9 K. p* b+ h$ }5 r* g- T* q4 f
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
$ ~$ {9 E4 ^8 H }
, ~% x, w- ~, u* C$ f6 ^2 P8 v
ixstart++;
% B& l; e# A& v }
. R4 E. C8 z+ C( Z2 V$ Z }
) X! G0 F$ B+ {9 J* z/ b4 j' R. n; f
ixstart = 1;' X" U0 [ l2 B* Y! e
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
- M- b' z5 _& I: K if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {# s5 g- |" H/ Z U i l' B
ix = 2;% y4 Q$ W/ i1 ]# @4 y% R
exitg1 = false;* T; j' m4 L% X% m+ e9 U
while ((!exitg1) && (ix < 81001)) {$ y( ^/ X) b6 r7 m$ u' `( u3 v4 c! k
ixstart = ix;7 C7 o, b; c+ \, `( z
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {, i# I: ]$ N7 ?: j
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];7 t0 y/ k! Z+ `5 V
exitg1 = true;2 _, V$ \2 W5 C3 t c8 y" Y E
} else {2 Q& Q+ d4 y& o# I5 U0 X7 o# {5 ?
ix++;7 Q; N% H: |* b1 d
}
7 z6 E( d3 K5 W c# n. I0 F+ r }
- a# u# ~7 G& a2 S! y! c }
5 m8 t- b0 O0 ~0 H F* s% B& o* B- |% A$ N4 X0 s4 ]( L6 Q
if (ixstart < 81000) {
# l/ p* T1 Q" J# I! S while (ixstart + 1 < 81001) {- D7 j$ |# O) G/ Z
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
3 Q* c& g. q3 I/ @9 ^! U yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];1 I/ A) T( Y- I
}6 S( f0 O3 p1 j9 m7 O
) Z/ W f$ H3 D. C/ p; ?" I
ixstart++;
- g# j& i" ?6 g! e9 d }. C1 O* }: H& e# L- ^! ]
}5 j* c8 w4 r' d3 v0 G. e1 n( I9 W
" N/ l$ Y4 K! u, L yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);3 o6 W7 H& z1 g0 D# }$ @4 h( `- ]
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
% i' b: ?" @) k9 z6 r$ e. G yiDuanShuJu_mean = mtmp;4 \. i- Q1 P0 |+ `& \
}
! W) V0 {! R: _2 F7 T
, B8 X0 d, h( w& v k" v /* 找出极值 */
' F0 n" V- y0 y, h for (ixstart = 0; ixstart < 81000; ixstart++) {
# n" O1 a- }! l1 x K youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;" T# |* \: T; v" ^' o8 {
}1 [2 M5 e6 W7 V
: A* a4 j$ g" y9 F0 S
--------------帖子字数限制------------------
% C8 j# n4 \8 v}
' D2 @! H! ~5 ~; H/ }) {# P
3 A" }) ]/ N- W3 T; f; W4 y1 J" t. l! s, a7 d4 \+ W* z4 F. B
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|