|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
) k2 i- x4 K) V# l$ i" T0 @" X3 R. M7 x9 g
各位大神:
/ w5 Z! g. C$ ^' _ 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
- b2 |/ e9 X- b 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
2 T7 w) J0 v; P) T- b; A
! j0 f) C: y; } @5 J2 s
% K C5 ?4 { [: [0 z4 r \6 p这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
8 u C7 W+ A- l. l( t7 d. Z# n% M) T) b/ \* N' h
并没有其他线程0 Z! A+ Z4 N7 T8 ?+ v- c4 S
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
" a- z. k" [# s W) k% N! U( ?0 z也说不定是和堆栈有关系。。。。。。
3 Q8 h. ]/ D9 Z$ M! L; |3 g) ?. \) Y% u请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
( A2 x X3 G3 T( F W* g: r6 Z$ j D% I. s0 p' }4 I* h
/ |+ {5 F' t. t$ x5 S1 r, g$ t. V0 y% X( M7 o) Q$ W* B$ \
我也很绝望啊,希望大神能帮帮忙,感激不尽,!* y- p" u }: h7 k. D8 C' l# _; ~0 }
' ]8 X b$ j7 t( @ k
2 l8 z0 i4 q5 u0 r# d3 ^
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];4 N: F2 M' ^1 L3 K/ R
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。( ` R E: L, M
) ^9 I& y3 v' yboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
! m) j' u$ B1 p; u const double data1000[1000]) {: y( g* O0 q6 N
4 Q5 v- j1 A" w0 q% i; o2 d, J int myfuck;' B" P/ n; O3 u5 j- o/ @
double yiDuanShuJu_mean;
/ K, Z- r/ O) ~# b& h& S U double yiDuanShuJu_LowMean[1000];7 a% v# Q4 B: b V8 m; }
int ixstart;( v2 N3 t2 d2 V4 k7 b* {! r0 ~9 P2 ?
double dv0[1000];1 e- n1 x# J' I
comm_AGC pAGC;
: e" F/ z4 F5 w, H9 x comm_CarrierSynchronizer pFineFreqCompensator;+ z* C1 @ g; t* m+ W' Z/ j
dspcodegen_FIRDecimator pRxFilter;
( O, C5 W9 V3 a9 J comm_SymbolSynchronizer pTimingRec;; h$ z7 Q3 D$ s1 x: N0 x
comm_PreambleDetector pPrbDet;
2 y3 j5 m+ y% Q2 u2 C FrameSynchronizer pFrameSync;
" y7 N! q* e6 l7 {# P QPSKDataDecoder pDataDecod;0 R: z6 l9 }; V( p. T
static double usable_left_filtfilt[81000];( Q5 U0 U3 ?# s( ?& F7 [/ i
static double youXiaoShuJu_QuZhiLiu[81000];" {3 N h( u; Y( v! F8 s% H
double mtmp;
5 n1 L4 u8 Y5 [ int ix;
' S' ~/ r1 N, b4 C9 |$ @* U boolean_T exitg2;7 a5 f* |8 A5 e2 }8 C
boolean_T exitg1;" J) h5 {3 n2 \5 ?1 z ~. I
double YiZhenShuJu[800];
# h4 m5 C6 c! C- k( ?" ^ double dv1[800];) M3 s$ A0 \/ F% X. P
7 _/ Z) \8 o# }- E: G! I" b/ g1 j8 K
8 v5 t4 k( H- u! U" v% | double b_YiZhenShuJu[800];
1 n: u7 q- Q( f0 o) l6 G double I_filtfilt[800];
* p/ b& d0 ]' [ double Q_filtfilt[800];" n. e% s& V& y/ f3 g
creal_T b_I_filtfilt[800];
; d5 E/ s6 P7 q n; o0 @ creal_T b[800];
( [- B! z1 i8 ]7 z# {9 t5 B9 C creal_T RCRxSignal[50];
, j. A! I/ S1 x# \ P creal_T fineCompSignal[50];7 {2 {2 F0 Z" p
double phError[50];$ w) f5 u+ E/ W/ H- Q, E w% U
creal_T timingRecSignal_data[28];
0 z- _% L( f, T% J/ ` int timingRecSignal_size[1];
?8 M k: N" F% h& `7 E6 U double prbIdx_data[28];
7 ]2 |7 d9 r; Z int prbIdx_size[1];. p! Q4 D' Y+ {
double dtMt_data[28];- Z+ Q/ { y+ z; x; _
int dtMt_size[1];
& ~7 t Y0 M7 b! L3 [$ I. Y creal_T symFrame[25];
3 ~6 l0 Y. C% a$ q0 j2 [& ^ boolean_T isFrameValid;7 P$ l' [) u8 u& `. E- U
double unusedU0[3];
! h0 `& S+ k8 Q# p3 [6 y# t5 u. R9 `8 c
//调试过程中的变量
( P8 n, L3 p% h" Z- Z+ ^5 O% m) G int enough_data;. {" s2 S7 J8 i( C) e
5 s: n# c1 M m$ |
int enoughDataFlag;
& g% o U1 z$ b int yiDuanShuJu_mean_int;' K, d' J0 u: w# @& U
int int_sum_dv0;# n6 w7 _) k r/ z5 ]$ ]0 [9 o
int oo;
+ Z+ C8 C6 B% i# o9 T1 o/ w; { int ii;
8 ^3 S: L# p2 F" t' o myfuck=10;
* T+ G* i- K8 T% n* z /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
) T5 r+ `* x; P5 y1 S /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */0 A; u; V0 m3 |8 X; ]- \) O
1 U2 O4 c6 ~4 {9 _7 j6 J# h yiDuanShuJu_mean = mean(data1000);2 U' |) [$ I9 o7 \& d! U( ]* s. s
% E& @. i8 e7 v; l9 G yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;$ R, a4 n' }+ P5 E4 J
UARTPutc('A');# I3 k% J% A" F) u) p* E, J X K
UARTPutNum(yiDuanShuJu_mean_int);
: X3 W1 F. P( R1 q# o( ~/ O UARTPutc('\r');
- \ W5 T2 `7 {. { UARTPutc('\n');/ ?! J5 y+ T& U' h
! S' k# s! Q8 d0 ]5 H( |2 n2 t
for (ixstart = 0; ixstart < 1000; ixstart++) {
& n" N9 W% C! G+ \4 z& w yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;+ D, W' |% {" O; z' [3 m1 `& g, x
}
" I8 ~ M1 J: x1 F& Z3 X& U& C$ T: F b& `) m }/ t4 C
power(yiDuanShuJu_LowMean, dv0);
* F: f7 O6 g8 _1 H- E% {% E3 ^& w8 ~, W1 c6 C7 f! e2 ^3 f$ Q+ o
int_sum_dv0 = (int) sum(dv0);" J' m) f3 K; X
& t% S/ k+ J- R8 M% e
UARTPutc('B');. V( j, H5 f# X, m; s% h
UARTPutNum(int_sum_dv0);5 @ q" N( A1 z8 u, @. m
UARTPutc('\r');
2 M2 @6 f. ]( ~5 T2 T$ Y. ` UARTPutc('\n');
7 O) j! B i" P r8 Z" u/ ]6 `1 m
8 s# F, x S9 H4 a! c+ }// int compareFlag = int_sum_dv0 > 1.0E+8;
) W8 K0 n2 B. S! x: O s0 i
" s: C! |8 v$ A& t. S, ] if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?' W6 _4 R$ r9 u( r( j
UARTPutc('C');
+ v+ p# Z" f; Q9 j& y /* 比较信号能量 */6 u3 a) ^5 ]5 p) x) X
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */. C' u6 N# a |) K& ?2 L1 X
// yiDuanShuJu_mean = 1000.0 * youxiao_k;& y; J. T. r& C2 ~8 W3 [9 _: o- I1 b
// for (ixstart = 0; ixstart < 1000; ixstart++) {
. W" y' U9 i1 I+ f! x+ q// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
, B8 f, s8 G+ h% m// yiDuanShuJu_LowMean[ixstart];
- }4 I0 X& y4 l8 M- d) A// }
! x0 @! z' B; U- f. u! i A//2 ?( ?5 r O( b0 i O2 H S
// youxiao_k++;- n# Q0 Q. ~3 I# V! j4 F- W
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用== i9 u: @* F. C& p# l+ y, P. i% }
// /* 感觉要取21个数,即0-20, */
- P. K5 s3 U; v* i5 C: t// enough_data = 10;//有效是10,无效是03 i( C: e$ V7 T# k
// }" i9 H* t; d% [* v& N3 e% t, T. J
}
6 u" C+ y; l4 i# Y9 ^' s/ @) Y; e- r
$ n$ Z& L6 z0 s% @
enoughDataFlag = 100;
' s( F1 |1 o# a, R! \ enoughDataFlag = 1000;
" i5 t$ E, V) \ enoughDataFlag = 0x02;
" @9 t& [) I+ t S6 p) e3 w) X) U enoughDataFlag = 200;
/ `" v3 V' S6 L! I/ j0 K, }* J
3 V D- z2 L! a& n int myfuvk1;; I+ w6 F4 j' C* M
myfuvk1 =11; M& I; Q f) i" v6 X! Y$ T
2 I- [# P0 q6 _" j* @# n F1 H- g; |. E/ `$ m
enough_data = 0;
" Y7 q2 d$ t9 d" X+ Y/ N e% K0 Y) Y/ n6 }3 H
// if(enough_data>50){
* P, `: q, I2 b+ j d7 B// enoughDataFlag=0x01;+ ~+ h& H: `5 g U9 h/ h$ _5 V
// }else if(enough_data<50){
- L9 _: c" x* x) b// enoughDataFlag=0x00;//0x00还是不行
; q$ j, {* f: @// }6 `1 C7 w/ w$ o* d2 _- t
; _: f% `, {9 k% e6 X! ~
: A7 N n. ^1 Q' [: Q) y: L
oo=10;/ V0 ] w- B9 }+ }; y7 \- r1 b- F
oo = oo < 5;
" b2 U# i" A+ c8 v, d if(oo){1 s+ W& i9 H8 ]4 b
ii=0;
) { |5 H7 `% z6 t: H7 x }" ]6 a) Z" o/ I) H/ c
if(oo < 5){& d: C r; t4 c. n. d
ii=0;6 s* T) r, b2 Q' d7 s
} a0 S* f* }, R8 \ b4 }4 q1 ~8 ~
if(oo > 5){0 k5 S: s/ l# n2 f, f
ii=0;! n: A! H* {7 S
}0 u/ ^2 |4 ^9 ?# f9 Y
, |6 n/ Y" n1 X8 p: v7 S /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */. X* }, s( Z/ G7 `) C' |6 v1 U, o# T
/* 如果数据足够才执行主程序 */: Q5 m, z0 K- G9 k P5 v
oo = oo < 5;
- K; F4 u( ^1 I enoughDataFlag = enoughDataFlag < 5;
; f: J' T9 A5 c0 T8 { if (enoughDataFlag < 5) {+ ~3 Y: E0 H( L
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
3 f/ g+ ^; ]. I AGC_AGC(&pAGC);
8 w1 J$ }/ l! Q+ J/ J8 g# k1 r+ {4 V" k/ V2 T6 N& z! Z+ E
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator); z3 X+ U$ x/ f, M- l; a' d
FIRDecimator_FIRDecimator(&pRxFilter);
' z% v1 p, v4 K' X' B
6 M' T8 |1 N$ K7 V4 L9 q3 ^- Z /* Downsampling */
6 U, B4 W1 p" i0 D: O* p c_SymbolSynchronizer_SymbolSync(&pTimingRec);. q7 X& R. _1 {% e: W& ~; j9 B! [
4 M$ i$ z- n7 B
c_PreambleDetector_PreambleDete(&pPrbDet);
8 @* }6 q& \8 Y# t' C- W" G: n d
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */( u9 Q# m0 \# l( j+ V
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */0 v4 z) w. f7 N1 d) ?
/* %帧数量=100 */
' M7 P% J- C1 g4 U3 V* \' D7 U pFrameSync.isInitialized = 0;
# u2 a3 u7 `: `; _& |) ]1 j. |# C$ r0 r
/* [EOF] */! v" q/ v% E) H% a: _( c
/* 前导码长度是13 */
( |% U, {# G( d# Y /* %qpsk */( j3 u, ~/ U7 g n
pDataDecod.isInitialized = 0;) S0 G; s7 K& Y9 N1 q
- e- I# j5 K* a+ k
/* end */
& a" e# Z2 O3 t; U8 M g" P* C /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
( h# W$ @' |% J- p* u" J1 g /* Convert 3-dB frequency */% Z4 r+ s- J4 @
/* Convert 3-dB frequency */: l' F' Q' q; @0 @6 G
filtfilt(save_buffer, usable_left_filtfilt);* ?6 h% Q6 ~3 i
for (ixstart = 0; ixstart < 81000; ixstart++) {( D+ X" A; O: b4 f7 f
usable_left_filtfilt[ixstart] *= 2.0;/ i! y, P& K* u- B9 M$ h
}
1 d, u4 |7 g5 d+ ~2 a
( u# I; O: x# L" C /* 注意乘2,处理幅度 */
% i+ o# C0 ?" G1 B1 M3 }( \ /* %% 我发现带通之后其实就均值为0了,不用这一步了 */9 r6 Z: Z6 F6 H# l S
/* %% 行列转换 */2 ^/ {$ n8 E2 @2 ^8 q
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);$ `7 s- x; Y8 y8 W
for (ixstart = 0; ixstart < 81000; ixstart++) {8 V) A# b0 l3 g+ f: i9 g$ a
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]& u7 e, h4 H K' _9 q. r
- yiDuanShuJu_mean;& _1 }+ K$ n2 h$ q4 ]/ B3 M
}5 w) r( J- [, z% x4 L+ w
8 Y! ]4 c+ n& s5 ~1 J
/* %% 应该对数据归一化,但是这一步放在哪比较好 */; \2 S1 Y0 G" B% _) G: n3 W; f& U% U
ixstart = 1;& ~& R/ R3 N# G7 \ p
mtmp = youXiaoShuJu_QuZhiLiu[0];
% e+ Q* b2 Y; g3 D! f3 K% E) J3 ]! V if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {; P$ J. I/ S5 k) M
ix = 2;
$ M2 G$ u8 \4 Q1 W* M( f8 m% [ exitg2 = false;
) C9 F; Q ~+ _: }. N7 Q8 N# A2 b while ((!exitg2) && (ix < 81001)) {6 l* _, `5 k1 D5 [/ H
ixstart = ix;# `7 z* n! W1 q# B0 K5 \
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
; W7 E. F% ^5 p- | mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
H( d2 B: E# C" G8 ]' L8 U* z+ A$ T, S exitg2 = true;; J% y* N1 ?" `1 i1 `1 S/ a
} else {! {+ s. \' x% m, j8 L
ix++; t- B5 x, O! ~" u: T3 b$ r
}
. @+ F; y- G/ G, p' o9 C }: A2 n' v3 P. r
}$ w# i8 \! c. F% ?5 z. c1 k
p+ _& D/ c7 G' _) U if (ixstart < 81000) {4 v* L( H7 z1 {3 \9 } p1 R0 u Y
while (ixstart + 1 < 81001) {
3 M5 [2 f: {3 `$ T if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {; D8 w2 Y5 D: ^; L0 P
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
+ Q1 l3 r+ Z7 N: @1 M; s3 [ }' @8 M( r3 u1 l' C4 d
9 Q" { W: w' a- U7 ^0 z- p1 H ixstart++;
7 y0 X: Q q, _2 ~7 N1 k' s7 b }0 E! R7 _$ I* O: Z) l; S
}
' w# b3 X6 r- {+ @- J/ O3 y7 q9 v& x, n' ?
ixstart = 1;" T$ R! a+ t1 F
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
% q# C* g O# O) c if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {; [- m4 ^. s7 d1 E3 V1 r
ix = 2;. S5 C6 e5 V9 B
exitg1 = false;2 ~0 T C# E0 y7 e8 t3 T6 Q% f8 @
while ((!exitg1) && (ix < 81001)) {- O+ ^' Q" m7 O
ixstart = ix;2 M3 \( i5 x, M3 [: V) l6 ]
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
% M Q2 p& z. b# S yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];1 a9 q1 n. l" B0 Q9 |
exitg1 = true;0 K! ?+ z" B0 \3 H, W1 x
} else {+ i: i/ t0 M! G# ^6 c; ^( R
ix++;7 l( b! I6 |4 N& h4 C
}# W5 \0 G2 r3 y# e2 y6 l% m
}
: g" I, Q) F. A }
: N5 z2 s: L, X6 f
+ ?4 p$ m3 m ^* w7 C, Y/ T if (ixstart < 81000) {% m) P. [& Q# x* R& p! S8 O+ M
while (ixstart + 1 < 81001) {
" D. r$ \( c# A! r& L0 `* V. N if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {9 Q( k& n9 @! o* W& Q
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];; _! J% M3 @" Y; |/ ]
}
0 |$ ]0 R3 i) Y/ ]. |
5 r) G/ k- N, g" K$ V6 b ixstart++;
& q" c9 Q+ I- y' K3 v- E/ [9 K }
7 a. z; k# y( s9 a }
2 ^% C* j+ \5 W8 ?$ y! Z; y2 P. g7 {8 T2 p
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
0 I5 i$ I/ [( l5 U. g5 W5 ] if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {- F; {, A3 M% f: F, [7 U
yiDuanShuJu_mean = mtmp;
2 O( Z/ \* t4 I. Q5 f }
6 m! d" K# a* [) j) z$ e% k- u, r: o" B- _5 H8 ]# L
/* 找出极值 */
+ r$ Y& i& c2 O+ B for (ixstart = 0; ixstart < 81000; ixstart++) {
! `: R2 f$ Z K. d. E; d3 { youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;5 k0 D9 `4 A& z+ g- J: \( n
}
) g, r: `$ }. f- P: ?; u
! }8 a- J" j s --------------帖子字数限制------------------
4 v) W0 X' v: n0 y( b& S5 R {3 b}
# b1 O1 Y8 u3 v4 D, D; b4 }6 O% R E' E# S! Q% s B- M+ j
( O/ f$ Q2 x/ {( g# H |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|