|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 ! h( [9 ?/ s5 z5 k6 e8 m' v
0 n6 i3 B2 D1 N# v4 K2 d各位大神:
9 E6 W+ ?' H' `* k 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)& K j& ~. _5 ^
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
& x& r; N% Q) r) D& U+ e
3 _2 K1 i% G U! E6 o
0 V8 e" b7 q" J1 o8 k0 a这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。' f, i" i7 N; X; p0 X3 ^
0 A7 q; I1 N) a并没有其他线程
( v. `* B0 V/ o6 b$ _反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。8 o" a' X+ _1 p" H: ~
也说不定是和堆栈有关系。。。。。。9 _. H& N/ _# I3 ~# B5 _% s4 a
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....) P/ L& K( ~9 u/ J" y
! x8 e; [: K! f8 z
# X/ G7 a$ \6 ?' }7 a* v
; K- L, S3 f, p: T, C3 a0 F我也很绝望啊,希望大神能帮帮忙,感激不尽,!
; T) ^1 b4 f9 `: D# I
$ o% C' B& ^9 b1 e9 z) y/ l9 ~$ W5 K ?
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
0 _! F5 z6 d# {. ?- R6 H# D( T j static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
& K; h# w. z+ J3 D7 v6 v" ^3 [
0 Z( h. a, C3 u2 B9 dboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
. {% \6 ~; b% Z6 W const double data1000[1000]) {
- M" ^3 o! S: T' V7 L: C* h. n( i. u6 L/ U: `% h# W. k
int myfuck;: _$ C1 G# B& r8 I0 t- Z) o/ H
double yiDuanShuJu_mean;
- i* H/ q2 X& V; |1 L& L/ _ double yiDuanShuJu_LowMean[1000];8 h- u' m6 B6 ?/ i# ~* k
int ixstart;) K( M9 \2 |+ M! x" t; `
double dv0[1000];6 h5 I" P% }) S7 @7 Q2 ?/ ^
comm_AGC pAGC;. S; {6 K5 O% |4 M
comm_CarrierSynchronizer pFineFreqCompensator;
* g+ K8 W$ E4 q A dspcodegen_FIRDecimator pRxFilter;" o. N3 j: A3 z+ \" ?4 i
comm_SymbolSynchronizer pTimingRec;
5 V+ {6 U# j! p" j8 l( w: \5 K9 p comm_PreambleDetector pPrbDet;
, `3 ^8 n T% }1 ~% `$ K0 t FrameSynchronizer pFrameSync;
: C: U2 t6 C+ e* i* ~ QPSKDataDecoder pDataDecod;
' ]4 k w- m* T. a. Q4 } static double usable_left_filtfilt[81000];
6 f) W' z3 Q: ]" ~ static double youXiaoShuJu_QuZhiLiu[81000];" i5 v# e2 Q# a8 Y' w# B( ~5 Q" T
double mtmp;
' N y' M5 h* B2 o int ix;7 J5 A8 i% F9 o
boolean_T exitg2;/ @* z0 Q: O5 o: T7 p% r8 {
boolean_T exitg1;
1 ?: Z8 B9 T4 u9 e2 g" U& m double YiZhenShuJu[800];
k5 R; w1 S; f- U- K8 x double dv1[800]; R$ t" e9 K( _2 `# h; H
6 t [& B( L5 t; E3 ^
- M5 `- L# H! _
double b_YiZhenShuJu[800];! C$ S+ {2 G' ?! ^& e0 \
double I_filtfilt[800];
, X4 P, G* X) c; Z double Q_filtfilt[800];
/ s- I/ `& @1 F- W# Y1 l9 C creal_T b_I_filtfilt[800];
$ h/ s: j/ n1 @ ?: t creal_T b[800];
+ n" s/ \1 [' h* J) e+ F( L creal_T RCRxSignal[50];/ y# @9 T3 p1 d9 T4 P% n% S
creal_T fineCompSignal[50];
% f: R9 I# j. ^1 C, J$ f double phError[50];
2 x$ k% J; z9 N4 L, u1 I# v# L creal_T timingRecSignal_data[28];
) E9 K' y5 s" G7 o. y. {/ P int timingRecSignal_size[1];; d' P) s& R/ e
double prbIdx_data[28];
* Z4 C+ n, h# I# a a1 V! X int prbIdx_size[1];
: i4 i! t! [$ [# B& A double dtMt_data[28];. R. Y b: u9 h1 N* k
int dtMt_size[1];
- m7 H1 \ }$ R& k0 C creal_T symFrame[25];
- W+ R' @3 E3 W) B! f boolean_T isFrameValid;
" \: N8 r7 s' f" h double unusedU0[3];- Q/ |) Y" N% I5 u5 [
6 j( I' a' C5 [$ {& i5 h" z //调试过程中的变量% h( i, E' n! Y5 S) D0 U: }* e
int enough_data;
: \; b" O( \, N) K
+ \2 M* n- ~4 \) t8 G/ Z H# M int enoughDataFlag;
3 I$ D; E3 q7 j. \" V: V int yiDuanShuJu_mean_int;% F& P% x( G0 S0 |/ W! R$ T7 ]
int int_sum_dv0;. C: w; l; K$ f- i
int oo;5 \2 ?- K9 M! K3 |: o' Q. `
int ii;
6 J" H& z: ?2 {: G$ a myfuck=10;+ g7 U" j1 [, o; K7 v
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */4 X' k/ G$ ^ J% K( {
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
9 p$ c) S1 J7 U: w# y. D _4 t) h# ?" P d! I
yiDuanShuJu_mean = mean(data1000);1 B$ J. }! v) g! ]0 A
0 U; L* U; k8 h2 H7 s/ P yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
/ a: b4 k/ k: F- ?' ?( a8 B UARTPutc('A');; v$ A; e: ~6 G0 ]9 q& W- A. V
UARTPutNum(yiDuanShuJu_mean_int);
k' g% ^' [ H% s* V UARTPutc('\r');% w& C: D, x$ O% `" i" p) R
UARTPutc('\n');
3 V5 w+ p4 A& U+ o6 J1 I' P4 Q! z. T l
for (ixstart = 0; ixstart < 1000; ixstart++) {
& Y- v4 A4 ]/ k: P$ a, L; b yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;6 g& b' t3 C7 y0 a
}
! g) ~5 |1 f5 j1 E+ R
5 z2 i8 X; z/ v: v power(yiDuanShuJu_LowMean, dv0);) Y- W4 W4 J0 q& B" s$ M
" w0 D4 Z5 @& z7 U- E3 I1 o; s int_sum_dv0 = (int) sum(dv0);
* n' {- e+ T0 G4 [6 g: j) I0 T( C( d" y/ a6 e4 S
UARTPutc('B');$ H7 y( t( r. c/ F0 V! K
UARTPutNum(int_sum_dv0);
7 A" W( M7 ?* _; S UARTPutc('\r');
2 T- Z, a; I+ G- G UARTPutc('\n');7 I# S' \8 X; C: K H
. R- v) i; u: \4 e1 ~) Q1 e
// int compareFlag = int_sum_dv0 > 1.0E+8;: M. J. y% \( [! S0 j$ ^" k0 k
! V2 s3 m0 u% G, `, r3 }, V) ~ if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?' j8 _( Z2 _# q, m+ B7 \
UARTPutc('C');9 U! q) {7 a: M
/* 比较信号能量 */3 `$ u% M6 e9 J: @8 \) n" f
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 *// f6 [, Y5 A& q7 }8 z1 S! D& P5 y
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
& C- l$ M5 U8 n& t. [// for (ixstart = 0; ixstart < 1000; ixstart++) {6 J% W0 |" K+ I3 b3 W% J$ o1 v
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
8 }# _; |& |9 D& | [4 M' N- G// yiDuanShuJu_LowMean[ixstart];2 E, L! A% Z" x7 ^! E
// }
6 T0 B' V$ Q [5 X//
' B$ t& {: w- m' P) H// youxiao_k++;+ c( N' A7 [" c
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
1 o- |) n# V/ o2 B& _// /* 感觉要取21个数,即0-20, */
& s# D2 ?4 }- U# i" J8 T6 P// enough_data = 10;//有效是10,无效是0
( B4 Y2 ~5 \& y3 K: W; t" K5 d3 f// }
" G1 _3 ^2 y; m6 D# y0 }1 \ }
% h8 J# ^1 }4 a
* a# k6 a' J9 x$ c5 z( S5 t6 V
* b8 l+ C# t; G8 R, @ enoughDataFlag = 100;7 `3 B5 x7 A1 Y# Y3 Q( Q$ I
enoughDataFlag = 1000;
* `, D1 r/ D6 @: X4 P6 ` enoughDataFlag = 0x02;" L1 \) I* ~. U
enoughDataFlag = 200;9 a1 T6 H7 e, {; R
( P& a! [8 v( ^+ c0 N8 S
int myfuvk1;+ D# e) P* i$ R u- J' h
myfuvk1 =11;0 E$ u" u# C# J' r1 h' B
I/ f: E" m2 U% O. w+ c5 a& r7 p- s u' o+ D8 I- ~
enough_data = 0;. M) a/ |. z1 E [+ E9 z h
$ {6 B8 u4 N2 Q// if(enough_data>50){8 u; X# }7 A7 ?
// enoughDataFlag=0x01;
( G! c! @7 Q: @1 F// }else if(enough_data<50){
7 D$ G. M. t* M$ y) w5 X+ h// enoughDataFlag=0x00;//0x00还是不行
/ B* N9 B* G1 T: i8 S% e// }
! j$ H! o9 u$ u8 P* D3 W, q
0 P. g% w, p; a% h' @* r3 L J) Q4 |5 X4 _
oo=10;
! E% H; p6 ~7 a! I' g# J0 m oo = oo < 5;
1 Z# J" c2 T# f7 X if(oo){
) W, `, D& M- P+ u* V: n0 u ii=0;3 x5 h6 e" } c) o9 M
}
) A n2 Z- K+ a/ V8 O* a if(oo < 5){7 k& N5 I9 @( i
ii=0;
# N ^! Y$ T+ H }1 N0 o8 u- c7 a6 I2 U
if(oo > 5){
0 j& o! J6 D! H) `# ` ii=0;
9 s8 @6 @3 l( U: b4 y9 K }
/ c# O9 z0 h& [4 H1 ~+ Q6 n6 A' D0 h
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */5 ^- {+ z" R: q% ]
/* 如果数据足够才执行主程序 */& Y3 A" @4 p3 Z: [
oo = oo < 5;3 R; a$ ^' q6 ^
enoughDataFlag = enoughDataFlag < 5;! f9 e% b% _ \
if (enoughDataFlag < 5) {' X0 M! Y: [* m! E) G' o, R! ^
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
" U) H: G/ a* }2 X) m AGC_AGC(&pAGC);
# L. C! ]: D* D6 X
. e1 T: D2 S+ Z7 i' P+ z c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);8 U. T: ]8 T* v# r2 |& W
FIRDecimator_FIRDecimator(&pRxFilter);
# W/ P8 @: I, t& D, L5 d# h& `6 A) Y9 \, \$ y0 Y3 M
/* Downsampling */2 k* {& K* R4 ^0 l1 c
c_SymbolSynchronizer_SymbolSync(&pTimingRec);4 ]; X2 j4 B5 a' L" y
% M* d2 P" Q. g; Z c_PreambleDetector_PreambleDete(&pPrbDet);# D+ ]4 w" g6 F1 S! X, |' d5 P
3 h; G8 d* l' j/ d
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
1 ^' M8 V4 L3 r( g8 Q* P& P J /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
) l- }; o$ C. v) u: Y- n. ~ h /* %帧数量=100 */
% ~0 x2 r' q: x3 |: ~5 U pFrameSync.isInitialized = 0;' ^& V- t& N* f- C6 a8 y1 k
1 v, x& M) ]/ k: U
/* [EOF] */$ @7 e" \" ~' `3 C9 N
/* 前导码长度是13 */1 ^/ c, Y+ c) E. m
/* %qpsk */9 }- `# S& k C5 F7 @0 ~) o5 l
pDataDecod.isInitialized = 0;3 t. i. d i. u$ c9 z
7 o8 D2 K# O# v& N) D: ]# @
/* end */% Y+ z( T% u4 ~1 g @- Q* P
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
" m. o! C& z# S* r) {( t3 E /* Convert 3-dB frequency */0 Q) b T0 H7 Y1 C# M
/* Convert 3-dB frequency */) N+ T; c) Z' n& x2 c, o. [
filtfilt(save_buffer, usable_left_filtfilt);* c/ u# b, P$ c# {- c
for (ixstart = 0; ixstart < 81000; ixstart++) {
9 N) J8 H( L: l8 v& @* P usable_left_filtfilt[ixstart] *= 2.0;
' o0 F1 `4 k7 \0 Z4 r }( Z$ |2 k$ F# w- t0 q* B9 j
8 m- L' j& L2 C1 m9 L% U
/* 注意乘2,处理幅度 */
9 d/ w; C' ^' y; @9 ?" p /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
0 Z6 q5 h7 B4 [4 L' r' ~- z" J /* %% 行列转换 */
3 i T5 @$ s K- Y yiDuanShuJu_mean = b_mean(usable_left_filtfilt);1 `. U \- F. z7 R$ r. `, D$ v
for (ixstart = 0; ixstart < 81000; ixstart++) {5 Q! p1 I% r J% k% z7 P
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart], ~9 o* T" y+ _ C" J5 ]- M
- yiDuanShuJu_mean;) ?1 w) B7 @( z; F. c+ @4 D
}
2 Q" G; d! u. P/ y$ @/ r& `" F6 U# K" f
/* %% 应该对数据归一化,但是这一步放在哪比较好 */% a/ h3 s3 { [. m
ixstart = 1;6 |4 W/ \. l6 x/ n ?
mtmp = youXiaoShuJu_QuZhiLiu[0];5 U% Z9 I- [) e
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
% s8 J* d# g4 _* H ix = 2;
r# g0 T5 q0 Y* p exitg2 = false;+ x/ k5 h7 H( t! H
while ((!exitg2) && (ix < 81001)) {
# O2 f6 X! \$ ?7 r+ L0 V) S- v ixstart = ix;
% T% D$ ^: g' ?. B4 ^" d* d if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {6 o& i5 n5 `& F3 ?4 f0 c
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];3 F, j: |( x( ?6 ^1 s
exitg2 = true;
8 t& K9 M, V9 a$ D& E } else {8 d6 l: O9 y8 e9 z( `3 a" H$ f
ix++;7 L+ U1 t% N: X3 M
} h9 l$ A) I2 ?( x# Q
}
f% X4 ?: Y) [$ z }8 Z& W% M" S% W" B4 i
! S; `+ K9 s7 ` if (ixstart < 81000) {
4 o: p: h+ S4 S) i while (ixstart + 1 < 81001) {
/ t7 X6 h" }+ i+ y, @6 q4 s if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {7 k9 [+ O5 U( O2 ?2 X' F
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
, u" i6 a8 | \* k0 G& e `' z: P/ m }* `: Q2 R9 F5 ~ x
% ~. z- H* W& c5 @. ^, ]& \) l* F6 n ixstart++;
- C" O' ]( r/ W+ L5 ^3 x# S( o }+ G8 S1 P' Q2 T& o* T! r
}
' G3 ]- }4 A/ n
' [6 {( P d0 A) R+ j4 | ixstart = 1;% [1 [4 o, A; E
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
0 t" o8 o4 _4 ]! z/ Z if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {+ b g* u) T! R" I( l' o
ix = 2;* x. Q& ]$ I9 ~$ i8 L5 ]7 S
exitg1 = false;
5 ~1 d8 g7 Z7 K! p3 Z while ((!exitg1) && (ix < 81001)) {& \& M' \- q; P% m( G4 ]! @0 a
ixstart = ix;
8 q1 w5 c5 G, Z! S if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {: u* m+ }5 y9 D! I8 h! W
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];0 }% J s' d! S. }' P) S
exitg1 = true;3 w% W" R% x9 ^
} else {
' K7 e( v4 ?& y. G7 C ix++;, w' c9 }. N3 V# k, i
}
6 C) t% S6 B" i }$ [6 h" C8 P2 x' ], c+ q
}
% W) e1 Z- Q" E' [' U3 m h# n n: O* u* h: p: T; ?* j
if (ixstart < 81000) {
~9 i* q3 }: x3 ^ while (ixstart + 1 < 81001) {; c( t( P; X2 D
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
; m% w! x+ h7 l; J yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];. i5 _8 V- X, `5 v" r* ]
}/ V! H& g' I9 [4 h6 y4 l, ^" w/ ?" q
+ O7 d* t( b- x9 x- o3 w
ixstart++;; n4 w1 b6 L5 d6 \$ f0 P0 Z; B
}
6 o$ d7 i% N& ` H3 M( b }- s' U0 r( B# {
* n u7 s' C: W
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
. r& D- P/ l. @! z) s9 X if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {: L% n0 v9 z/ p9 j5 t
yiDuanShuJu_mean = mtmp;) c& y# D* R4 i" _2 @( i/ L
}
- k9 b; m: b9 D0 ]! k7 @- W) s. c! | D* @2 O4 M& x
/* 找出极值 */
( ~& E( {& H+ H3 L# L/ m3 S for (ixstart = 0; ixstart < 81000; ixstart++) {
6 Q% J+ N/ D( E youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
; ~- E! S$ f( ~1 a6 ]. a4 j: R# A! V }
c# X7 }7 m8 ]8 Y
) X- s/ `2 h; s* p) w --------------帖子字数限制------------------
5 U3 k- h6 Q% z; q}' W, M, Q6 K# B( L/ ]
( W3 j4 L, S9 D2 n; K
% M1 v1 o0 e8 v5 p. d
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|