|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
. j/ y. r0 u/ O# u0 w' T
% ~$ ?0 H2 Z% E4 I7 u( E; V4 L7 C ~各位大神:. z D9 D4 G. p5 c% W% w( D
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)3 \% G6 p$ a5 \* N5 w( E9 @1 Q
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:( m( [$ J8 b' z, e2 r9 ]
/ a( ~# x8 r; H% ]9 U0 v. C ( Q' R) R6 F3 M9 ^
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
9 f& f8 _5 n0 x. K
( |8 |' Z- T; c5 V/ x/ f1 ]9 f并没有其他线程
+ i+ C/ ^- B* p3 S7 c反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
" a3 I% l" h2 ?4 |0 G也说不定是和堆栈有关系。。。。。。
+ {9 {/ j7 ?, @7 {1 W请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
* i& e2 A8 `9 \2 {+ {0 Y& V! j Y: r# ?8 J* s
9 F. U' C: r* B! ?: T* K, l c4 O. ?
我也很绝望啊,希望大神能帮帮忙,感激不尽,!! z. d; a2 q' e7 w7 @. `
* T+ r6 B. M2 O8 `9 ?
. D# w4 }' Z2 N. n$ {7 }4 X附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
" X, Q1 [! @6 f( L& c static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
4 k4 ^. {. _2 h- n2 W) C' `. O. ]: t6 t( l" k, H
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
% z6 ^* f6 |# s1 @" { const double data1000[1000]) {
8 b$ K( p. H' Y ^) G& W4 `5 N: x; J# U( D. x
int myfuck;
$ j0 k3 l& d N2 W6 {! S" d% x double yiDuanShuJu_mean;
& c" h2 j- K+ @/ L" T double yiDuanShuJu_LowMean[1000];6 p" d6 d, k1 f3 _( T/ h- I0 N
int ixstart;: G3 A7 l% _4 n
double dv0[1000];, v% \. | R6 v, v! f7 S6 ?
comm_AGC pAGC;
; S! m( U; R1 H3 z comm_CarrierSynchronizer pFineFreqCompensator;, ~' A, i4 O7 }4 w& D6 W# x
dspcodegen_FIRDecimator pRxFilter;3 m7 z7 \7 L: q$ F
comm_SymbolSynchronizer pTimingRec; `: f# Z7 ~ y/ H5 g# U5 `/ R; E
comm_PreambleDetector pPrbDet;% o6 C- P1 G% S2 X/ M
FrameSynchronizer pFrameSync;
* L0 X' T9 m' P; x$ ` QPSKDataDecoder pDataDecod;
" M/ j& e) b6 M5 `* m9 V1 ^4 W static double usable_left_filtfilt[81000];0 l1 c: G" ~8 p. O
static double youXiaoShuJu_QuZhiLiu[81000];- w& L4 q3 w( ~) P+ ~5 a
double mtmp;- U4 q0 M: `* O3 ^' L, k$ _8 [
int ix;9 ~ X) C! N. l& ? V0 ~2 ?/ F& t8 F
boolean_T exitg2;5 A4 w5 D c. ]6 \2 A( T
boolean_T exitg1;
$ E4 N5 F0 O; \) t. X" B double YiZhenShuJu[800];% \- D1 A$ x7 V" o) Z7 c
double dv1[800];" e* K0 K' r) T8 ^3 U1 d! Y
9 T% `+ `/ H b
0 y2 Y" i) A8 _0 D, y4 I double b_YiZhenShuJu[800];
- Z7 v( u# H# {( ~& t5 ?; [ double I_filtfilt[800];
" C+ F% `$ Q4 l# x+ G! c+ u- { double Q_filtfilt[800];3 }6 H+ C8 ]( D9 v/ ~1 x! v
creal_T b_I_filtfilt[800];
& \# H+ O% _- `! C/ @9 i creal_T b[800];0 h) F& X5 l9 W# `* E
creal_T RCRxSignal[50];
& Q' }; u/ @, @% Q: C9 ?& h( N creal_T fineCompSignal[50];+ s( I u& g) }0 p7 Z p4 x6 G- C
double phError[50];2 I6 q* K0 @: Q, w
creal_T timingRecSignal_data[28];) F8 r$ s$ J( t2 l1 U4 V' R
int timingRecSignal_size[1];
/ n. P) K1 G" a2 z: R* c' O double prbIdx_data[28];
$ ]# y" S' I6 B) o$ l: t4 l2 w% Z i int prbIdx_size[1];5 G9 B6 s4 I$ Z+ m+ F
double dtMt_data[28];/ ~8 t+ q0 ^5 p7 ^& a9 @
int dtMt_size[1];
- W9 N8 a. W, @" Q4 U5 k1 G7 | creal_T symFrame[25];. C( p) W, ~/ M& [/ |
boolean_T isFrameValid;
! a( O! I1 t) |( B double unusedU0[3];
- r8 m) g8 Q% R+ K% b L. K- ]2 W# |: I% `
//调试过程中的变量# c8 v6 S& F$ X. S
int enough_data;! {" x O6 r4 _; o7 Z6 U9 i2 k q8 |
1 k, I0 x% ]' `" R, @
int enoughDataFlag;& I0 W ^( A/ }1 w
int yiDuanShuJu_mean_int;* I6 [ c$ c9 [0 a4 T
int int_sum_dv0;# R4 l" \" A. n; v5 }3 U% l4 ^
int oo;
+ ~) \( o7 \8 m: @ int ii;% {1 k5 {1 L8 \( K: l% N5 A
myfuck=10;
8 p* S2 K" T2 R7 M- g8 x /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
, M8 \; t8 U1 B# C" x' j6 S /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
% z: O% d. Q# a
0 g+ J% a2 R) F' w yiDuanShuJu_mean = mean(data1000);) c/ ~9 k4 D& B: @" {) w# F' t
- _/ R M: R! g yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;* ?" ^4 Y5 e! I! P3 W1 c, |
UARTPutc('A');3 \% V6 B2 p" G& o8 j3 k2 z
UARTPutNum(yiDuanShuJu_mean_int);6 ?+ @% M X. a2 |. c
UARTPutc('\r');
/ e* i! E7 z+ `. i$ ~ UARTPutc('\n');4 h" X3 v# ^$ \
3 a) Z. S2 a% ]2 Q% w( U j for (ixstart = 0; ixstart < 1000; ixstart++) {
( G8 }3 f( C0 k( g F yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
* s# i' _/ o3 K, x }
9 c$ Q6 C& _' c4 t2 T" G1 r( J; i& l
power(yiDuanShuJu_LowMean, dv0);
+ s" j! C$ Y z- f& h3 l# a+ D) e1 N- I+ e* W2 m
int_sum_dv0 = (int) sum(dv0);; e4 y3 ?% v1 ^0 b$ M4 s
( A: j4 |1 Y$ s0 t
UARTPutc('B');" L! @# B+ l6 m! Y
UARTPutNum(int_sum_dv0);% x- c, r: H/ R* {3 o: C% W( o( i: J W
UARTPutc('\r');8 S: {' M9 t1 ` c Y, c
UARTPutc('\n');1 H' `# |6 L. W1 w {
+ Q5 t& b: h! A
// int compareFlag = int_sum_dv0 > 1.0E+8;
8 L4 U0 c. R3 Z8 ~# e- m5 x, t1 E
: [: [4 c- X1 B if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?: b+ P" q8 i$ |9 ^* X3 E) j
UARTPutc('C');$ h t: R7 `5 s2 n
/* 比较信号能量 */) G ~* T. f4 e8 p- y# p
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */" a* o" q+ V8 J8 |# J7 ^
// yiDuanShuJu_mean = 1000.0 * youxiao_k;' [1 H; i; f3 t1 c
// for (ixstart = 0; ixstart < 1000; ixstart++) {
9 d7 e# Z9 N9 z; X8 P0 p u// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =4 G; e* T3 D7 Q" ~% X
// yiDuanShuJu_LowMean[ixstart];
, V- ?5 r! W* ?// }3 I$ w( ]! F d
//+ y/ ~% H4 {; E( J! g( @# i
// youxiao_k++;
# I( b. x: c# _* o3 x// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==" E2 b/ ]) d9 {8 `1 P. Q( {+ ^
// /* 感觉要取21个数,即0-20, */
3 ?* ?+ X" b4 |, H2 _3 l9 j# R// enough_data = 10;//有效是10,无效是0
/ ?& E& R7 z: F* K) b, M6 ~) \* W// }
& X( _! k5 b$ n }
9 D) v1 E! q5 i4 [4 v( C8 [/ [* G8 j3 ]- u+ l& y
4 B0 {- w& b, V- C4 C4 n enoughDataFlag = 100;) a. F# e# \* m7 ]- ?6 c
enoughDataFlag = 1000;' y4 J& L3 x- c* b7 M! T4 [
enoughDataFlag = 0x02;
: J |5 p( a4 ^ enoughDataFlag = 200;
9 N0 {5 ^" P* _3 A8 D
" \* g( p; H; H* B2 j, P+ A int myfuvk1;
. ^" A9 C2 O( J7 _/ r# r4 i' i A myfuvk1 =11;/ ^$ w' G- r& O7 `. N3 w& V2 y) e3 f% f
$ }+ X/ l5 A* {$ T" E" ]( K5 I0 |" {* w. Q. u
enough_data = 0;
# H; g! _; J# e
2 B" S4 z4 A6 t `// if(enough_data>50){! D% r* e. w7 [/ T% J
// enoughDataFlag=0x01;
6 X% {' t$ J! ]2 i) d/ i- i: l6 `// }else if(enough_data<50){
( @8 G9 P2 A9 i; N" ^; S// enoughDataFlag=0x00;//0x00还是不行
; |0 H4 B* f9 P1 R// }" p1 ^0 f( {" d w+ V* d) E
6 F8 F9 A$ b4 o+ n& {; u: V- U! c1 z0 T, Y: c
oo=10;
2 _$ ~# D) ]2 Q W5 ]% d oo = oo < 5;5 A' U. h& N- C; m+ _+ w- V
if(oo){
, X9 d; V- Q- j- @- T7 j ii=0;$ T$ W6 J) }0 \/ P/ b+ B
}
3 V* C: |' [9 B6 U. U/ h if(oo < 5){
- ^0 m6 S4 U) o M y( Q6 g" X ii=0;
- j0 |/ j* F6 H y# e }) ^% l' P1 m- c9 L) i+ }
if(oo > 5){; }0 Z& _+ C# ]" X( ~: T
ii=0;
# z5 f6 h. y+ S0 k6 Y3 q$ B( k9 b }: q' p0 V" {9 `/ `3 F9 ` q
6 X a) g) W9 \! p
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
( a# p+ Y, g0 M- j; n /* 如果数据足够才执行主程序 */+ y) C" r& E; i5 n# L
oo = oo < 5;
) @6 I9 p. q% X enoughDataFlag = enoughDataFlag < 5;- \, e# f8 n7 \8 `0 \
if (enoughDataFlag < 5) { \. S( s# L% g5 F, v8 O+ L
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
: l# c5 w8 @: j" s$ d; k8 [ AGC_AGC(&pAGC);5 O9 t% ^2 N8 j2 [! [7 G
+ o' r, ^( n$ @0 N6 f
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);6 [- d6 \+ T( |5 o3 Y
FIRDecimator_FIRDecimator(&pRxFilter);( l% V3 u9 p; G e2 |$ \7 A6 G/ X
& e! a3 [% W$ }* T2 u /* Downsampling */
- c" B) P. r, K& q; ~& k, R c_SymbolSynchronizer_SymbolSync(&pTimingRec);
! G6 a' B3 W8 }5 c6 Z7 m# `. j
7 B1 P2 t. |* C' k; X; J! f c_PreambleDetector_PreambleDete(&pPrbDet);
x2 P- Z) |% }, |: j9 e! f& q4 j% q
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */3 ~0 Z( W6 M2 ?: A6 T- Z
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */7 u3 e3 I2 u( H% D' g6 L
/* %帧数量=100 */# d. A# O- ~3 \# q" d( {
pFrameSync.isInitialized = 0;
9 y. j( y' G( {# B0 j* q) L8 U8 V3 q7 m7 A2 z9 u, D
/* [EOF] */+ l9 ~; _ ^# t. N/ c
/* 前导码长度是13 */5 M, e- p/ I; E+ Z4 ~
/* %qpsk */
M4 t' E+ f# g, B/ C- A& p pDataDecod.isInitialized = 0;
# W9 D, |( A' x, F3 q1 S: n& h7 }- G8 g
/* end */" ^# J1 a8 N5 Z: X3 q
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
- j. j* H: u& p! E" w- D /* Convert 3-dB frequency */
& p! T8 K; D7 F- M6 o* p /* Convert 3-dB frequency */
. j! } q( k" j7 I* i filtfilt(save_buffer, usable_left_filtfilt);* `7 M' H) b2 ~ A5 A$ C
for (ixstart = 0; ixstart < 81000; ixstart++) {- D! ~& }6 @' h3 h& _# d
usable_left_filtfilt[ixstart] *= 2.0;
1 a2 g$ }2 Q& `! R" p }" U- H; c3 H! A7 M3 M9 @# }
2 |0 f4 Q7 z z
/* 注意乘2,处理幅度 */& ^! ^$ @% G- _0 b
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */8 w" P7 Q5 B/ m5 y3 i
/* %% 行列转换 */
7 s* v* \6 i2 U! V yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
j( @, t( s$ D& B+ M4 y for (ixstart = 0; ixstart < 81000; ixstart++) {- g; Q2 A" ~$ |1 f1 h
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]: y. Z, c0 R. O6 p5 a4 k
- yiDuanShuJu_mean;
8 R- }0 J; m& ]2 i9 Z }9 s# A/ z! N+ e4 U1 Z
5 Y/ t$ }; r. {4 ^; w( ` /* %% 应该对数据归一化,但是这一步放在哪比较好 */8 ~% t# D/ N6 t, m, u# J, W# v
ixstart = 1;6 p# C, s, v# O" o8 i( c
mtmp = youXiaoShuJu_QuZhiLiu[0];) E3 s# R5 Q& m N" M1 W
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
! ]: m! ^! F$ d4 s8 C" a5 u' Q! Q ix = 2;* q+ w" [0 U p. i/ V w
exitg2 = false;9 k" ~ `, f" ^; s; o+ ]
while ((!exitg2) && (ix < 81001)) {
4 p) |2 ~) u- f& f- D8 n- t ixstart = ix;4 @, l0 r- V( @6 G. V' ?7 D
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {+ m0 N. ]' b t& @6 G3 [
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];% S$ I0 Q, X- ?0 U. P6 `+ {2 i U3 Y
exitg2 = true;% V* ]- F6 h0 X( M* ~
} else {1 w0 L/ Z1 L9 f- }& [& `/ W5 A' n
ix++;
" C& U4 o2 V5 z& p& a }0 U1 j* u7 b7 p( z
}" T9 W ^3 |1 s5 C/ c
}$ k8 @ m. M* p! N$ M5 u# T8 c
5 n3 k' ^4 b7 R- Q if (ixstart < 81000) {
/ P; z! \" g' t9 J b while (ixstart + 1 < 81001) {( L) }5 N! J- c0 L% Z
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {5 Q- X4 M1 k, R6 b* ]: G
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];! o# {3 O! ]& d' M/ y8 D U8 ~% \" I
}
: r. R# u1 g' m$ W
- ?; N' K! F x9 l' q4 S" r ixstart++;
& k- u5 i. ^: |5 ` }6 ^" L% X' O. O
}
+ d/ V d2 i! a. K3 g9 y& y
! C* s/ l" q1 x4 O l ixstart = 1;
; x; J1 V) O& T9 H. }8 p) H yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
U+ }% f6 m' X. C8 H/ [ if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
' }, s3 Z+ ]; p ix = 2;
! l @, u F- j( r! m2 H exitg1 = false;# x- i9 ~: Z3 ]8 d
while ((!exitg1) && (ix < 81001)) {
, N4 @' _* T B% i. b ixstart = ix;/ n* Y6 R) [5 v
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {* L4 y h) a1 k: u
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];9 |8 b s$ x) H8 a: }5 \& e4 Y6 U
exitg1 = true;! ~7 X$ g7 d" q! T/ D
} else {
0 M3 p; @# v9 p8 w! L8 v5 D" t- U ix++;
2 J" t0 U2 `* w4 d }
5 Q/ a6 ^& b& w+ n- \ }
" u6 a( V' G& M2 a! B }( z' C# Y* w' Y% D
1 \6 { |' n( E1 a* Z8 ]& @: Z2 ^: d3 `
if (ixstart < 81000) {
4 b. S2 [- J5 x while (ixstart + 1 < 81001) {# c! x6 p4 Z& t
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {9 S# [ q% x: [/ e
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];$ w C5 g# s8 _ }2 O
}
! O0 w# y$ F" j! b$ ?; {5 k. B! d; d
ixstart++;
6 d6 p5 O, w" K }0 m6 J2 r$ k* O6 ]
}
9 {8 `1 J6 j0 l
! I# k2 D5 Q& B5 W yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);; ] N; F; ?7 L+ @. {
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {# X3 t0 H5 B9 K' ?- B( b" T& j
yiDuanShuJu_mean = mtmp;# I9 ^3 X" j5 d* C
}
5 Z) n0 q3 ^! Q* F, T+ f8 c, M% y& K% ?) N4 D a1 P
/* 找出极值 */
3 P4 y- t9 Z, z- C2 o0 A0 j for (ixstart = 0; ixstart < 81000; ixstart++) {5 [5 X) f4 q. F: q. `( v) }
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
( |. e# g: P; Z" o, Y2 y* z4 r X }. `- R2 R3 g3 |: ?# W
0 J9 o& K6 ?" ~; L --------------帖子字数限制------------------
2 O9 z) z5 G+ A* Z}
4 k$ M; z7 b. w' D: ^! ?
" A9 y+ W: L9 s6 W% k! D( k; t$ s# c4 W0 `1 H' J- l. H# ~
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|