|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 # j0 X. H0 S# U
- n- e4 L$ ^ A& |- H Y V% i各位大神:
, ?* b. a& n' @. F 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
% @! T9 E. q% W$ @7 X 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:+ H' H$ i' ]0 \1 U
3 S+ p1 v) ^5 M# a( d
( H8 C4 L4 j- n' u这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。! `* g6 b' s8 O3 E* r
. S5 [$ C" M( f) l \0 R
并没有其他线程
2 E4 [( T1 t. c' j9 I2 V反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
* k# M0 n5 @. U! y也说不定是和堆栈有关系。。。。。。: o i. j$ _0 R1 ?) a W: D
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
! \1 U: p# T7 f. U( K6 b { b0 b( J* w1 {# z
3 Q2 w$ [: P# y/ |4 G0 ^; I1 q: L7 o6 L0 |
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
5 P* n" k( e) _! r0 ^' y- D$ @- k
2 [* t) m) x. h T0 r4 k+ j: v" }" C& }$ R5 W: f( S) K
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];4 X1 J& c% e) G! V9 K! X$ [) W5 C
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
8 e" K# W& l! O8 P7 c6 _- j
; d% ^' b3 W4 [8 R" a0 Pboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
; V5 ]+ I% W3 @" r5 { const double data1000[1000]) {* P& |' v/ m# g
4 s, ?: P1 U6 v; x1 X' D8 X$ ] int myfuck;7 M0 ]1 L7 N$ f3 v
double yiDuanShuJu_mean;
- ^: y/ G$ X. Q& h* C& z double yiDuanShuJu_LowMean[1000];5 v% Y; K' a1 X$ y! g' w; r
int ixstart;
4 E6 @7 k1 l7 ]' j double dv0[1000];/ r1 K- e' Y2 Q! M& |7 U) r: v
comm_AGC pAGC;
- ?( c; B! e& j" }% i comm_CarrierSynchronizer pFineFreqCompensator;
3 x' \; [1 q+ [0 C+ i* } dspcodegen_FIRDecimator pRxFilter;, K+ ?. K) e* i e) L: l; z$ l4 q) p
comm_SymbolSynchronizer pTimingRec;
+ W/ A9 B6 |. H8 H/ X comm_PreambleDetector pPrbDet;( z% G" G3 U' K- ^$ _- I: Z
FrameSynchronizer pFrameSync;
% X2 x, |$ |) Z4 [3 H8 K& `5 F6 D QPSKDataDecoder pDataDecod;
* {1 M M Z0 `7 q, V E static double usable_left_filtfilt[81000];
' D& C2 w5 }$ s5 l- E) I: h9 v static double youXiaoShuJu_QuZhiLiu[81000];- B6 ?; M9 g- B' L
double mtmp;% }+ Z* B$ [3 [5 I$ n5 L% ]1 e! J0 `
int ix;4 ]& p6 R, z# ?1 ~
boolean_T exitg2;, O9 I, _- R5 H$ s0 G: F$ \3 g
boolean_T exitg1;
5 u1 C' ?' b5 k# M* s double YiZhenShuJu[800];, T/ A$ ]+ B% Q$ C+ N3 h, t
double dv1[800];
+ u2 @5 g7 b' ~3 ~1 o
( R( g( Q1 @ H0 R
2 _' ?% \( b7 i' v0 L double b_YiZhenShuJu[800];+ t: Q4 }& ^: z- p; W* K* b. N% w
double I_filtfilt[800];
Q/ s, R( E Z" l' @; K double Q_filtfilt[800];- w5 }/ i8 T' ?6 V# h% @5 u
creal_T b_I_filtfilt[800];
" U2 w/ f. v3 ~8 {' B ^1 K8 f: k creal_T b[800];
3 g3 E. ^# B" e" B0 l. [2 F creal_T RCRxSignal[50];/ O+ ?& \/ c$ x) ?% f
creal_T fineCompSignal[50];- F8 B4 j* s, {6 M6 S/ @- R$ {
double phError[50];
L2 q6 V+ _+ _) Q7 M" Y creal_T timingRecSignal_data[28];: X/ V( z8 C3 {+ y9 l. j
int timingRecSignal_size[1];8 _8 l* [3 ]4 T0 S( u1 A
double prbIdx_data[28];( P4 @' g6 Q9 e, w. o5 |. \
int prbIdx_size[1];3 @8 p/ k! h% n- `0 [* x+ g
double dtMt_data[28];
6 O- t# r' ~4 ?* G" [# f. ? int dtMt_size[1];
/ y" F8 z- n5 w# _) ? creal_T symFrame[25];* Y' }3 Y# x6 @) M* ^
boolean_T isFrameValid; C }. r1 Y4 ^# g, G/ }- a! ^( ]
double unusedU0[3];
- Z8 b( P* q3 Z# m; I, Z: i* }
, N( } @( \1 L D- o //调试过程中的变量
( b" a8 O& R2 s/ T4 f int enough_data;
# e$ r+ [" P2 } ?0 s! g' Y/ B3 o: V7 Y' U8 |4 H5 w3 ~7 J" ?
int enoughDataFlag;
; e6 n l8 d6 |/ A" k int yiDuanShuJu_mean_int;
4 `" C" F5 p" ~- k0 e" B8 b int int_sum_dv0;
/ U7 F" s/ H' K& X int oo;# i5 p1 s* j8 v# V g7 ~) B
int ii;
" r) R' V& A5 A3 y; ]( [ myfuck=10;7 z+ H/ d3 U2 h
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
, b1 U( r$ |0 d4 {" c /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
Q+ A) q( m# s3 E+ \1 ~- M# @" x+ J$ k
yiDuanShuJu_mean = mean(data1000);
$ l* q: ?: n$ o4 |! @* p" _, R* K* R( V" Q5 ?
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
p$ f4 Q& R& J- j: G UARTPutc('A');" @ ]$ r7 o6 c6 ?: k2 ?/ T" ]
UARTPutNum(yiDuanShuJu_mean_int);
& Z3 \2 C5 g4 F9 C4 F& X0 E UARTPutc('\r');
0 m: b% f% r5 r# o) ~ UARTPutc('\n');
4 r# y2 v; e( `$ R! R9 K
1 N7 V& g3 F. p0 I& |; e+ @ for (ixstart = 0; ixstart < 1000; ixstart++) {
' s, d7 x- j1 G8 I; b yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
Q! ]) U2 a% p, O# a0 Q$ l/ H# T$ J+ C }
6 e- f/ g8 w1 \+ x/ m6 f( t8 k, d' v& K" |
power(yiDuanShuJu_LowMean, dv0);/ G. @5 r. |, e. r0 i/ A
& a- ~+ L7 ]# h3 w; |" h- P int_sum_dv0 = (int) sum(dv0);
/ e) ?5 J- V: o$ x+ d, S# }" C# X
0 t+ j* w9 Z& z0 Z/ t1 F% |# T* | UARTPutc('B');
% i5 P Z, J! U1 P$ @ UARTPutNum(int_sum_dv0);. p1 S+ s7 s$ ~6 R" ^' f
UARTPutc('\r');
" u9 J+ Z u, Z* U0 R UARTPutc('\n');
8 n3 m s' H' s9 G9 k) x% Z( _0 y+ S* V$ k+ u$ T
// int compareFlag = int_sum_dv0 > 1.0E+8;
/ d _; Y# \( O A9 x: q4 C0 p* j9 I
. v9 O+ v+ v5 Y% x4 y0 G5 a" } if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
% o- K' U; M8 n( m8 f+ i UARTPutc('C');; I& l' W# d+ M, R
/* 比较信号能量 */
# H7 z( _- g( c* `- I /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
8 c; k" l1 i; X; Y: H. @8 B# Q% m// yiDuanShuJu_mean = 1000.0 * youxiao_k;, t+ K) i( b- J* r& Z6 _
// for (ixstart = 0; ixstart < 1000; ixstart++) {4 o# V$ K+ a2 _6 b/ w; B
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =( A8 d- o# j3 Y3 A Q
// yiDuanShuJu_LowMean[ixstart];
9 b" o$ r. v4 Y( K0 T// }; d" A5 X$ {$ h
//
w3 X5 S5 y+ c4 f// youxiao_k++;, L: S6 {, l% V& m# m
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==2 I8 F4 y; a0 W$ H6 b
// /* 感觉要取21个数,即0-20, */
1 j% Q5 q- C, D3 V6 D; Q// enough_data = 10;//有效是10,无效是01 H' _7 O2 m D2 s) g7 R: ` V! x: @' ]
// }" |4 c: C( W! ?+ o
}& X: g7 {0 P/ g [" c8 P
' p$ {0 F7 [: _/ h
2 c$ [8 U: f0 J
enoughDataFlag = 100;2 d' i" {' `8 Y1 V
enoughDataFlag = 1000;( `) |# v6 c5 r$ J2 ~# M) I
enoughDataFlag = 0x02;
+ I% @: O v& I$ h8 m! d- X7 ^ enoughDataFlag = 200; V$ H% v9 F( j/ x6 y" F
3 W- V, a+ G7 U0 c4 a4 p int myfuvk1;
) i. z( ~: ~( @# Q5 z. i* w; }* S myfuvk1 =11;
. k' L( Q" F/ d: v0 b& v) j' z; ]( J, x* G b2 d' B$ B* y
! ]# @& i$ X. C0 u) b' ~ enough_data = 0;$ P% g7 ?' i# P
4 @/ N2 `9 d- P, f7 P- Z c
// if(enough_data>50){3 w2 ?" y7 \8 `2 o" J
// enoughDataFlag=0x01;' [( m0 }2 E6 Y1 G5 c
// }else if(enough_data<50){
+ o0 U9 H1 B' Q7 b// enoughDataFlag=0x00;//0x00还是不行
) D7 d) m' l I$ _// }9 }. n( |# U) C; p6 r
) ~3 T6 L* J3 \; }* I6 o. g
1 t) ]: ~/ @) G ^ oo=10;5 x% K" b$ j0 p3 _/ X& C
oo = oo < 5;
4 F* h( _% g# q4 v1 ] if(oo){" a( k, Q- x4 \ U0 j8 @; u+ O3 z
ii=0;
; B' k) f2 K# Z! H0 F }; a6 A8 v( \. O; V7 ]
if(oo < 5){7 t. |4 L5 O4 v& {* ^
ii=0;% D k6 W0 I+ B3 M( f/ i2 N
}
# S- c9 E6 ]5 g8 G( H6 ] w' [ if(oo > 5){! u! E2 W. q* E U( M
ii=0;
- a& c8 C0 B. c( d5 `4 Z. J3 J: q. w8 Y }
% Q5 h! W8 l w/ v9 u
3 b# h9 N4 l) ]" w* F r /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */6 a1 ~% Q# j+ X
/* 如果数据足够才执行主程序 */6 r: Q D8 c( B0 Z# x3 d5 E4 y
oo = oo < 5;
4 W- D2 b$ n8 h- | { enoughDataFlag = enoughDataFlag < 5;1 x/ ]) N6 S$ f1 h& ~5 @+ ^% p0 v
if (enoughDataFlag < 5) {
' @. Y! t* g6 e2 Z// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0! Y/ C8 X* d" x# b3 O' E. | a
AGC_AGC(&pAGC);
) o* ]1 w" Q+ p! n) }2 Z' p& n& t1 x6 {0 b' G6 X% T& Z/ |# w* a
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);& w; u) u: [3 ^4 g4 x$ k: ?
FIRDecimator_FIRDecimator(&pRxFilter);4 M/ E1 m; Q( W- h* _6 L0 l
) T, V4 V2 Y: y$ J /* Downsampling */
- m/ x% {- e* Z: [9 T7 E' ~ c_SymbolSynchronizer_SymbolSync(&pTimingRec);
& q& v' U* o6 E) X- \
6 J' {$ R. i* W4 [6 x c_PreambleDetector_PreambleDete(&pPrbDet);
% d2 x% s2 k' a4 w Z
0 i: J3 y+ Z8 p /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
( A6 u2 E2 s) _- b3 |" o" T' B /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */: p* z; T5 E# R3 S' M. _6 y9 {
/* %帧数量=100 */
% Z( M N' M* Y9 g1 b pFrameSync.isInitialized = 0;
/ s+ j6 b2 v! N$ i& s2 u& Z
. L' w) \. I: l j m; Z3 Z! } /* [EOF] */
2 J- u) C2 o1 B2 L9 R* d1 _ /* 前导码长度是13 */% Q# b8 {$ |. b( P
/* %qpsk */
& v$ N/ _ R6 O) a- ^2 K7 M% L pDataDecod.isInitialized = 0;: i+ ^& L# n! n
. X" Q j' v I /* end */
4 o4 L4 f! e, r: w u /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
Y$ |! w- B' A /* Convert 3-dB frequency */; G; B7 x1 h: V7 H& H3 a+ u
/* Convert 3-dB frequency *// i9 `2 y, `/ v6 F. l. F% X3 Y3 M
filtfilt(save_buffer, usable_left_filtfilt);
0 k8 U Y o1 y0 H# s& x# G for (ixstart = 0; ixstart < 81000; ixstart++) {+ p- B! w8 c! {# R
usable_left_filtfilt[ixstart] *= 2.0;7 h! X8 U2 E# c7 \1 q9 \. {! I
}
) D( g6 L& z' h2 N- h4 Q
# @" @$ T* x; e1 @; K, m r \ /* 注意乘2,处理幅度 */' O* B/ \; M' E8 O: a9 J, G
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */: o4 j( e# u! ?1 S0 _( `! t" i2 N
/* %% 行列转换 *// y( [1 z- N1 t+ ]! M
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);- C: g( c; q) d5 r9 ]
for (ixstart = 0; ixstart < 81000; ixstart++) {& F! l. x; v; \; U5 a7 H
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
" c2 K( \5 |: c7 _! f2 K# l9 z1 w0 v - yiDuanShuJu_mean; Q5 q& k9 Y. ^; N9 C" B8 i1 E
}: E8 k# L, Q2 q% z# G/ H4 j6 D
8 b( j3 v* [# C9 p* @( [# A
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
5 W/ o, d6 r& e ixstart = 1;
7 L% M( z* K: R7 u/ g) ?* Y, X4 P! v! L mtmp = youXiaoShuJu_QuZhiLiu[0];/ C- @* E6 C# v7 @: G
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
- t3 ?1 z5 y, @2 k8 H ix = 2;
& ]3 S, S7 n V1 }0 o exitg2 = false;0 D$ b# [2 c0 P3 i# z& u1 O
while ((!exitg2) && (ix < 81001)) {
( ^2 s/ P: }; c- M* e8 _8 U& g$ { ixstart = ix;
, V+ s' H' k2 B: D! q: { e. P/ w if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {$ o4 w0 {1 v9 i- j
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
$ s" \. s- X* E, r c8 G W exitg2 = true;' B/ h5 g+ N- j$ C+ `( ]
} else { ] I ?! v1 v( m
ix++;& h, D. {4 Q3 K" L/ d0 v. p
}" c1 l1 I8 e" @& C
}/ d/ ^3 L v. I, z- ~7 D$ L
}
( m q! R) C. B" v& x- N
4 K& j' x" ~- r3 \ if (ixstart < 81000) {
/ \& d. V7 L! n+ H! D# q6 D$ X l while (ixstart + 1 < 81001) {/ n, f: R6 z0 N" a+ h7 \( o% z
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
! L. Z, K2 W5 O! V( o. @ mtmp = youXiaoShuJu_QuZhiLiu[ixstart];0 r& f- i, h+ k- j: }, I6 Q W" D; Q4 C
}
1 C5 @# B( T" u+ n2 v) y5 a! {0 a
- A. l" {$ P; W6 t! \" q/ Z ixstart++;
! A2 \9 E R1 n# T2 v }
( x" F: u7 ~8 x# @- L }9 l+ }7 S1 s& y& K L! T
% Y" q. G0 c5 t ixstart = 1;7 j& \9 ^: c9 ~' m! A, j; w, L
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];9 X: W6 t; @9 j8 L3 y5 ^9 f5 r6 N
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {5 P& C' N. v& }$ B
ix = 2;
; h) b8 g6 H v exitg1 = false;
& [; G. W7 l; a# j# _ while ((!exitg1) && (ix < 81001)) {
8 Z/ R( ]( \/ n; r% g! J" ?% u Z ixstart = ix;
. f) l" b' M c; r, p if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
7 ^# J2 @5 c1 x- W, J- E m yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
. U: p; q8 h1 y+ j0 A+ v7 P exitg1 = true;6 m3 u$ @# ?, t3 }; u, G2 Z# P
} else {& R+ k! m; l8 L, s: j4 L( C
ix++;
0 m) o! S5 g& H0 P }. ?; J/ v' z9 K& p6 D! C
}
$ f7 M% ^7 O9 N1 N$ d a( j* Z }
1 R# a1 S5 P. _5 q9 f5 f) Q& r9 W
if (ixstart < 81000) {
! \" @9 s( `; Y6 s3 I0 i6 g while (ixstart + 1 < 81001) {
1 R* N. G' S7 p ]- Q% h# j if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
# v: u. N" q& G0 ?1 _! j0 Y yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
; E- _9 F; f1 L/ S. G t }2 s( F% i& {2 M: ?( B8 w: m
0 ~! P4 y$ r! O" d4 W ixstart++;
) ?; t/ t; I* D* R3 Y7 ] }
0 B5 c+ H, X- b4 r+ M% [ }( V7 m I: ?2 l5 P' b2 o$ I# U1 b
, b' [; s1 j7 v% R
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
$ v6 g* T' i- \7 h3 N3 N if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
r0 k) W4 _* c yiDuanShuJu_mean = mtmp;( q8 a; W; `5 p- J
}( [6 \) X x& X
* Z' Q n. T9 |) ?& f. P, h8 g
/* 找出极值 */" F* z3 S7 k+ ^, L6 I g7 c
for (ixstart = 0; ixstart < 81000; ixstart++) {
) _& m+ S* C3 L youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean; G7 ]' m# s' P
}" h8 }3 n# ~1 u# S3 \, k
3 Z- a" m1 F, c/ M5 p& }
--------------帖子字数限制------------------
6 o, J$ I: K0 ]' t% D# R}
, D$ O0 g( Z! @$ ?* S: F4 p) ~
$ u2 Y ?# F+ h3 `9 `) m$ F0 e p2 z4 Z% C2 C$ y" t& C3 c
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|