|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
! [% @) e: X" y) [0 \7 R! _8 {1 [( Q. @3 L2 }
各位大神:
, F4 o) d& K2 c+ v" U 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
0 H: Y' |% m/ R" M 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
) L, Z3 O* W) E( ]- j* Z" U
1 w4 t: M7 @2 ]: V- d+ D0 c
& A* C0 U8 p" `1 e这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
* I8 ]& B1 E5 n& b
/ r* _2 v- X& L并没有其他线程
z( e" e# p" V e( x/ ]+ ^$ A反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
( R; t9 L6 {0 C1 s8 R也说不定是和堆栈有关系。。。。。。
. E' h5 {8 ^% H5 {+ E5 H# @请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
. _' y* \/ s* M5 ]! C% W. N8 S! W* i; R/ U
; U0 G4 }, d% i
3 U* n+ W, }& h. R我也很绝望啊,希望大神能帮帮忙,感激不尽,!2 `% n$ |# \: D+ C+ s6 O+ L6 a) a
( X7 J6 c0 \" x) ~" g# x) h9 G5 E6 M" z) N+ Q6 Y ?
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
1 s N2 G2 [ O3 v1 t' j" R2 t static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
. _# g' u9 F& M) y( F k( l
7 w- I& F/ x9 _: Y- Vboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
; \% M" \6 {, u" @' k$ n% S Q" C const double data1000[1000]) {9 B8 a/ O, M3 n" d. \
: B2 @1 {" {/ n2 }& G+ V int myfuck;
! P: n' y: r0 R" Y double yiDuanShuJu_mean;, |# T2 a7 _9 k6 E7 y) e1 R
double yiDuanShuJu_LowMean[1000];
% Q+ d) P( ]# A int ixstart;
: n8 s) f# J& Q. |" K double dv0[1000];
# H) O2 P: u! c' L i2 i5 O/ w comm_AGC pAGC;7 F7 n+ w: I% _! M0 ^5 U3 M
comm_CarrierSynchronizer pFineFreqCompensator;
# S, I0 @# g. H dspcodegen_FIRDecimator pRxFilter;" R4 N1 |2 u5 U% r
comm_SymbolSynchronizer pTimingRec;
, J Z7 P# q, I$ m, D: g0 L comm_PreambleDetector pPrbDet;
- ~# d1 f) ]$ F+ X7 I FrameSynchronizer pFrameSync;
8 V. `2 S e7 G6 _: h& S) b( a QPSKDataDecoder pDataDecod;
, i6 F+ ?) Z" n/ {5 b+ R v! d static double usable_left_filtfilt[81000];+ t$ x. q: A9 Y# L' W
static double youXiaoShuJu_QuZhiLiu[81000];; \ m3 o1 @: p3 Y) ~9 L
double mtmp;
) c( y I O. R4 d9 g9 {! O% ] int ix;
4 ^2 v) v- \( ]2 U" X! c boolean_T exitg2;
. |0 ^" y% x! |. E- A boolean_T exitg1;& Q0 H& ^8 P: {" U6 T3 K5 {
double YiZhenShuJu[800];5 ]7 O5 T/ {( C" ?
double dv1[800];+ h- S( _3 V/ {7 Q0 y# T: H
% q7 @3 v+ ?) Q+ ?0 M
4 f2 P! f2 c( t: j2 u" x2 B double b_YiZhenShuJu[800];1 r0 ]3 @* G2 S4 Z
double I_filtfilt[800];! c6 }8 n) p2 `3 q3 M! J2 C
double Q_filtfilt[800];5 \) H* J- x. O5 \6 W: l
creal_T b_I_filtfilt[800];& v6 x* q" }) Y7 ^; {5 X& C' c. A
creal_T b[800];' C* V) T' L9 [% N7 s% `1 W3 M% O
creal_T RCRxSignal[50];- O$ K Q& U# I ?! i
creal_T fineCompSignal[50];6 B3 p, p; o5 G1 N8 y
double phError[50];
- G; S3 U! y! I2 H4 e creal_T timingRecSignal_data[28];& a' H; o' v9 ~6 z8 y! O# y8 h/ D* J0 g, C
int timingRecSignal_size[1];1 ]( \2 ~9 M4 e, v( m8 b, m; \ R6 \
double prbIdx_data[28];
{* J3 s, [% n% e9 s7 B/ { int prbIdx_size[1];- f# Y. P0 K, G8 S( a# K# M
double dtMt_data[28];) N7 Q1 u4 W2 e
int dtMt_size[1];
' d. C& q5 m% i- ? creal_T symFrame[25];9 r/ B- l2 F3 v
boolean_T isFrameValid;- R I p7 K, c8 z; F1 c! M* M
double unusedU0[3];& [/ A: ~) F" l7 j+ @# d1 B, c* e
( L! t! w9 v8 ]2 l //调试过程中的变量
x# W$ T2 e7 s2 E int enough_data;5 ~; ]+ y* |* V7 w
0 g6 E' v. e; x0 k5 _
int enoughDataFlag;+ I. L4 X6 y ^ h# M7 b7 k
int yiDuanShuJu_mean_int;
. Q+ P; R/ C8 ~3 I; Y8 d int int_sum_dv0;
: O" W1 f$ n! R4 Q; Q1 a int oo;* A' r* F6 w+ ?1 r7 {& k
int ii;7 t0 ~! u) ^; ?2 Y. s, a
myfuck=10;
5 ?2 e3 ^! I) ] /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */; a( s0 p2 h& N' a
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */9 K0 I2 s: u" f5 b+ a
" x6 y0 b% l- l yiDuanShuJu_mean = mean(data1000);- L" p& T' |6 Q h% n9 T
( G6 b4 y, y$ m: m- d5 j4 g
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
! q1 F% `* n, c* Z2 U# J6 n UARTPutc('A'); o |9 p3 t6 l! Y9 l, E* U5 c# c
UARTPutNum(yiDuanShuJu_mean_int);+ u; Y/ N1 u l7 r: N9 Z) j
UARTPutc('\r'); B3 N2 [/ E* i6 g: B
UARTPutc('\n');
+ D" n9 G+ i, ]7 b! f2 X) W5 X: p+ K+ ^8 O5 k. |/ b: e8 l5 V
for (ixstart = 0; ixstart < 1000; ixstart++) {5 v# F. r: V' T8 m* j/ t: l
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
' A5 r: O/ l8 @1 g9 J }
5 ~' i! `1 o" o+ A8 W2 A j/ Q: ~
6 J+ F; z$ L; `$ ^9 D power(yiDuanShuJu_LowMean, dv0);0 O5 h* b0 J. C3 M ]) O
# v5 }; ]: g: E" J int_sum_dv0 = (int) sum(dv0);. L9 r8 n! b- _ x8 P& k
, G# R6 o ]+ {3 S* ~
UARTPutc('B');1 H; ?2 k, ^( R# ]
UARTPutNum(int_sum_dv0);
1 V& H" S8 G! p6 \/ D UARTPutc('\r');6 |5 G/ t! @! Q" `2 B3 Q
UARTPutc('\n');7 C* \ t1 j3 b5 n
4 G8 q9 t% Q) n' l
// int compareFlag = int_sum_dv0 > 1.0E+8;
& R+ z9 e5 W, B( Z, \8 M1 ?8 A3 Y7 y: L& k5 w
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?+ Z; ^' K1 K- V* e: P4 K
UARTPutc('C');4 E* L; p3 C' ?) s" B. X3 R% x
/* 比较信号能量 */8 j( S2 x7 K# c5 v' n" f$ @
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
8 l5 a* E- Y. J* h& z; `. g: b& w// yiDuanShuJu_mean = 1000.0 * youxiao_k;
# f9 F4 |7 Q: {* e$ N// for (ixstart = 0; ixstart < 1000; ixstart++) {/ Z) P7 g" n* K; D+ H2 w7 Z
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =! i0 R" f! {/ _4 [
// yiDuanShuJu_LowMean[ixstart];
7 J' H. K8 ~, H N// }. d1 l: r4 U3 S! w( Q
//" C; A' V1 z5 G: T. C
// youxiao_k++;
# S% z! v+ C1 z) g" `// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
8 I: T/ B: z: w% \) u! O5 o, u) a// /* 感觉要取21个数,即0-20, */ }4 g5 A$ t' [
// enough_data = 10;//有效是10,无效是0
8 Z! a7 E5 y& v// }
. Y4 E; ?5 J6 Z& P1 ^" o }9 X7 K6 N/ m+ l5 [/ o
9 u. Z8 |: I2 D3 K
- x, J- K/ N9 x# j9 @, w0 s( c enoughDataFlag = 100;
: t8 U3 c) i9 \# i enoughDataFlag = 1000;* y% U4 m5 n; \$ J2 G! c' u
enoughDataFlag = 0x02;2 o; @3 P; {; ~: g) @0 ^
enoughDataFlag = 200;
8 a* ?, i6 Z& V# Y
8 W* n1 R+ R% L3 M8 v. e$ W) ^ int myfuvk1;
- y! O z" Y S8 C. y4 h myfuvk1 =11;
% v1 ]5 y Q; c* a) v! X6 r6 q g5 a: g6 D+ p+ H) f
' A4 H' e& z0 F' F1 a1 l) C
enough_data = 0;5 A3 M# w1 p& K+ R4 }: `6 V4 ?
, Y- J$ L: d0 B
// if(enough_data>50){
: M8 {+ |4 m: @3 p// enoughDataFlag=0x01;0 @$ U" n' y* F! S
// }else if(enough_data<50){
) T. ]! m5 ]* H& H- k5 q5 m' T7 Y// enoughDataFlag=0x00;//0x00还是不行
& b2 `& ?( d3 ^2 L// }
0 ^1 U( c! D; J) V0 }1 c% t
' L. v- j/ \' E0 T' y9 A, \- m" ]+ u( S; L; z
oo=10;1 |- K" N) L4 i( S8 [9 [
oo = oo < 5;
6 Z; ]1 M+ b* \' G# a( J% s if(oo){
8 I6 F) s$ M" Q ii=0;: ?, i* ] a" o0 w0 y
}" T8 x( q( C8 K, a
if(oo < 5){
- H4 G0 r" x- k" _1 z& j% p/ [ ii=0;
- Q( e, C1 }( v6 ~ }" u% g5 {1 e y4 g
if(oo > 5){ T0 d' @) E: B( V H
ii=0;
2 O* ^3 C& s4 S. N }5 l# D- a: H0 Z. H1 F; S, w5 \& O
1 S6 Y1 q' S9 o% v% e /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */1 h( l4 P( B* A% Q& i8 I5 Y
/* 如果数据足够才执行主程序 */& }, A0 t( V( F- A: u, V8 Z' R
oo = oo < 5;
& B6 ~0 x2 Q$ O; `4 |5 a enoughDataFlag = enoughDataFlag < 5;, D( ?' @# }7 {
if (enoughDataFlag < 5) {
/ k) K+ q# Q7 M6 }: {0 L& l* @// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
- |3 X# u4 |' a( T/ l8 R1 g, } AGC_AGC(&pAGC);* L2 W5 V) g) \; l
. k( W; f3 W* X6 G) x) F1 W
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);) b7 E- j9 t `' A: T! v" B
FIRDecimator_FIRDecimator(&pRxFilter);4 ?, M {' T' \9 G
$ D4 p1 f5 H/ C; W( q& v
/* Downsampling */
8 `4 v3 t+ C5 H- P3 B5 J7 A c_SymbolSynchronizer_SymbolSync(&pTimingRec);3 A1 h5 e* g- W' ^+ Y
4 a1 r7 f/ {0 O& N, Z4 p2 l8 v
c_PreambleDetector_PreambleDete(&pPrbDet);
6 o5 ~4 b4 \8 s, X) I
1 q P- M( [8 h6 Y /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */; e" |% R+ `2 `& {& _5 r1 }
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */- }. z+ g- |4 Z) o4 f- g
/* %帧数量=100 */
* V5 ?* {$ K2 H9 V# F pFrameSync.isInitialized = 0;4 k, `2 b& n* ~6 P e9 J: D. c. P
9 n1 I! A" H* K /* [EOF] */" u2 h3 B" w1 V* g( s5 i1 \, x
/* 前导码长度是13 */7 K: |+ N; B6 B- h( a( w; n
/* %qpsk */! B" R" D- K6 @% @
pDataDecod.isInitialized = 0;2 k# D3 [* Y% z, b. h8 k7 S2 \* [
9 j" e) C% C- @3 U- Q; P( l+ J /* end */
6 X: k2 A: p- e7 S8 ^) I /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */5 a, J M* E9 v
/* Convert 3-dB frequency */
& G4 x$ {, o* e; O; P7 B5 |2 ] /* Convert 3-dB frequency */
: i; c: _( T0 e8 y r filtfilt(save_buffer, usable_left_filtfilt);
/ O. S4 A0 Y) t. h5 Q( m for (ixstart = 0; ixstart < 81000; ixstart++) {' j$ e4 g. K1 Z, B0 _/ E
usable_left_filtfilt[ixstart] *= 2.0;
& ?+ s% \3 T s, A8 I2 B }$ ?) d: R8 d0 w3 O% g0 w. W
; T0 z+ _+ K. y3 n4 w5 V
/* 注意乘2,处理幅度 */
A5 B+ b% V& o6 q: z" W /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
) {' k" d& l5 z- N% j" L0 O0 O5 f |0 b: x /* %% 行列转换 */
; e: e% W k+ n/ m yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
& Y" Z7 l+ F% v% A. ]2 R for (ixstart = 0; ixstart < 81000; ixstart++) {
8 m% |4 X! D1 A3 z4 D+ v, W youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
# A& d& j( a7 N: q% ~, B - yiDuanShuJu_mean;
( Z6 r8 M4 z2 n& m( ]. O9 z }
4 i! e" v8 U% }8 Y2 m+ G7 _3 g% c S9 Y+ N
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
2 |- u; {! A; {! `. o, Y ixstart = 1;
2 i; k) F; f% `3 _ mtmp = youXiaoShuJu_QuZhiLiu[0];
3 M0 s2 r- G/ q0 e; r x if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
" K/ D* [% w6 f& K$ h ix = 2;
+ u3 ^+ q3 L1 q2 o* [4 d$ Y# t( p9 ? exitg2 = false;0 e$ F" V; s8 d0 q
while ((!exitg2) && (ix < 81001)) {
) U3 ]. `8 G- b+ I! y7 t' Y ixstart = ix;
4 M1 ]$ ] R9 W% H, V, B if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {. k1 L# k+ V! p. g& P! w& v8 W
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
3 y3 H h% v) Q; u$ Q exitg2 = true;
8 n: n! ?- u1 R& b" b% V0 w; I: H } else {; d5 k( w; k: U
ix++;5 N3 [. V# s; g. A) p
}
: j! D7 a5 z8 R d! p' w }
. `: `9 p6 k) N8 d) a1 r; f5 L }4 d) A% a" x: T3 V# h
. ?, y6 S3 W! j
if (ixstart < 81000) {
2 W& S! m' ~6 H9 f; ^8 q0 G while (ixstart + 1 < 81001) {
9 M: D; l! H, M, Q- S, B if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
8 c# G, D$ a( l$ G }) S mtmp = youXiaoShuJu_QuZhiLiu[ixstart];6 o+ }9 f6 o* R) Y
}
) F% M9 s1 l! c+ j o A) E; T
9 a, [! C% u6 I ixstart++;: t/ Q9 @3 |5 ` q7 P2 `5 a
}& R1 M. C3 [4 V7 z6 x+ Q) I
}
0 v5 ^0 a! y; ]/ P, i9 m5 `( z- ^
# X% |" g" m5 D2 P ixstart = 1;
' r3 C. r2 `" |$ t+ x+ ~& M yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];; S8 u. p. F/ J% P7 F$ w
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {- c3 T9 C9 F& ^% ?1 P
ix = 2;
: Q& @$ H; M4 V exitg1 = false;
, O) W) B! c6 P% g. X7 H# _; C while ((!exitg1) && (ix < 81001)) {
& J8 f+ r8 E, i$ V0 v ixstart = ix;
4 C; W! S/ x0 s! d if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
! C0 u. d9 e5 ~4 } yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];% b# t! r6 |! n! B5 e' X8 E
exitg1 = true;
% ^1 v; o# N- ~" y$ Y+ U( e3 ?: E } else {
. K, g1 x! H; x, ?2 A: {; B ix++;
! z6 }1 D' X$ Z* b0 ` }5 q7 Z1 k# V6 V5 J
}2 J9 [3 S3 }; m2 F3 [* v, r
}
0 `+ J( Z3 z" B6 G0 y7 `9 z2 c& {2 |( v4 A
if (ixstart < 81000) {! j3 X, |, q) c* c
while (ixstart + 1 < 81001) {
J& `8 V% k0 f; p8 N- B if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {0 D A' j% z. T9 n. J( v% r
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
; G/ T7 s1 u. S( E$ y9 h4 k3 K6 X2 ? }( [+ Z; T8 N# c' O9 S4 [' Z
% |. o, b! z0 a$ { j* f' K7 Q
ixstart++;8 b/ X$ F4 v- [6 j0 d- e' ]
}7 k* O/ K: `0 K/ K0 p
}+ w0 [' J0 w2 T7 |. W
" f2 b% z! I5 @+ j! [! i" C yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
' ]# c. ]0 V+ O3 q! q# K ? if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
8 l/ |+ ~3 I( ]7 G; X yiDuanShuJu_mean = mtmp;
1 i5 x4 N d- n4 R9 ] }4 X3 i+ ^+ M' R- r
4 z" H: Q) ^! l% }# R' g+ [ /* 找出极值 */
& S0 L7 x! @1 y for (ixstart = 0; ixstart < 81000; ixstart++) {7 d& J/ \0 \9 [' [+ [
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;0 b8 Y; ^/ e+ L* k$ V% f3 ]7 M
}6 o( v% [* ~* J
) K! j/ C% d# Y9 O
--------------帖子字数限制------------------
/ c- e7 P& s/ `5 s, D* u, N}
( e/ Y) I& ~. y* E1 t) x9 r
; p S0 z2 ~' r- d' c( M! G% H
: z- G; |- e* f4 b5 |/ N |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|