|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 8 R" z' N! s/ ]% t( U
% f$ K; y# F( W& s7 C# _( @
各位大神:
. |& E8 g! ]! J& I5 U* v% K) p N 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)( \2 U" L' [0 ]$ D% _
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
* S+ b" ^4 q' n8 o) s, A" g0 j4 _' @' f' M( Y2 s
) m# ^. _# N$ a$ p$ o3 y7 P
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。+ W$ n% @! X2 V/ T* J2 T* r
& U8 m3 H3 m* O4 T* V* F# H g并没有其他线程
6 [% c. S/ [8 `" w反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。) E2 O( }: P/ A: D. r3 u
也说不定是和堆栈有关系。。。。。。4 ]3 W+ Y/ y$ i+ |9 a' Y# X0 C
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数..../ S/ Z% S; F: T( L2 \
/ ^% W7 `- Q6 f: ^6 W. y* I
& s+ N8 a, i2 k7 r1 N
1 \/ U+ E& @2 ~我也很绝望啊,希望大神能帮帮忙,感激不尽,!
9 c% f) a e4 O, k' u: a3 [$ b* f# h( {' I* o& f( J2 }0 K
_- f& U- a4 a附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];" ]/ u8 Z2 [: ]! _0 E7 F) w
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
' E/ [1 a$ |0 R3 M- |
h" B, R! e6 [( V ^0 Nboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
0 j1 N0 s4 P4 }! O; k( I$ w5 G p const double data1000[1000]) {8 d0 y" z" Z# e( F
; H5 E# r: i+ }
int myfuck;2 ?3 K+ j' a9 j
double yiDuanShuJu_mean;
. K* W" x2 t5 I double yiDuanShuJu_LowMean[1000];. q1 l8 l+ d, m- y" U
int ixstart;' a9 t3 g) j5 n' m3 A2 W
double dv0[1000];
2 J4 P8 a4 K2 {0 Q5 s- M* V i+ H comm_AGC pAGC;& n4 C" s4 i/ ?9 o' R' O3 f, ]( ]
comm_CarrierSynchronizer pFineFreqCompensator;. l8 V! q' B+ n' l# U) r2 |! p6 q3 k: i
dspcodegen_FIRDecimator pRxFilter;( t9 \& }0 u0 k1 [, T6 O) A! e1 J
comm_SymbolSynchronizer pTimingRec;; ~( ~' s1 H# q- z1 W+ ~
comm_PreambleDetector pPrbDet;$ O4 B5 v2 A9 ?: {& ]
FrameSynchronizer pFrameSync;: t# Z. C" h5 \* ~! W; K
QPSKDataDecoder pDataDecod;
4 Z- y2 O) C' g: K2 T( a1 t9 ^9 z static double usable_left_filtfilt[81000];
( E" Y* e; {! v @8 X static double youXiaoShuJu_QuZhiLiu[81000];
7 e$ \! M6 }' u% I8 n double mtmp;
4 P E6 {& h# w$ j8 R int ix;
7 j3 Y/ d z7 ?- N boolean_T exitg2;" A# h2 ?" t5 d$ q
boolean_T exitg1;
* v2 ] X' a3 ]6 O double YiZhenShuJu[800];+ d1 t/ E6 c6 S
double dv1[800];% N7 N5 k; z( ^! l1 B: d
4 \* D- M0 v7 J/ } z9 v; X( t
* X/ ?: a- T7 X/ j$ j; b
double b_YiZhenShuJu[800];, W Q* j! b9 P5 |5 y
double I_filtfilt[800];
' h2 _& g8 z9 D' V double Q_filtfilt[800];
7 K# |$ j# |0 K creal_T b_I_filtfilt[800];: } |! ^8 c! H# j" E6 J
creal_T b[800];
! `9 f. K3 k1 X5 Y+ G% o creal_T RCRxSignal[50];
5 f* h$ Q) G, v0 c9 T creal_T fineCompSignal[50];
3 R; j: o& o5 k8 u% S3 r+ n. C double phError[50];- C- `! z. R! L0 F! {4 W
creal_T timingRecSignal_data[28];
* Q7 S* z. w- k" T/ Y! H int timingRecSignal_size[1];
4 }! n5 A1 N" ^$ b- @ double prbIdx_data[28];. s" \! W3 z+ n2 a# L
int prbIdx_size[1];
3 i2 H! f" v! W7 q5 ~/ @& ]; U double dtMt_data[28];" T% F/ d- K0 q4 H# m0 d6 e; Y& @7 e
int dtMt_size[1];
, T# _: r5 {. Z5 k* ^: b9 F creal_T symFrame[25];; f" q) V* j2 i* o
boolean_T isFrameValid;- @" e. J D1 ]/ j( L8 B
double unusedU0[3];
& H- U4 J$ A: V1 r- ]3 J( C' _& S6 i, [7 u+ `4 M
//调试过程中的变量
( `. W' ]& O4 _1 B P int enough_data;
: }* \: n0 w% g* P2 F5 v
% g8 K9 G q- n3 d. E int enoughDataFlag;
2 E& K8 O n- e0 o9 |& u; L int yiDuanShuJu_mean_int;) W! B: \1 d' ?0 V! I
int int_sum_dv0;
4 K" f/ [& B& J+ i8 i$ @- Z5 @& y int oo;$ [! w$ F( ]+ V6 f
int ii;% r4 x' E! P( y
myfuck=10;2 e( h8 [8 D T% a4 G- a8 ?4 k, z
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */4 V" w3 L' v, l: J# T3 [
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
# |& ]& Y! ?/ q" N h9 C6 F8 O( S% ?
yiDuanShuJu_mean = mean(data1000);
+ k# [6 S( y* f7 A/ g
! x! I) b9 Z: O+ o1 ~8 K" M yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
! n" _) z! Q4 w: v. ? UARTPutc('A');
! g/ l8 ^* ^1 F k. I UARTPutNum(yiDuanShuJu_mean_int);$ k% b+ L% \, d- p9 V2 Z) A
UARTPutc('\r');
; P1 i! Q- a% S UARTPutc('\n');
& r& t9 ~, G* O+ k' [
0 s, K/ Q3 n! s2 d/ J7 [$ K! f& n for (ixstart = 0; ixstart < 1000; ixstart++) {+ X& }' v1 ?: g- k! _
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;6 B/ ~ B0 m6 i7 x: g
}3 Z5 D; C6 Y6 l" u m- }3 s t1 ]
- l" q6 A9 B+ ]( P' S
power(yiDuanShuJu_LowMean, dv0);
' M, [ e4 u) s+ `7 S. B7 Z. v
int_sum_dv0 = (int) sum(dv0);
D \9 `# @# H2 j9 f' P1 x1 e8 S4 w! r- v, y l
UARTPutc('B');, d1 m9 V& k, \6 c0 ?9 g0 ~
UARTPutNum(int_sum_dv0);
8 Z: Z5 I! w) W% N* a2 Q1 M. ^ UARTPutc('\r');
d k/ t4 Q; V- S% s UARTPutc('\n');4 n3 G* z5 u1 ^2 C+ O- f' p+ }( ?
9 ^7 M0 r, U- L% Y9 r// int compareFlag = int_sum_dv0 > 1.0E+8;
v4 ?2 Z# J' v ] J
! L; x8 |$ K$ u, w if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
4 r, ~( j3 X% f l UARTPutc('C');
, |6 ]; ~1 f3 m( z5 G; x) z# ` /* 比较信号能量 */
- e: Y' R+ x2 n /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
7 C$ w1 G; }% b4 }- O// yiDuanShuJu_mean = 1000.0 * youxiao_k;
; K, a& ?. M c// for (ixstart = 0; ixstart < 1000; ixstart++) {2 S0 A5 A/ ]1 d- r! q' b
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
) `% R0 ^" N& X7 e5 M) ^// yiDuanShuJu_LowMean[ixstart];( x* ^! a. T/ S) t. V
// }
) [! N Z! B2 h0 M/ z) ^//
3 j6 z( I9 }4 ?) d) A3 o5 ~/ ^// youxiao_k++;1 D! g: X- m; |
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==" [9 W; F, f9 \7 ?+ |" q3 |
// /* 感觉要取21个数,即0-20, */
! P/ v. Y$ z; V$ i; X# e6 P. V// enough_data = 10;//有效是10,无效是0& }8 j8 s* u+ ?6 A
// }
" }7 b( Y8 R3 Z }" Z+ @. l: r* G
6 E) \7 Q1 i9 A, ]* e z: w+ z/ k/ }' i0 V
enoughDataFlag = 100;
; u0 i4 q$ y5 I* N enoughDataFlag = 1000;" @ v) s1 h3 A. R5 A
enoughDataFlag = 0x02;5 `+ G+ e2 }; `# e8 S
enoughDataFlag = 200;
$ j. c) M& N. _& `
5 `2 c' w" U5 a6 o* ] int myfuvk1;
N$ ]# Q2 O" k# M8 |3 j! y myfuvk1 =11;
$ h0 o' [# u f+ [) o+ A# L o" R( i5 K, e& L. \9 D8 t
6 [3 O {6 R# ~$ s0 f enough_data = 0;
3 k! ^, u& d7 Q1 |8 u# U# T9 T' o" q1 }5 o- o1 k# w6 p8 ]* g) j
// if(enough_data>50){
$ F R4 H, U, s" I1 @// enoughDataFlag=0x01;
% U j! X* o0 t/ b J" w4 d5 h* i// }else if(enough_data<50){/ N1 r& p' J4 `" Y0 N0 }+ T
// enoughDataFlag=0x00;//0x00还是不行
0 }$ u+ `* j! S6 F1 @5 ]// }& S9 g/ @/ O/ f' ^: c
8 I! z$ g) u& L& e K) v( c1 U- Z
: D7 n8 P6 w2 ~2 g0 Q oo=10;* o+ N; X. m9 A* M
oo = oo < 5;0 n# H+ f, t4 K& b/ ]
if(oo){
& m+ a# q' |2 l3 z ii=0;
' i3 A3 I8 k8 | B }% e8 u7 N1 _* Y
if(oo < 5){. \ A+ z) s- X! U
ii=0;& H; n9 E& H, A
}9 ?, S5 I+ `2 S9 m
if(oo > 5){! u6 v2 i) Y1 r0 m L* W
ii=0;
; g: m+ f4 z, T }0 y6 d h" @/ z0 K" r- {
; [( j8 H' l5 Z3 O0 N
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */. y# }. a' {% w* |& ?: P, s
/* 如果数据足够才执行主程序 */
- z( V2 V h' y1 h oo = oo < 5;
5 V) d1 T+ s! w, c& R enoughDataFlag = enoughDataFlag < 5;
9 S4 N, J( P3 l2 ~# @& q' W0 s- g if (enoughDataFlag < 5) {$ c# R4 H4 m+ t9 |( R4 r D
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
8 y$ g! V- {( ]5 N AGC_AGC(&pAGC);
6 T9 f, S) r; `' N6 m& B9 d+ k
% ~/ | A6 q; i# G" } c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
9 C1 |: y- a/ h5 L2 d FIRDecimator_FIRDecimator(&pRxFilter);4 ~5 g5 @' u% K5 @: X. E
% l2 |7 h! m# W9 {/ w& D /* Downsampling */ J) D( X- g; C) ?. M" u) k
c_SymbolSynchronizer_SymbolSync(&pTimingRec);0 e& e# Z$ r# y3 s
7 _, b6 e- `/ S) R1 K c_PreambleDetector_PreambleDete(&pPrbDet);& i9 @1 w$ {# m! W/ E) _
* n& b5 z s* V* \3 A
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
) C8 w3 i8 \* ]7 m /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */" b- O, U* R" e3 a! b, v, Y. b
/* %帧数量=100 */
& [1 }6 {% l# y7 S3 ? pFrameSync.isInitialized = 0;6 R6 h/ r2 ^ L7 C( I
1 o. j! k+ `1 B) v5 I& \$ L4 U /* [EOF] */
5 f" H6 Q& r" h /* 前导码长度是13 */
8 T; J' Y; Y: L* a /* %qpsk */+ f7 V6 a4 V) D" z! U
pDataDecod.isInitialized = 0;
; ^. s* W4 G- e3 k# S; E+ @4 R) O8 F' k& s
/* end */
Q+ h" c7 s8 Q6 @& G8 k /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
3 V6 X3 X: S7 ?. k, g8 V0 ` /* Convert 3-dB frequency */( o {0 \9 _5 M/ V# M
/* Convert 3-dB frequency */8 m9 c2 [( |/ h/ z& G5 B1 g! _! ?2 E% D$ u
filtfilt(save_buffer, usable_left_filtfilt); y7 F; q0 g7 `7 c3 s9 j
for (ixstart = 0; ixstart < 81000; ixstart++) {3 B! i$ V7 g7 }6 l% o, l
usable_left_filtfilt[ixstart] *= 2.0;6 m- W% ?! z" Y: ?8 ~
}) I( x) T7 Y) K7 e$ ]
4 W) G6 P3 G8 @/ |# j( X5 d% B /* 注意乘2,处理幅度 */0 q+ G0 [5 k+ k7 x# v3 S
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
0 ?4 R' m8 G$ t4 Q /* %% 行列转换 */& D* l2 s& |; ^2 N+ I
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);! s. z. u9 U' q% f, H. O
for (ixstart = 0; ixstart < 81000; ixstart++) {
) M4 X& E- T! X( t' ~ L youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]9 K7 c# a( ~' G! i2 F3 R! s* O2 J
- yiDuanShuJu_mean;
. u# _# V( K' x" J/ f' ? }* n) U( {+ s& b7 S
3 f2 ~+ w4 @ U, Y8 V, v3 Z
/* %% 应该对数据归一化,但是这一步放在哪比较好 */5 p# |/ p$ c7 J6 R" v) I4 N* A
ixstart = 1;4 W3 {- i( x, R+ H
mtmp = youXiaoShuJu_QuZhiLiu[0];0 K" N+ {* {" f( t
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
( S: ], i. _0 w ix = 2;/ V+ K+ c) ?) x1 {& u* e0 C
exitg2 = false;
' J/ t0 h% I; Z- S. A, v. t while ((!exitg2) && (ix < 81001)) {! s, ~% J! |$ D& @7 Z/ x+ z
ixstart = ix;$ n* F* Y5 W- Z( ~8 Q* H9 X
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {! Z7 t( b& X$ ~' {- ~
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1]; v& A' P, r' e8 o* w
exitg2 = true;
, V; F; j2 x8 d4 {& d/ a; y/ r } else {
" n, H6 W. I" U+ M7 Q ix++;
& g5 E9 h: Q- m9 g' I }; m, @' N% F3 {& j7 F
}
0 l1 X$ \* [1 r& y( l( ^& Y }
' O% {4 V2 I" E0 b) i
3 P" @' X0 {+ }6 _ if (ixstart < 81000) {; w" |& O- M9 e
while (ixstart + 1 < 81001) {- M# o" W- R; l7 m! A$ ^
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {. t0 r, n. H# d" |
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];* ?% l6 N6 a6 p8 {
}
. ^& {% X& I. t: R5 r: J* k$ \( p2 O6 K% J! K& B
ixstart++;
. K0 v* S) V& {) T( h }* L9 j! z( B1 i: i$ J. y& V- h9 a9 j
}
6 @5 O8 w3 M' ?+ a2 a* l) M }
. i) p' B7 [! O9 z ixstart = 1; ] d$ Q) A* B' o, v
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];1 J0 ?; x7 Z' J: g
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {' ]/ u7 e& `- q8 E: a; `
ix = 2;
/ ?) R( F8 m; R exitg1 = false;6 C* H0 d0 H- N: [% E; {
while ((!exitg1) && (ix < 81001)) {
& X, e# @5 z5 j" O/ C7 y( l* I/ r7 D6 k ixstart = ix;. A; X9 `0 u7 `' _
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
& G g$ j; b1 k yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];3 I; ?" y3 E7 y- W. B0 f4 {5 Y
exitg1 = true;
6 y" I* S' X/ u7 b } else {
" d; J: ~( l8 T6 }& n. @2 T, x ix++;
1 B( s; X4 P( s" e9 I, { }9 g5 }$ Q- [0 M s0 A
}
( M8 X8 k3 H* O5 H! X0 i }
2 C" ~4 A+ r8 D# X" B2 I- p% O4 |& Q: N$ ~% J6 H
if (ixstart < 81000) {& H( k' I4 C* v" d E8 K
while (ixstart + 1 < 81001) {
9 L3 P6 h0 s7 O$ q& l2 Y if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {) v3 f* O: s5 ~/ ]2 y5 N/ O
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];$ W: @6 I! o m9 d' W: \
}
; Y7 Q, ]4 `& f0 a3 Y: V" p% }; o3 c% @% R% S
ixstart++;2 f, \. }# ^4 B+ K1 y' n" Y
}: l0 r' T! k2 z3 t+ B/ S/ `# q
}
! r! ~/ f6 S4 g0 }
: D% Q5 S$ ~0 E yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
% c# k. p, r0 c6 ]% K3 j2 f if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
% C& a6 v1 o/ X yiDuanShuJu_mean = mtmp;
, P! Z4 [" \: n* ], f }
( U9 j: U) { N; I( B+ ]: J) @ T5 C Q. O: w! }
/* 找出极值 */
' I: Q/ m Z( S( K, B for (ixstart = 0; ixstart < 81000; ixstart++) {
( R; J( E0 F' t: [7 X2 Y) _+ J9 ]9 o youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
( O/ s; w3 { L! ` o N X; C }
! [5 I0 r7 w2 \5 f q1 i
* E3 q1 A& z# r& o) w; ^" I6 o4 @ --------------帖子字数限制------------------7 j6 | `+ ^9 x# E0 h2 z8 s" B: G
}
- R: h4 H& y$ h9 X: X: h: Y, \$ g: f# P
1 E$ N- H7 u6 Z1 g* u& h; X
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|