|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
7 D7 W5 F; T! w; u! K4 _: B! s0 @. r2 Y) d# G
各位大神:$ h! n* z& X K: n
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)4 h# l# X. n+ U. O' K
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
. w0 f. ^3 @+ s0 ?7 X* t( i8 b
2 t1 }/ C0 ~9 h8 U1 I
4 o5 y- I7 R1 h这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
7 K* W+ {$ a2 S e( U3 i; g4 I% `5 _( M# [7 j7 s
并没有其他线程
) c7 u. p3 f! [) m! N! I" R( ]* G) p; g反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
- p* T9 n M" J" c" R也说不定是和堆栈有关系。。。。。。5 N1 v% s& ?# f# ]' ?0 _2 P
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
7 q- H! R) }: Q: S1 y4 D# {* J [0 W% r. d
4 s& M7 Z, ]4 H) r. v6 ~- `9 @* H) x6 b
我也很绝望啊,希望大神能帮帮忙,感激不尽,!5 G& V& q- a* Y' A6 A8 A
+ l, R8 y5 M6 j7 ^! k7 s/ F' u- ]7 \; U& ~2 E
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
' e" G; a8 a) a, F7 V$ l6 `7 l; U static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
0 n' d" ^( |; D- m# B
7 v" H8 ~+ h S/ ?& O- `2 cboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC($ s' r0 \ \* y! L; x
const double data1000[1000]) {+ `4 {3 j* ~8 Z( |7 a- V
7 v: C/ s% D, ~3 O+ @, S) {3 ?
int myfuck;
+ y0 P- {" }4 y, S$ s$ G. q1 a2 k double yiDuanShuJu_mean;7 x# H2 k) l+ V. A" U
double yiDuanShuJu_LowMean[1000];
# E- d5 X! O/ l int ixstart;1 O1 l& l8 ~; Z% `
double dv0[1000];
$ s U: O9 x0 w- q0 l/ O4 ` comm_AGC pAGC;+ K1 G1 z1 o1 y
comm_CarrierSynchronizer pFineFreqCompensator;) P- i) ]. x9 B2 T. ~$ ~$ [
dspcodegen_FIRDecimator pRxFilter;. }- \/ T& f7 R- D& }, U
comm_SymbolSynchronizer pTimingRec;/ t% b% t6 `0 { n& i# U! ?4 S* Y
comm_PreambleDetector pPrbDet;
' e$ }8 Y5 j9 [. [2 @) w! M- }7 C) v+ C FrameSynchronizer pFrameSync;% P% R3 N* L5 G1 o
QPSKDataDecoder pDataDecod;
' F1 R4 ^* @% _& R4 w+ M: i static double usable_left_filtfilt[81000];
; n. Y: O! X; G/ V) k; ` static double youXiaoShuJu_QuZhiLiu[81000];* Q/ K7 ?4 t3 m
double mtmp;5 |9 [8 T# }# I1 w
int ix;, a4 J g& P6 N/ d U1 G ]5 ~
boolean_T exitg2;3 p0 G' p. r; }6 N5 Y: M y
boolean_T exitg1;
0 m/ g G1 B* ~5 ?, U3 w6 ? double YiZhenShuJu[800];
! x: B- x' h$ u) @6 s& ^% g double dv1[800];
$ L: g ?% T# N& s0 x7 a+ `$ i
' Y: P, v' @) P, |) y
r4 a" w% m: c1 P. e double b_YiZhenShuJu[800];
& A) D0 f1 K' y# l% n: \ double I_filtfilt[800];
8 f$ w2 O6 h, N: P8 E' B double Q_filtfilt[800];3 C- D4 b3 c. J m0 V& P# F
creal_T b_I_filtfilt[800];
" J9 l* ]& G$ z1 { creal_T b[800];
4 H+ J" ^0 p' F creal_T RCRxSignal[50];% n6 k, V2 H4 p/ O+ S$ j) v
creal_T fineCompSignal[50];# [4 E- b! O/ |7 w+ K" ? p
double phError[50];
& J6 G! ], Z6 Y creal_T timingRecSignal_data[28];
; `* P) M |2 S7 p% i6 J int timingRecSignal_size[1];8 |' W9 v3 c6 @' u% M2 D
double prbIdx_data[28];
( @: i5 _) U4 I5 p$ i& [ int prbIdx_size[1];
4 s4 B; W5 Q6 }% d8 w4 N5 m double dtMt_data[28];0 [2 w) H$ A" i7 |& i7 l
int dtMt_size[1];9 |/ G G! S; U, j, j
creal_T symFrame[25];# g8 s) D- c8 m, y+ A; r5 k J0 Z
boolean_T isFrameValid;# W; n( Z4 l2 W( I; P- c: C
double unusedU0[3];
* X: |6 L5 e- U$ N
' Y7 Q6 k3 V6 v" E4 z4 V) m //调试过程中的变量8 c+ Y9 F; q/ h8 i& W
int enough_data;
: a7 i' |% u, Q( C- O# N0 O& r- E
int enoughDataFlag;! C1 k6 S2 \* j8 d& [7 f \
int yiDuanShuJu_mean_int;
# L8 C* H6 S8 t5 x- i+ J int int_sum_dv0;
; c) L, x6 t* N; j1 D int oo;
# F3 D; S7 _/ C5 m E int ii;
3 W, ?0 v4 v$ ?& T5 Q# | myfuck=10;$ U. X8 T' x% L( t7 \, i0 {4 R2 E8 J
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */8 W. S9 r+ v- k; X
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
5 O* G" W) K! B- p5 O* Z' ~+ Z$ H: X" _/ \3 ^# [
yiDuanShuJu_mean = mean(data1000);
7 k9 Y0 u4 L3 l9 h% C8 T* H2 Y2 p
' I1 g, Z" s' P4 w. I, `. [9 A yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;& P- ` x9 D1 \9 ^$ ^5 O4 ^
UARTPutc('A');
$ x- P+ y4 o4 P UARTPutNum(yiDuanShuJu_mean_int);
$ v/ J# f' ~+ } l UARTPutc('\r');
, F7 b8 H9 h& ^7 N- } UARTPutc('\n');& g: B+ W% o0 y% _
0 G3 B8 G! m1 v6 y; m2 L7 M( [ for (ixstart = 0; ixstart < 1000; ixstart++) {8 i! v1 F Y3 y( h+ d" ^* ?
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;: k0 c# P& I" \/ W4 w7 V$ ]
}
' A; E) X2 j) N [) S3 e( ~8 M# G( Y
power(yiDuanShuJu_LowMean, dv0); e/ Z& ]" ^" Z- m' |: X
[, M5 Z# P3 h3 e: g5 B8 A int_sum_dv0 = (int) sum(dv0);
" B3 [* b; u- C0 X4 S0 g
/ E0 B4 T# {# G. z* p UARTPutc('B');& D/ G8 ^2 y- m0 u
UARTPutNum(int_sum_dv0); y+ F8 m4 l2 Y+ F) F
UARTPutc('\r');- f" n! n7 n3 b4 B; Z' ~
UARTPutc('\n');
# ]% B4 P g, P7 k# A
1 Z; v2 {" S% m* k2 {// int compareFlag = int_sum_dv0 > 1.0E+8;. \$ G% k5 d8 ~# K
4 e' y: D9 V+ J, L7 g- x7 v3 J if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?; Y2 C7 f+ U9 O9 z6 f2 `; n
UARTPutc('C');7 P! A. e' _! `/ ]' D% z
/* 比较信号能量 */0 E5 f" |' [/ Y& N5 X
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
$ h+ P& O" k$ _1 \6 b) q& X5 V// yiDuanShuJu_mean = 1000.0 * youxiao_k;! g; O, K$ i! s$ k; ^& Q! a
// for (ixstart = 0; ixstart < 1000; ixstart++) {
/ a4 \, V3 q3 z// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
+ d- z. x! o& X+ v+ a// yiDuanShuJu_LowMean[ixstart];
* Q* T3 H9 o9 L) x5 ~/ E// }- C5 h; z2 d) W9 ]& h
//, J* X5 B3 S* S; j% }
// youxiao_k++;
' S" m# M5 i+ o2 K( ]6 s4 J; k// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
4 R. U5 s5 m: P* E, w: \// /* 感觉要取21个数,即0-20, */
1 p: H9 Y( P; a3 d" u" X, y// enough_data = 10;//有效是10,无效是0, r% I L% m5 }2 f" Y
// }
5 S/ w3 K! s: Z& {) u }
+ S, o" R% {; c% f' f( ^6 `* M! ?3 t @+ x
) E. H* H3 {; u% w, ~" f9 ?
enoughDataFlag = 100;
% o: b, `! F% |# D) s; L4 f: N enoughDataFlag = 1000;, q' \% _, j. O3 n9 S* Q6 l# m
enoughDataFlag = 0x02;
- y# v1 u4 T3 @) p enoughDataFlag = 200;* v2 g/ s4 G. W( ^: c$ j
7 n4 t& t& a" ~5 j
int myfuvk1;
. o, R r8 B! [% {* ` k$ | myfuvk1 =11; m& u+ w/ A/ ?5 ^9 x
0 v" E: g+ F- G: l5 O+ }
1 m/ ?( |5 N& p {& g enough_data = 0;
" l9 ]" m- R+ Z0 g6 J
( U5 b2 i* N6 j$ K' W O) s// if(enough_data>50){+ H* k$ d: d: r! E" @
// enoughDataFlag=0x01;
' \; B' h( R4 Z5 O! m// }else if(enough_data<50){
$ |$ H; N( J9 c% U, }. }// enoughDataFlag=0x00;//0x00还是不行
- i8 c3 [4 |, `/ @$ L7 L// }- S( Z$ W2 Z7 X# T
j$ D! i& y& U5 c0 i0 W
+ n( R/ u5 q( H oo=10; M( D# C! u9 ^6 |
oo = oo < 5;( m- p8 {. v0 W
if(oo){2 c& {# I3 ]8 q t, I
ii=0;- }& C6 ^7 ~4 ]) H7 u8 _
}5 t6 G$ s1 q, ?6 n8 F
if(oo < 5){
$ J9 `8 t. u! R0 b ii=0;
. t- n) y+ k, m! l9 L, V6 ` }" g, ~) ?5 B( w3 X, I8 @* r, O
if(oo > 5){
" x9 n: B: k- V0 L4 z: C ii=0;
1 k) \* J4 `' A) R) L5 Z' c# a }+ i5 T: i% [) j
* K" P7 Y% v5 b3 N /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */0 i2 |5 T7 T; A8 k7 @) {( C1 A% I
/* 如果数据足够才执行主程序 */1 l( O, P0 N8 ~# i2 c
oo = oo < 5;
' K# f( A" F8 ~# [ enoughDataFlag = enoughDataFlag < 5;
, [9 W8 u2 h& M$ _ if (enoughDataFlag < 5) {
5 ^0 i" W0 K9 {* [1 z+ G2 p4 t% y// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是06 Q) [% H# J$ j, L4 v
AGC_AGC(&pAGC);
; z# q9 i( `$ m7 ^% n1 l
7 F' v( [. `6 P9 L9 Y c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
/ {- B; P9 _& q8 g& ^ FIRDecimator_FIRDecimator(&pRxFilter);
1 ]9 F" N7 M1 H! e! E) ^/ C) V2 f9 u4 {1 R) ?& F
/* Downsampling */6 s1 E* \% m6 m6 K9 q+ n" I
c_SymbolSynchronizer_SymbolSync(&pTimingRec);4 v- P; k- [" Q3 M- r
+ B. D' W7 p3 q6 B8 P( ]
c_PreambleDetector_PreambleDete(&pPrbDet);1 i( G9 M+ b# W/ I# d+ N
3 e$ M3 j0 G* T+ X, S8 x5 \9 ^ /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */! U) @% k5 i1 v M+ n% s
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
4 f( |+ Y! R: E0 | /* %帧数量=100 */
7 Z$ [ R6 [4 z2 | pFrameSync.isInitialized = 0;3 }( Q1 J6 J& B5 E2 e2 a0 ]
- `$ a; b* }% H1 e' V /* [EOF] */* C/ B+ ], R' R/ ^9 W. Q1 l1 m+ s
/* 前导码长度是13 */9 g Y/ Q/ h4 N* J
/* %qpsk */. G8 q1 ?6 M+ ?7 N# U$ P
pDataDecod.isInitialized = 0;8 Z6 i8 T0 a; ~+ w7 x
0 `7 z- k3 q& ^' @+ ^ /* end */) n* }- M- ^9 S3 W3 h2 P
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
' K6 C1 u/ y1 X /* Convert 3-dB frequency */
( N& {1 P; r8 k8 \- r9 M /* Convert 3-dB frequency */
1 g! V4 s8 c3 r6 D" k filtfilt(save_buffer, usable_left_filtfilt);
( Y& K" j- w5 c3 R for (ixstart = 0; ixstart < 81000; ixstart++) {
% ?0 ^2 \4 x/ N; H1 m' s usable_left_filtfilt[ixstart] *= 2.0;2 i: J9 _0 R0 d
}
3 ]( U5 x P: W- X! y* _ w& T0 ^
/* 注意乘2,处理幅度 */ f+ F" A# j& |5 Q
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */; h# N6 n( c' T9 P; K
/* %% 行列转换 */" w6 d' Y/ D% b) @6 m
yiDuanShuJu_mean = b_mean(usable_left_filtfilt); W9 x: `$ u% o! V8 K
for (ixstart = 0; ixstart < 81000; ixstart++) {/ O ]9 a J( c/ T* k) j$ y$ U
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]" ^7 J2 R- n; U" s4 u( m
- yiDuanShuJu_mean;. e3 R( r0 R) |
}
4 Y: [' r) N' a0 S* p) x; T3 j7 i) q$ w/ q4 A
/* %% 应该对数据归一化,但是这一步放在哪比较好 *// q6 d7 j- N2 c W" ]- \' q4 |0 }
ixstart = 1;
3 n% H4 }6 W- t% t' M: I! @ v mtmp = youXiaoShuJu_QuZhiLiu[0];* [3 v: ]( @- S+ r. U- Y# P
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {' |3 k1 L+ i0 F" O M( G
ix = 2;' K2 }2 z5 m w( x; G: F3 a: O% t
exitg2 = false;2 K" d( ^6 C, b0 L, X$ y" ?: w
while ((!exitg2) && (ix < 81001)) {0 H9 T* [. j% S0 d
ixstart = ix;* D- I1 p# y. @5 h* g! A
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {& B% c/ o: o3 ]# C( F/ _) W% J
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];% U$ c1 p( c/ W# Q+ Y
exitg2 = true;
1 q( h: B2 ?# R8 s% ]% k' i P6 ` } else {- C e$ t& D$ P% Q# h
ix++;
+ u7 V" |. q. Z8 J! V- K! b) p5 N }0 C/ x2 p9 X; G0 C
}
- N" F. @) v8 |* B: o1 i } E; F% W* c1 Q+ U
5 X8 p3 z( Q8 W) C9 y. G r if (ixstart < 81000) {+ Y/ i3 B# A- R- K+ V
while (ixstart + 1 < 81001) {5 _. N9 d+ J7 |" f: k& I) G
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {( _- s2 O' g2 C, D+ G
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
6 k. l8 {- R B) h) f6 J$ E2 G# f }
5 g3 X) L5 I' M, _2 c1 g8 p. Z6 F
ixstart++;. R- }; I9 Q& m0 J5 V1 f0 _
}, F% k% ]" G( Z" p: v% p6 F+ m+ \
}5 d$ [' ~0 Q/ K# c
/ \1 K3 R: c% M" `% U, i- q ixstart = 1;
8 y* N6 j# [7 a1 i$ e yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];( w1 h: r+ \. ]
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
+ t4 c# |$ f; h* x ix = 2;5 K- U. A% Y# q! d2 p e
exitg1 = false;" Y3 u9 ~" y7 L1 X+ S3 A
while ((!exitg1) && (ix < 81001)) {
3 w( x: Z4 @5 P2 y0 Q- f4 |5 {; c ixstart = ix;
- D; h6 j9 C+ N: K1 X; A if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {6 v# o' _9 t, I
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];: g4 Y( u' g! g5 `7 @# Q
exitg1 = true;
7 d B% p2 q5 J* n. o. h7 W } else {0 P# i1 t3 t o" h
ix++;9 f4 K7 X& L! ?/ }: `/ d
}$ J, q3 k! P# P& j2 M: ^
}- S0 v0 q5 o' x) I
}
1 F% i. E: Z# G: M, L' x
$ Q6 z. R2 `/ \" m+ _& u4 z6 | if (ixstart < 81000) {" }4 s& C$ |, [$ K8 F8 w5 _
while (ixstart + 1 < 81001) {4 F5 K, ^1 a& o: v
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {7 o" z7 }1 N/ }+ I! n
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
! `, m% k6 k* X }5 g7 r H/ X+ P. b6 S0 S& C
; W- Y- y$ Z- M1 A, O ixstart++;
4 h9 i' g- }8 Q }
4 G9 d0 o6 i8 f/ t }5 x4 b, f' s4 G% |, y8 M$ v0 n
2 n" }9 P+ s! [$ K, T yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
/ E* j- K& E* _# i, ?; o if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
6 T4 V' H. h( y) C8 T( i yiDuanShuJu_mean = mtmp;
8 `2 M( H9 |) D* y7 x7 V0 b2 G }# c, u. u: `4 y. a
6 R6 V# l6 c7 [ /* 找出极值 */8 |' V: g6 O3 l& ^' K/ h3 G
for (ixstart = 0; ixstart < 81000; ixstart++) {: b' t+ K* [% v2 d8 G; `8 i
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;" k- j9 T [: }) o, W
}
6 a" S* q* I2 N6 v5 W5 h( K' o0 S4 \- }5 |
--------------帖子字数限制------------------
3 l+ K* v, p5 W8 W( w1 f0 `- f}
; n0 q, w; }# a8 H
9 ?0 P' z- y) J2 G1 a
& j, s, e7 t- {1 S |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|