|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 , {2 o- T4 E5 T2 g4 b
. k3 c) U; C0 W2 s( k1 X0 u, P- R
各位大神:
0 w8 E1 J. N- d3 g 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
: f* l6 U V6 x! m 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
, u) W1 @! r# C7 G/ l
0 y8 V0 l+ i* G$ X ! R, P9 Z9 ~4 N/ K: W' F: l
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
8 A. X6 ~, c' [0 ^' B1 v& a" z# y' k$ u6 u0 Y% q
并没有其他线程$ R+ J v# g \% s. |3 F8 I
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
- k$ Z- A; o) I: L$ `也说不定是和堆栈有关系。。。。。。
' m w* B! E+ P. M! n) H% O请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
# O8 p1 J# k! q: P( D# |$ }* J9 y6 ^: v% C- f) E( [3 p0 ^
2 h0 ]* b. C- r8 r' j3 y# s l8 C; ]: E& v/ {
我也很绝望啊,希望大神能帮帮忙,感激不尽,!' d1 w, M4 I" T
! t- S* G8 W3 S7 e+ ~( R- @9 X
+ O* m) l+ J7 c \& ?$ ?& N
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];5 A. I1 K ^0 \1 V& e6 Z
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。6 i, s u0 o* `! b( M/ \
. ]" ]8 s0 e. g F$ ?( ~: yboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(+ |, X; I# \( j: ~% }$ w# T4 F
const double data1000[1000]) {
& u% Q( y+ u1 j) A* {5 ?) U: G, v9 t/ ?
int myfuck; d+ x( }0 _% f; m
double yiDuanShuJu_mean;
: x; R/ @, S. {0 v; n double yiDuanShuJu_LowMean[1000];3 A1 s' @0 m# N: @( n
int ixstart;, |2 }) C1 K. z, h) D+ n
double dv0[1000];
( e6 @* `* h; }# w comm_AGC pAGC;
9 ^9 F( L: s7 n. E comm_CarrierSynchronizer pFineFreqCompensator;
1 q6 D+ G* C) j F" _ dspcodegen_FIRDecimator pRxFilter;6 j% f+ H% q( b A) @3 l
comm_SymbolSynchronizer pTimingRec;0 O$ Y7 |: Q! o
comm_PreambleDetector pPrbDet;1 j3 y/ B& S; ? b1 @/ x2 t- E
FrameSynchronizer pFrameSync;
- j7 |7 x8 N- Q QPSKDataDecoder pDataDecod;6 P& J" W" s1 l K
static double usable_left_filtfilt[81000];6 W' [. n7 j1 ]1 n8 H* i% O+ Y
static double youXiaoShuJu_QuZhiLiu[81000];
7 c; u/ l% u, J# m$ d double mtmp;
- b( j0 e0 ]+ M! b& I3 e1 n int ix;
3 x1 T2 R5 R! d! R- ?- `$ o( e9 m ] boolean_T exitg2;
L; H7 b& N% ^- I2 m boolean_T exitg1;- [8 Z" w" g& ?, x5 i' E& x
double YiZhenShuJu[800];' L y8 `8 ]( N* D* u+ s
double dv1[800];3 x, h1 F! Q7 }- Y o
* S- w0 P+ F. s8 M1 b
3 A' V5 R2 K* L V' O9 ], B. m
double b_YiZhenShuJu[800];' n6 u4 N1 ]; p% M3 ?1 _' A
double I_filtfilt[800];0 c* M$ p& u1 ~
double Q_filtfilt[800];
+ w& ~- M, d, F _8 \ creal_T b_I_filtfilt[800];
3 P9 @& P; M3 _( c M creal_T b[800];! e9 V* P# @! b
creal_T RCRxSignal[50];
- H* H+ z* d1 l- R* Z creal_T fineCompSignal[50];. s# W3 s# `, j9 I" r7 K
double phError[50];2 Q4 k, o( C; R, [. K( D' M
creal_T timingRecSignal_data[28];
; C5 u# t& l& ^3 O/ s" @7 l1 ? int timingRecSignal_size[1];% k% I& I! e: t# P, C
double prbIdx_data[28];
) C# e6 r# l& y4 Y; n int prbIdx_size[1];% a! s7 p# W( b5 n6 [! M
double dtMt_data[28];
X E/ u/ y3 f5 G6 h# | V int dtMt_size[1];
: I* b; I7 [0 F. z. S/ Q) ?# t creal_T symFrame[25];" ]% m+ Z& a7 X
boolean_T isFrameValid;. K4 y+ X1 L5 T. U1 W: D `
double unusedU0[3];
6 e& M1 l2 a. B/ ?9 f' n$ r, d& w# j) t, m7 J
//调试过程中的变量
5 r/ l: i+ R$ |# f int enough_data;( ^( r% B+ R% c0 V
) P2 d: E! u! [; ^% m+ X) I) d" _ int enoughDataFlag;
5 @8 r9 c$ p( p5 q* |9 g5 t4 Q int yiDuanShuJu_mean_int;/ ^6 d4 S+ F9 r( r3 ^
int int_sum_dv0;1 U% K2 l) d; [/ R9 L
int oo;2 V6 x( _4 z! |8 E5 L( d
int ii;* x# R1 z0 m# g% z7 H- ~
myfuck=10;1 v6 Q9 M/ o. N$ ~* v' {8 ?7 k9 k
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
]( j( d& {+ M3 ~ /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */4 _5 w+ S1 q4 p
! A6 T1 T' ?0 R
yiDuanShuJu_mean = mean(data1000);
0 a7 T5 }: n. [! I( z3 f4 j+ d5 x6 Z* ]! r \0 D" t+ U( _
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;, x# G9 B# T' ^. B: @3 B. h
UARTPutc('A');6 \3 f5 a/ S8 i7 B1 q
UARTPutNum(yiDuanShuJu_mean_int);
: A7 o3 Y& D V# d3 _ UARTPutc('\r');
% u) b: m3 X G2 F1 `$ ]* R UARTPutc('\n');9 E d/ O: l Z a0 Q) `4 ]
[0 l! g5 s/ V5 c0 x) R3 v for (ixstart = 0; ixstart < 1000; ixstart++) {0 A) N9 { A2 Q. Q" a
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;: ~5 D* k" P1 t w% e* b S7 F
}8 p" R& e5 I; s8 D7 O( C
8 N" f" U3 ^* T3 d9 C
power(yiDuanShuJu_LowMean, dv0);
0 c' N& w X. M+ b# s: u. {( P: g9 b, f; N; `* H) d/ H; r! B
int_sum_dv0 = (int) sum(dv0);
S! r: g" B4 w; v$ S, `! N
; T1 X' N; j' I- }% P UARTPutc('B');: U: h0 x% o" D- y0 n$ F
UARTPutNum(int_sum_dv0);+ a$ p. d; N h- n- y) A7 y/ v
UARTPutc('\r');
" u0 A9 H2 z3 P j& \- @ UARTPutc('\n');
/ W1 k+ }1 o4 a
9 s3 \, N, H" x+ q0 Z// int compareFlag = int_sum_dv0 > 1.0E+8;
( Y, t9 M6 L0 @! R
l' `, q; n1 s/ w \6 i4 ] if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?0 g/ V: `* p/ E$ [2 s
UARTPutc('C');& c, o8 s: {' C& i
/* 比较信号能量 */
* C: Y- m! J. y8 `; W# U; s" w+ k& A4 h /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
& t. T5 C1 B% X' ?// yiDuanShuJu_mean = 1000.0 * youxiao_k;: i1 o+ j* x6 J( z0 |
// for (ixstart = 0; ixstart < 1000; ixstart++) {) ?6 P& V7 k0 G- s$ w
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
7 A' J. T% V p& A( q; ]: ?' f. Y// yiDuanShuJu_LowMean[ixstart];% l8 {/ T# i4 \
// }# c, _& B$ r; S$ Y) ]2 M% h
//8 ~, v- Q0 u- ^/ S. n4 [' i2 Q
// youxiao_k++;
5 J* q+ f; S. C4 @# ?// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==8 B; W" }, G I: W* v
// /* 感觉要取21个数,即0-20, */" ^0 N% H7 D4 N( {$ e
// enough_data = 10;//有效是10,无效是05 p: J. }7 g, @( Q5 @# l: O
// }
$ q2 ^; ^5 ?7 b( ?( _ }, d% z8 v& R5 m# G9 h" m
- q( ^6 J( s U$ W9 J9 Y! R% J
6 ~+ z6 |, h) U+ N2 u7 s7 H enoughDataFlag = 100;' `6 P8 ~% F# z" A
enoughDataFlag = 1000;
+ m3 F3 s, h& R6 ?' s enoughDataFlag = 0x02;
0 s; `7 W% S* W. o enoughDataFlag = 200;
# N" [6 i5 y, U2 T& ~% [8 @9 G' f) ?8 E5 I( z: o7 ~# u- m
int myfuvk1;7 S6 r0 O3 i( `3 j* c
myfuvk1 =11;3 j5 p/ A% | l/ H6 F4 W8 |
& J& v; I2 O9 p; B% W+ W
. c6 m2 J- w* ^, k5 J& W enough_data = 0;2 q. k2 H4 \9 l7 e. n
( O$ b) ~. A% u8 T7 \% F/ d
// if(enough_data>50){
3 @; s' g' a% J, }# n- `, m, I// enoughDataFlag=0x01;+ ?9 v j% k% m- l) M) ?3 j; r
// }else if(enough_data<50){" l" }1 \+ x5 s- _8 Z8 I
// enoughDataFlag=0x00;//0x00还是不行
) P5 P5 e; K6 n9 _$ F4 q4 d- K// }
# n3 H$ t2 ?" `. j8 t" W& a' p; a/ [% O2 K) Q( Z
% g0 u5 F$ C+ y9 [; X
oo=10;
2 a/ {8 J) @2 V* O4 z oo = oo < 5;
! @4 o1 L+ h0 J/ w' } if(oo){* @9 L$ j2 S) N
ii=0;- L1 M: ~4 Y, r6 W( Y2 \! k( c' G
}
3 P) y0 `4 K0 K5 z0 } if(oo < 5){4 b) O0 R$ R/ W( m, y
ii=0;, S3 s& w$ b; K O( ?% t
}
6 w- Y9 i, a: ]7 g1 u+ ] if(oo > 5){$ K5 Z/ ]; W- b. c# q2 D
ii=0;
" x# S |3 [5 i7 C, _. x! L7 I }/ k1 S% d5 J6 u2 |: P/ k+ K7 x3 B
5 E3 k% @1 d O' W E2 g
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */0 a, H7 E q% b- @) z- G
/* 如果数据足够才执行主程序 */$ P% n& Y8 t J7 K3 H: P7 W
oo = oo < 5;
6 q* U M9 ?9 g8 R2 h5 C1 Z2 C enoughDataFlag = enoughDataFlag < 5;8 C9 r% b3 Q4 n g- n
if (enoughDataFlag < 5) {
) W( U) g" _. r- M: d) K// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0' m3 Z p& C4 Y% f% c% ^
AGC_AGC(&pAGC); s2 t* H8 `$ r
0 J% a0 `" M. T$ q; X
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
5 y8 I! n- ?' n8 q6 S3 U FIRDecimator_FIRDecimator(&pRxFilter);
4 h6 \6 D- v- ?1 ]2 F8 `+ {, ?5 a- f8 {4 M' G$ R" `8 s3 @
/* Downsampling */6 l; @7 Q2 ~* O
c_SymbolSynchronizer_SymbolSync(&pTimingRec);1 P, h4 s0 q; o% K1 Y0 m c
5 F) f" g, @* r6 ] q, @4 h5 T( T c_PreambleDetector_PreambleDete(&pPrbDet);
7 _1 {8 K2 |% K7 x7 T
9 Q" @2 s) g$ S3 t |4 f$ L /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */& M! y7 |0 f c) i
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
6 M5 K! a( [" q( s% | V4 ^+ H /* %帧数量=100 */1 F# C2 @, a$ k7 U# f+ t1 R! |8 G/ q
pFrameSync.isInitialized = 0;; s9 I3 N3 |. b8 N
a* v4 K; v' o/ X2 N
/* [EOF] */
1 a1 B* T* ?. @" n /* 前导码长度是13 */
, C# E" _% f* {0 W) p' r /* %qpsk */" C4 B3 `" [/ _2 ^) P h/ w! C( \
pDataDecod.isInitialized = 0;# R4 y1 G0 P0 k d, \# o
, H% j& e1 U; D /* end */
8 P S& C4 p) X5 q: ? /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */; x! ]! c$ A7 S8 p
/* Convert 3-dB frequency */* C# x& M+ F, F* k4 g6 N# Z
/* Convert 3-dB frequency */0 P; n9 _) _9 d
filtfilt(save_buffer, usable_left_filtfilt);2 y- v) [* i! ~2 b: E
for (ixstart = 0; ixstart < 81000; ixstart++) {
* ]: i3 n( u" A0 ^8 U1 K usable_left_filtfilt[ixstart] *= 2.0;2 P O7 V% E" E4 n' S' `
}
4 R: _1 n6 w2 ~; P$ ]
9 H) p) e0 C' q) l# Q: ?4 A! \, z /* 注意乘2,处理幅度 */4 s" m& @8 c2 l! {2 |5 h+ ~
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */& c) z. k4 L% s
/* %% 行列转换 */
/ [, X8 L7 W% h+ c yiDuanShuJu_mean = b_mean(usable_left_filtfilt);* S7 B! |) u# k' S3 g/ Y* [
for (ixstart = 0; ixstart < 81000; ixstart++) { d' E: I$ [/ @8 q
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]* j% j% M5 d6 n$ N4 F Y
- yiDuanShuJu_mean;7 ]$ w* \' W0 _# \9 R' I5 h5 ^
}2 [0 K* `7 w+ ^- i9 f0 J
: U; V" O- {: r( I9 y /* %% 应该对数据归一化,但是这一步放在哪比较好 */
; m: e" X( O- `, d ixstart = 1;, `) T+ j4 U- @% |& U) m
mtmp = youXiaoShuJu_QuZhiLiu[0];
8 I% d1 w5 I w+ i0 P if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
" Q+ m$ J3 i6 [( g: ^- t- r/ d0 a& i ix = 2;0 {; _' s$ \# _6 I, f+ A- H4 ?/ q
exitg2 = false;
: p* Y t! ?( `: y) D, l6 a while ((!exitg2) && (ix < 81001)) {
2 N7 j0 t+ f. K ixstart = ix;
! R& L/ K$ Y6 d* I if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {/ e+ t( G- o% k N( i
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
' @6 U B, w6 M exitg2 = true;
3 S3 u' y- g: E+ R( e$ ~ } else {& C8 [' d. r3 }) P
ix++;
/ j# v7 A6 p' z& f) r" z }+ h8 A) ^2 q- w/ t9 Y
}0 Z$ T' F3 }0 t
}7 b' k/ m4 j* y: p( P
: M' u5 j7 B0 r' h% ]7 K. j: i
if (ixstart < 81000) { F. u" f$ |# ^& i
while (ixstart + 1 < 81001) {. t; X& E. G8 i2 v
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {+ u) k5 H- ^7 B7 }& G
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
: A% g3 |3 P$ ]/ A1 X( m }
; [4 e6 h2 S( |& B6 _* D4 n B
T6 g. x' _9 k% K8 E ixstart++;; i8 d% f& i0 J
}9 R& `8 s* N; X) M7 c# c% }
}
' r6 {8 M& H: }9 c( R: g! |; c& x: g* ~; T+ P: Z ?
ixstart = 1;& L' m* n$ D2 ?/ O7 P" }
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
# u! r d" e$ j! d if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {. u# u, D) i: `) C) C* G5 a
ix = 2;1 T- C5 {+ y0 k% ^- }; h/ j% h
exitg1 = false;
6 \: T( }, x! Z( _9 n while ((!exitg1) && (ix < 81001)) {4 L1 S+ e& s/ T2 y) y) Y0 m
ixstart = ix;
0 B: ?' }* F L# F0 p0 B+ }1 {9 e if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
* J, H' v9 x& Q( \4 M yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];4 j' [; a; r1 y! [4 q# G
exitg1 = true;
6 h7 T2 G$ s G; [1 d% S } else {
# N2 ^! t0 I/ g, U ix++;
. f, E; }' j/ t }4 C2 u0 A- P3 z1 s5 F9 w
}% y1 n N/ Q, b' b' N. g) X
}1 @- L( ^0 S% B! Y% V2 M5 M+ i9 z
3 G7 d I$ F6 A9 Q7 U0 F
if (ixstart < 81000) {
4 T+ f! j* g, ^2 M2 s. p while (ixstart + 1 < 81001) {& [1 [$ w- T1 U4 U( k& r
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
. _: X% p3 M; L$ ^ yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];5 P+ R z! ]% Y8 E* p
}9 D1 K# `. m. w
) M, j* `$ a# }( F, h9 K7 [1 _2 \
ixstart++;
" ^; R/ |$ J$ ]; O- k }0 B1 i" U5 \5 V. Q- V! A) u
}' i" S9 M5 \( D3 ]* A
* G! `1 ]1 p- C) B- q6 u. O* y! G
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);7 Z3 r6 s" G& k! x$ r c8 g- d
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {3 I; g8 I w+ C/ @# G' e2 }( m
yiDuanShuJu_mean = mtmp;
) `. \2 R6 {5 Q( G# R5 I; w2 f }+ [; |- |2 w1 t2 [
0 J L' Y. [) |. A0 [( S* X/ ^( R
/* 找出极值 */+ p8 v2 J$ V& s# O( y! a# P
for (ixstart = 0; ixstart < 81000; ixstart++) {$ B) T. ?9 l4 @! q% J
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
+ `% e8 u9 Y& t }8 t& Z$ @7 i y7 f2 p
0 |! \* Q5 y8 Q
--------------帖子字数限制------------------& l( Y% ^( O+ I! B: B
}
% c4 C1 p* I# v6 F& j
; N( L9 X/ |* F& y* E2 S0 Z8 A& R4 `$ v0 P
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|