|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
7 X9 q' O! [) v/ d; P' a8 F5 }# g+ F; f+ }+ S
各位大神:
# m+ R. \8 F8 B7 k 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
! S8 {/ X# M- O4 h1 D: d 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
8 z, n3 L t l5 T: @+ D+ t# O6 B3 T$ i9 f9 A
, s3 Z4 O! m3 `1 R8 x3 G2 ^
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。# ?0 k, } n5 \. {" g
4 Z: F# \! {$ b并没有其他线程
2 P. Z6 {! g4 D7 g6 x5 c反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
% T* r% j! L9 c# [9 E& g, y W也说不定是和堆栈有关系。。。。。。8 T, d! l# s5 y4 J R. n. i
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
0 R5 r5 `! R8 h8 a% K
* c- L4 I: T& q9 l) A+ | C! K* q: H+ [0 v+ Y, H' a
" o9 s+ D1 D" N A/ |
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
0 i+ O6 b9 S) ~. V
) X4 W3 k9 r X' G U
/ b; E# {7 o8 R' d" s附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];" H8 D; @7 Q: ]- Y1 J: v
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
. L ^5 l% W: X2 u# g K& Y3 F2 t6 K5 Y- ^: g; {5 g
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
6 M$ q% o* Q# G9 e" V- H; E const double data1000[1000]) {
7 E2 w$ ?# P1 N' V. c* }* q7 R/ x& b: S) z" ], a V
int myfuck;
9 N; m8 } J- O; q) p& y* H# P- D double yiDuanShuJu_mean;0 Q- e. j7 D& B+ Q( x
double yiDuanShuJu_LowMean[1000];' h" n$ w/ x, A& v- G) [* q
int ixstart;
9 Q6 R7 u) \/ n; i8 _5 ^ double dv0[1000];% @. v# | @& E. Y/ W* W
comm_AGC pAGC;( {$ M$ G* t. f4 q( i8 i9 M" n6 c
comm_CarrierSynchronizer pFineFreqCompensator;& z+ m2 ?/ i1 Q" |& Y }' u" T) o
dspcodegen_FIRDecimator pRxFilter;9 C9 F0 v3 N* V! O0 O" o
comm_SymbolSynchronizer pTimingRec;, L2 o/ I7 u' h- B: w' B
comm_PreambleDetector pPrbDet;, q' z. W9 R0 B9 L
FrameSynchronizer pFrameSync;
( k+ C7 {" M6 j" g- W( X QPSKDataDecoder pDataDecod;
" p( ~0 D4 T: c& W static double usable_left_filtfilt[81000];5 e9 X6 |8 w! I: E
static double youXiaoShuJu_QuZhiLiu[81000];
; v# C, X: R; l+ H0 [8 y double mtmp;1 D* Y @6 F9 I/ i4 g" L( @) l l
int ix;
) L4 ^4 O. O! s, t+ ` boolean_T exitg2;
7 n2 v* y; S+ C- o boolean_T exitg1;5 C1 i0 w" M3 D! m- h& v" I1 Y
double YiZhenShuJu[800];
( L: ?! Q9 J4 L& |/ s5 G/ S. M. s7 ?# _ double dv1[800];- D0 J: r9 M b L) w' Q0 o4 _
2 g& c) m4 V: v3 y* m/ d k( k; W; `: Q. w8 l# @
double b_YiZhenShuJu[800];9 Y' ~: h, o4 ?7 j. p
double I_filtfilt[800];
# `0 E, @) S! ]3 E; @- g& [% N double Q_filtfilt[800];, k# ~" L6 o0 y
creal_T b_I_filtfilt[800];, v% S5 p( ]) d+ h+ r2 t+ S$ P
creal_T b[800];
% a) w( J: G+ X) ? creal_T RCRxSignal[50];1 v2 v$ z( f7 u) Q- H+ g
creal_T fineCompSignal[50];. m; A: L- c9 h6 U4 a5 D. k
double phError[50];# `6 I9 {2 [; O4 ]* L( \( _
creal_T timingRecSignal_data[28];# [0 l- a m+ D9 n- ^# A4 l3 v0 ^
int timingRecSignal_size[1];; V; i: z- q: [ L6 K
double prbIdx_data[28];
5 w% { x8 L8 K' ?6 c int prbIdx_size[1];
' E# x" ]! A# d! `7 u double dtMt_data[28];, F( X! A- x) P2 h3 i
int dtMt_size[1];
# |& p( Q% L( D+ ^: n creal_T symFrame[25];8 `* [! b1 t: k6 `0 J ]
boolean_T isFrameValid;
7 z& Q/ ?) P! D7 l- z6 m7 ]8 A. f2 | double unusedU0[3];8 {+ T8 t& A M5 m
4 Z* e5 e8 L! U1 e3 e# ]
//调试过程中的变量
4 e* |7 K; h5 E int enough_data;- @) O9 V5 F+ m; f
6 W2 E4 n# \/ P& u2 U int enoughDataFlag;
1 q# \' V* k- o/ Z1 u int yiDuanShuJu_mean_int;0 k% B g' W$ E- c
int int_sum_dv0;
$ |/ Z* H* t: D int oo;
/ D8 B7 [1 Z7 f$ N1 n" C int ii;
; d8 I+ g+ d' F. J) b myfuck=10;
9 `8 D7 P+ C0 Y4 {% r% h; Q" r! V /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */6 L) p# V- |" u7 ^. T
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
' \; O& J; D2 t1 @3 G* ?; O5 V+ r& y* ?3 Z
yiDuanShuJu_mean = mean(data1000);* o# H. y* A2 f( d1 B8 j" u
8 B: z- o$ M- f2 ]/ T
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
$ y0 o3 l& ~( L UARTPutc('A');
7 ^* ~, i9 \/ | t$ {7 {% n w UARTPutNum(yiDuanShuJu_mean_int);' @: g5 U8 Z# D$ m
UARTPutc('\r');
3 A- N4 P- v" B6 C; ]5 | UARTPutc('\n');7 ?" e, ?3 |$ Z0 b( L1 F4 V
8 i8 G( c* L. K9 G
for (ixstart = 0; ixstart < 1000; ixstart++) {
2 ~" i) C w( W: C. E, U yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
' f& y2 \) M3 b# e, K }. B9 w5 B, g/ L- n2 e
3 {. f6 q5 K: q/ o power(yiDuanShuJu_LowMean, dv0);
0 o2 R7 U/ o9 ]* K2 d) Z! Z! }# l/ R9 E% \. H. H O- I7 P
int_sum_dv0 = (int) sum(dv0);
8 q9 \+ C8 s/ c* V" v1 Y# m2 t( W; O% L, Z
UARTPutc('B');/ y* x. ^! y1 j* ~6 M. E" Y
UARTPutNum(int_sum_dv0);
% p* ~$ a7 T2 q# x( u/ X8 B UARTPutc('\r');
: H u8 e: u' J: {8 g6 n UARTPutc('\n'); h3 A' D: N2 m
$ S7 L* U& Y6 f( M
// int compareFlag = int_sum_dv0 > 1.0E+8;, Z; G _% m2 q: H
g8 X5 j& b' I4 G" U4 \" p% C' [
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
$ r8 C' ~' d; P% N6 d UARTPutc('C');( I- g q! Q) Z
/* 比较信号能量 */* ^2 i0 z) }6 ~& w, d( |* K" k
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */9 I$ |& E: o& x1 L
// yiDuanShuJu_mean = 1000.0 * youxiao_k;+ W* G+ {* c. N1 J! U1 x0 T5 w
// for (ixstart = 0; ixstart < 1000; ixstart++) {, z9 u$ Y% X" C/ b9 @6 h. z
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
; ?$ g8 P w/ N5 g `6 Z8 u// yiDuanShuJu_LowMean[ixstart];! |" q# \3 V x" O7 m
// }
) t; S8 ~$ B$ R1 r//) C2 g9 G0 S- g" S4 C: P8 A
// youxiao_k++;
" c t- E+ j# z// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
7 z5 \ r% S$ W* o# H) v// /* 感觉要取21个数,即0-20, */
. z3 [4 W+ Q( s. \- w+ I6 `2 o// enough_data = 10;//有效是10,无效是09 J+ O' H3 h, a
// }3 [9 N% a* l4 Z' _ _% R3 ^/ [
}8 F; D8 {+ k- r1 {. s
3 A; v, p; c7 M1 Z0 Y3 F. v8 i7 Z. C7 t
enoughDataFlag = 100;
+ } Z I, ^ g: ?8 A J. ` enoughDataFlag = 1000;
, F' [7 b" ?4 x enoughDataFlag = 0x02;
; u5 R" u. ~6 A, L p enoughDataFlag = 200;- B- X- l) N" J1 V# S S; x
+ T3 N' x% k4 i8 u1 Z9 ?
int myfuvk1;: r7 B+ `7 G8 A. g' O) j
myfuvk1 =11;
/ p4 W4 n4 [' x& N' G
. S7 F! O5 L! y8 d( f/ |
- W5 M- z/ s5 ^1 I enough_data = 0;( Y6 v2 g% _; k' [. H' C, i
5 g" q, q! K" X4 |
// if(enough_data>50){
' M1 F& |5 ^8 q5 V: o// enoughDataFlag=0x01;9 M, R. v" g- M" W H
// }else if(enough_data<50){
0 {; n1 p( Q( i9 g// enoughDataFlag=0x00;//0x00还是不行. ~+ q* G7 \! D: K s
// }* X2 j" H' l% {* ?$ T
- P: i0 G0 n; T b4 n
+ L8 X# J) S3 r* M4 m3 A oo=10;* o4 ?: k: e# w% \2 P$ `5 b
oo = oo < 5;
) p; c4 p/ S! ~ if(oo){- s! x0 t; `/ r* r# [
ii=0;6 L& w( e/ e& O6 j! a! z
}
# |' |# W: w. x8 _0 N- v$ Z) Z) E if(oo < 5){8 s) s* d @( m9 ]6 D- I
ii=0;
) B7 G& y: U" N% s }
+ O3 \$ H8 F4 a, C6 C; y" m3 a8 V' Q if(oo > 5){
- X O, d% e* f0 v6 w ii=0;
* s" |+ Z9 @( B" Y* h3 r }, ^: x7 Y- T: y5 Z6 z7 e& t1 b! _9 F
; |, d! Q5 ]) e5 q0 `1 ^
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
8 \1 \- ~3 ]6 D" A: w- S /* 如果数据足够才执行主程序 */
% d$ f9 j9 j7 H3 x4 ~1 S, Y oo = oo < 5;
3 A, s+ ?$ u6 u enoughDataFlag = enoughDataFlag < 5;* X1 ]( w" o6 j# L$ l0 h
if (enoughDataFlag < 5) {3 c8 p9 K) ]8 H+ h0 }
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0; v' o6 a% Q* N# M
AGC_AGC(&pAGC);9 E, q% K! X/ E3 d
: s+ M( P5 H4 ~5 B c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
+ V4 ~( C; U$ f% V0 e FIRDecimator_FIRDecimator(&pRxFilter);
1 L3 b+ ~' T0 I9 v7 Y8 |
2 G) J4 K, @) y+ z# D9 z) Q /* Downsampling */
& W! J" K6 m5 s! E& P. b c_SymbolSynchronizer_SymbolSync(&pTimingRec);
) N2 M9 N+ B8 @9 W I$ }+ F; {5 s7 F$ f- v, a. g
c_PreambleDetector_PreambleDete(&pPrbDet);
7 H" A ^2 s" F& ~! s9 Z/ L( y2 B/ B C, [; B
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */- V( o& d9 E3 v- l% W# U7 c
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
* M% h ?+ D( r6 ]/ o /* %帧数量=100 */
4 }2 @. U* x# }6 K; P/ ] pFrameSync.isInitialized = 0;
: u# _/ G1 Q% \$ ^+ @/ ~, d# F. _ x
/* [EOF] */2 R& S0 B$ { j2 w3 F" l' L! e
/* 前导码长度是13 *// |; c8 E; p3 {
/* %qpsk */
& K- l1 N3 K: _. i pDataDecod.isInitialized = 0;
2 X% v/ E% c2 K2 k8 {1 z7 U* e- X. I J/ x$ k: y* I
/* end */
4 }" a! o; t7 c5 a8 |0 \! ~ /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
5 k0 }& k1 r& p$ T( M9 {' w; ]! J /* Convert 3-dB frequency */) {, _6 a9 R& X/ R
/* Convert 3-dB frequency */0 X: o9 Q- L( V! X9 s" J. H6 @
filtfilt(save_buffer, usable_left_filtfilt);$ r) k: _( Z& I; b
for (ixstart = 0; ixstart < 81000; ixstart++) {
' c4 c1 I% S x; [ I, o8 U p usable_left_filtfilt[ixstart] *= 2.0;& ?4 Q% e# n! k3 t
}
$ B+ N' P5 E- U" Z* F; g3 T7 j& i- D6 j6 L0 L: Z3 J6 i% i
/* 注意乘2,处理幅度 */
9 d: @: i( z5 u: y, g /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
, J/ U- O. O5 }/ X' E# z /* %% 行列转换 */$ H$ @. r' o( r& y* _% @
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);0 r3 _- m( V: @8 _1 E3 u0 a
for (ixstart = 0; ixstart < 81000; ixstart++) {9 N/ L, A2 i2 n" I) m
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
% ?" k5 N9 C2 n3 c" ` i; r% _: l$ o1 D - yiDuanShuJu_mean;' w5 M! m Q, i0 b
}6 c) m' _' Y+ W0 p
3 ^! X5 |6 }/ ]7 U7 S- k. O2 z /* %% 应该对数据归一化,但是这一步放在哪比较好 */" D6 A& S0 @+ k, Z
ixstart = 1;
+ E* Y% l q! v6 E9 ^ mtmp = youXiaoShuJu_QuZhiLiu[0];- a6 T- R+ f# W) l' \( @3 S
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {, K7 @) A7 @+ V, r. Q* v
ix = 2; I4 I% q! x% }1 e# h, { b# c- Y
exitg2 = false;
& b G, ^9 Q! J3 Z2 m while ((!exitg2) && (ix < 81001)) {
" H* {4 @2 V! w% n. b0 d( C ixstart = ix;! Y) \. A# F7 m( E: D0 r j6 I
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {5 b) e6 p! m/ L m, s) ?$ \
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
& Y9 D) H. F: W0 R1 V& | exitg2 = true;2 e. t" P) M+ a' B5 T, x7 f
} else {
( ?3 M8 H ^9 P* ? ix++;- Q( a, o& N8 `; u
}# m/ }) J" l% n1 n; f6 x# x
}
7 I1 O6 Y8 @3 ?. F' {8 Y }3 F6 t9 S/ k' M1 x6 L5 [
6 @5 @5 N' I+ G1 }( m& C6 @8 ^9 g if (ixstart < 81000) {1 |" \& G X( E/ A1 w
while (ixstart + 1 < 81001) {
: I1 G4 |# @4 U/ g0 m/ v1 ` if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
{" a3 [$ F8 S# H2 b: n& g mtmp = youXiaoShuJu_QuZhiLiu[ixstart];, f5 d! p, G8 Q% \/ |
}
9 |8 ?4 K. @5 b" s A1 J) d( V! U2 l, H7 {5 F$ \3 Z0 o
ixstart++;2 X/ q9 V8 D( J: K8 z0 K/ x
}
& E; G! x# B9 d6 t9 n. i+ { }! I8 d6 U3 t; h# H# @7 A8 e# s: c
; x5 J+ Z) b* U, E7 Y9 t; I+ b% h2 i
ixstart = 1;3 D% u) Q5 n7 q$ I4 L& T0 T& p
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];: _) i" A( V4 D$ ]4 g
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
" j7 b3 e0 `9 z$ h' |9 p& P& O+ g( e; c ix = 2;$ z0 U7 y! [) I7 \1 R5 s3 n
exitg1 = false;
0 b; A n/ {- d5 D3 Z; S1 ]/ M5 o while ((!exitg1) && (ix < 81001)) {6 N0 Y% }8 @" V4 f" ~, T: `$ G
ixstart = ix;$ D& o7 O: S2 J1 [6 h
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
/ p- H9 g' Q* j |) d yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];4 l: ^1 E. g0 }) Q1 d
exitg1 = true;3 P: L% v; k* d5 _8 W
} else {
- _0 b0 G* b X ix++;
9 G; i% h O$ j! ~; h3 @ }
3 I) |" r: c: ?( V* M }
" V7 k7 {; R8 {) p: Y$ \& I! J }
' Z5 z8 H' h9 f6 _+ n
+ [ y: Z# X( P) G/ x$ A7 P if (ixstart < 81000) {( e1 K1 j. |; O+ S( V4 Q+ j
while (ixstart + 1 < 81001) {
4 Q) J' S4 y: }+ h4 ~ if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
4 X, ` S" c% a yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];. y# y+ }7 W e
}6 s# O8 O( v ]) O2 p
$ g: [7 x9 y2 W# g+ A
ixstart++;, I# ]) [4 m* g; l4 r
}. B4 t' m' h6 z& V( V1 p; ~
}
: p I3 \8 S# A6 K+ i1 u8 O& ]* [5 q" R" [9 N
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);$ W0 B" ?/ C" I# C9 q
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {1 t, p! z; r( e0 d1 w" E
yiDuanShuJu_mean = mtmp;! _8 f. @ ~2 Z# j
}+ y1 U; s! Y" k: z8 J* H; E
G. U1 k; i! [+ [' p /* 找出极值 */
# L! v/ V& l6 v! |" W+ L7 ? for (ixstart = 0; ixstart < 81000; ixstart++) {0 [* k# k! W, {
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
" z' T* h! X0 Q- e }2 ~1 @2 d: k# g9 E+ d% g
s+ Q2 l: l8 o$ ~6 L3 q0 o --------------帖子字数限制------------------
+ N$ S- h: W* e7 x' N9 O}
2 [* g% K: H& e m) M0 {! N$ q/ c! j6 g! [
1 F- J& z! P: O6 x4 _
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|