|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
% Q ?' u$ i( M) k' y
2 \3 g$ c( R" A* k3 n各位大神:
7 m- \: y! q+ p6 f3 Q, l, v$ v! M 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
% r! N* p0 }( a% A% i" _% D i 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
+ k1 S6 T; l7 @9 R8 R6 ?
+ j0 I: T, Z' W4 m( m
4 r% b4 J ?7 p4 o这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。# A1 D0 f# r' [. R; m+ [
3 \ P, E4 U! [: Y
并没有其他线程+ s$ P4 p0 t- Y( t$ ?2 c8 A) D+ N
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
/ [* v& ?0 b4 n: m3 e也说不定是和堆栈有关系。。。。。。, T* {$ J% e K3 Y
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
0 p& ^, g9 l5 u' i; S5 l
9 W4 ~# D+ n8 a$ ?# D) s: i- |
2 n. X L/ p" y3 t2 o9 `) d# Z3 V7 {9 B" b, p \- U4 E
我也很绝望啊,希望大神能帮帮忙,感激不尽,!" N7 u% G0 _3 [" L
; u% A, J& d9 J7 k. d$ A, ]! c
; H) G% C% \! D: t2 o- k
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];3 J z1 R5 ^/ T0 u- z& _# p
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。' Z* I9 Y2 [! \! G% U$ w
; y8 ]( N. `* w) q- gboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
8 `" [$ M6 j2 o const double data1000[1000]) {( q2 v" r( T; Q' Y% B8 t) q
+ D/ t D- ~" S& S' e1 w- l D0 N
int myfuck;+ [7 I) P* `: ~1 `& G4 a
double yiDuanShuJu_mean;6 t: N+ C+ V+ ^7 }$ |
double yiDuanShuJu_LowMean[1000];
2 n% K4 d [5 W int ixstart;8 F/ S6 r+ L9 K- m9 H: Z6 F( {2 e
double dv0[1000];
5 i0 m, x8 w1 d1 v' u) s+ t comm_AGC pAGC;
) z0 { O# n5 P2 K- l1 B comm_CarrierSynchronizer pFineFreqCompensator;! i3 G& g/ u5 ]
dspcodegen_FIRDecimator pRxFilter;
( n' o5 R: D S1 w7 D# b, ^& {. R comm_SymbolSynchronizer pTimingRec;
" x5 q V# E4 T. [0 a0 w0 L# Q comm_PreambleDetector pPrbDet;
. ~# x0 y5 l) b FrameSynchronizer pFrameSync;
5 F! \0 Y1 a* x* |$ D6 D7 T9 L QPSKDataDecoder pDataDecod;0 n: ^& J X$ n4 Z8 C' n
static double usable_left_filtfilt[81000];
- m# ]9 Y/ T$ p) c+ x# L5 x static double youXiaoShuJu_QuZhiLiu[81000];8 \/ f9 N; w4 ^: L
double mtmp;- ]" S- {9 t. N9 Y4 }
int ix;
- c( l0 h/ {( _3 A/ n boolean_T exitg2;7 m5 j' ]$ @' G2 J
boolean_T exitg1;
: N4 f) {( d/ M& Q1 o0 ~ double YiZhenShuJu[800];* R$ {4 K! X Q3 E) R
double dv1[800];- q: u5 C+ L, `7 V: P% u) ?+ S
( d7 ~ z) e7 L4 f7 Y
2 A3 x5 ~1 y6 U2 {8 t8 Q& q
double b_YiZhenShuJu[800];" x* [3 N+ V7 r% g
double I_filtfilt[800];
- s6 s6 `5 q- |' m1 [ double Q_filtfilt[800];
& g) L( M3 c7 s) I Q, b creal_T b_I_filtfilt[800];$ _. _1 h3 X- `! M
creal_T b[800];& V* F9 d/ _1 ]) {
creal_T RCRxSignal[50];
# Y- S. N4 M. s: C& E creal_T fineCompSignal[50];
# v. c( y2 X* e S double phError[50];$ ~, m' _; z. _# n
creal_T timingRecSignal_data[28];
; @! s2 v% I! z- F int timingRecSignal_size[1];$ o2 v( _# C& W% u# P. e
double prbIdx_data[28];* T8 {$ h5 y3 _8 }" e. ^
int prbIdx_size[1];8 k: u. V; w, @. k& y0 L9 Y- ?
double dtMt_data[28];
5 X1 e+ w: Q% ? int dtMt_size[1];
( `: b5 p. ~& h creal_T symFrame[25];
0 K, ]: l% g6 h0 \. _ boolean_T isFrameValid;
" g) l; i, V$ \; ~ double unusedU0[3];
1 k) u& \: v0 C( Q$ i) U2 O5 Q+ z. ]; R
//调试过程中的变量
0 Y+ C# l* p2 O) N int enough_data;( H& b. }9 ^6 A! m+ s% Y v) [" {
: u1 a n4 s, A9 W
int enoughDataFlag;$ ]& Z8 V% I! l) n* Q9 @# u
int yiDuanShuJu_mean_int;
/ X# K+ K# Y0 S c6 ~% u int int_sum_dv0;4 U: @& }# j1 K* M: _- K4 Z c
int oo;
' m# w4 y1 h4 Z% u" L6 j2 h+ X int ii;
& F- \+ v7 t4 K6 K myfuck=10;
* w! W0 l C- h* m3 J /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
0 ]# }# @& N% a9 Q /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */5 @$ Y: S: P' |& B
4 ~4 V, }6 @# j
yiDuanShuJu_mean = mean(data1000);
6 ` u3 M, ]+ J' {, Y3 m5 A
6 y3 W( n- f5 m. i* ` yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;- l2 l6 | V2 K, P( F
UARTPutc('A');+ s3 A+ m H& \. b2 e _) D% D) ~3 O7 {
UARTPutNum(yiDuanShuJu_mean_int);
p* R2 ]% ?' B2 ?# b* W UARTPutc('\r');0 z8 C0 R! V' l4 T4 P/ l
UARTPutc('\n');
3 [" `$ i, W4 B, u0 }" m4 Y, ^3 E" o
4 K8 L7 U2 P w/ U: |$ a# O for (ixstart = 0; ixstart < 1000; ixstart++) {( ^2 V6 m" v5 Y8 {, z1 \! j
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;. _2 p# r' Q( S
}3 ?: O' W3 g5 z* n7 J+ |$ m6 y
# p& ^9 O! E4 q6 \ power(yiDuanShuJu_LowMean, dv0);1 m7 L _6 r: b1 z# g. Y7 i
- p8 @4 N i8 p s int_sum_dv0 = (int) sum(dv0);
0 }" w5 W- s) A, Q* A, m1 U( L" M* C% c. |$ F4 {
UARTPutc('B');
$ A N: o: v! q; y: I1 l0 S UARTPutNum(int_sum_dv0);
5 s1 g' F2 @" _! A UARTPutc('\r');
8 M, J; v4 v7 a% C UARTPutc('\n');
( M% C' _/ A" H
8 j; G+ j) c6 e/ O// int compareFlag = int_sum_dv0 > 1.0E+8;
6 q* t; N" x. I9 O+ T4 \$ j$ n; M* @+ \4 \
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
1 q2 C2 k l8 F x UARTPutc('C');8 g% M- x0 K L. B) G4 r5 o
/* 比较信号能量 */
0 \* B0 Z0 Y$ M5 Q/ p /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
3 c! I# _# ]9 A- R: ^. H// yiDuanShuJu_mean = 1000.0 * youxiao_k;( o1 u3 H: S' ~" ^, R! w# l
// for (ixstart = 0; ixstart < 1000; ixstart++) {; w8 s6 H. h+ o
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
# Q+ C! h8 I/ g/ e// yiDuanShuJu_LowMean[ixstart];
1 {) F; `- g; S5 f8 |// }
# Q* l& l0 |% ]. M* N7 W) K. o9 E) s//+ J& }1 a. Y! v: o" T
// youxiao_k++;7 D$ F8 C" Z I, Z# Z5 n" c- ~
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
. n( P0 s' p z( N& ^// /* 感觉要取21个数,即0-20, */$ b: ~+ V+ a5 A& k. d
// enough_data = 10;//有效是10,无效是0
; s5 f3 t. o+ M& {$ R/ o. c4 y// }
' a6 B6 l- T$ u, R }- K1 G6 Q: t+ m! P8 @
) b# n: j+ F* ^- O
5 |7 a6 ~! n* T7 S" a8 @ enoughDataFlag = 100;
" R0 ? F3 N5 W% @* D4 T% B2 g enoughDataFlag = 1000;' A% E5 h5 n/ B* O5 w: p
enoughDataFlag = 0x02;
& Y7 S2 H* _3 s! e0 Q enoughDataFlag = 200;' j8 X$ B, J7 F H/ e
* H7 U/ a9 I% `* z int myfuvk1;
" e x& O- o# c myfuvk1 =11;
2 Q; F6 C! ]6 u& g: L ?: v8 \. I1 X) ?4 H3 P: M
4 c% k4 O( ` H7 X" @! f: m enough_data = 0;7 h' h: b+ x8 l
2 J. d! C0 P$ ]+ b$ b9 P
// if(enough_data>50){3 [8 f t$ Z9 [: a# |: J
// enoughDataFlag=0x01;
( L1 e3 g0 b1 [4 X& f// }else if(enough_data<50){
. h# d# k6 m" n* g( U// enoughDataFlag=0x00;//0x00还是不行% h" s! A) l- D7 @3 }! f% l
// }
7 ^# [1 s8 a6 |1 ]: |
( J4 r- L) `& J# F! r) v) g( C2 k
. [& Z3 |5 @; {4 G6 I3 ?3 { oo=10; X7 G" U* `5 H
oo = oo < 5;
- N* V9 p0 R/ e$ ~+ F/ w8 b if(oo){
! y5 Y& W$ f q ii=0;
* K% T0 r% P& W/ P! V* w- C( I2 u }
r+ n8 t* e7 W { if(oo < 5){3 E1 E0 s0 J' F
ii=0;0 T5 O+ i. j- ^* w- P/ U6 c, ~+ n
}" W7 ^ T9 K/ I
if(oo > 5){/ m- S2 Z1 i% L
ii=0;
) W; s7 S8 d, z }
* Q7 X) d# ~/ z6 H$ m+ D
: F' o; G( \! q" O /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
3 S9 Y0 |# Y& b# x6 `1 p /* 如果数据足够才执行主程序 */
% O- T* B! p3 o% F9 `% [5 L oo = oo < 5;
4 g" I7 H+ A8 \( G enoughDataFlag = enoughDataFlag < 5;! I; v% R. }) M n
if (enoughDataFlag < 5) {
! x$ j) n) f9 V1 ^9 F9 k+ F// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
* D1 B: p$ v# p( J4 t AGC_AGC(&pAGC);! W- }6 F3 b0 b
% o+ H- J3 H( ~% B* f( E+ N2 A. s: @2 ? c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
+ ^! e$ w4 v' {5 O) D8 Y& ] FIRDecimator_FIRDecimator(&pRxFilter);! ?6 i& y+ R# c! _ h
" ?/ s% g' G2 ^2 e /* Downsampling */
& e9 _: g& x2 L& U, v1 h: w4 ~& c5 ] c_SymbolSynchronizer_SymbolSync(&pTimingRec);
/ s% D: s- t2 }, e
5 @7 j* T( {( L0 W9 O1 C c_PreambleDetector_PreambleDete(&pPrbDet);
3 |# W( g$ {, q$ F! U# R z
& e* P8 j! n* r /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
2 N) c+ J F- X; j /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
1 k( A8 E+ h( Z& B /* %帧数量=100 */8 _2 z5 ~% |+ f5 h6 S" W; W
pFrameSync.isInitialized = 0;1 W5 t4 T. x0 s" Q f) F
- N8 @, }1 x; o
/* [EOF] */
$ q! f7 c: K& d* m, \/ E /* 前导码长度是13 */
- A, B! n+ Q7 i% W /* %qpsk */
$ g5 I* ?" \% _9 H" `: n6 ^ pDataDecod.isInitialized = 0;2 g# O& h, z0 l+ Y' |' o
, c+ r) `+ x' x* N3 K: e
/* end */
* I2 b F6 W/ m3 ?" C' I /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */% U' L ?8 L0 v* v+ [
/* Convert 3-dB frequency */
" |+ [0 D' M' l2 B /* Convert 3-dB frequency */) ~ j5 A& z* W, ]$ z
filtfilt(save_buffer, usable_left_filtfilt);7 [5 F/ N: F2 n" B/ p1 [
for (ixstart = 0; ixstart < 81000; ixstart++) {
8 ~$ R+ ~2 [7 w% Q usable_left_filtfilt[ixstart] *= 2.0;* N. A5 _- {+ Z& U
}
5 X4 R8 p5 I6 p5 H- ?3 {# E4 e. ]
4 U1 G# i8 B( @2 ^, G* o /* 注意乘2,处理幅度 */
' Y( [& @/ \+ T9 B /* %% 我发现带通之后其实就均值为0了,不用这一步了 */+ g9 w& ^+ T% J) H; ?. G
/* %% 行列转换 */
9 L! Q# o3 d* K7 ?7 _ yiDuanShuJu_mean = b_mean(usable_left_filtfilt);, M0 T# K* e4 O6 @( {& p1 F
for (ixstart = 0; ixstart < 81000; ixstart++) { G: K+ Q% n2 h- ~- V1 n
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
; i$ C, v' }1 o: c - yiDuanShuJu_mean;
3 F) o) T( u9 R; ~8 l9 j }5 v6 K+ ]& h8 v0 {3 K
/ c1 h3 b% Y" h5 }$ w
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
. z! _3 w0 M0 u+ }. [9 }0 K ixstart = 1;: z" U: N6 T d8 f! B8 \& o$ B
mtmp = youXiaoShuJu_QuZhiLiu[0];
* G+ `% N2 ]1 W' ^2 r if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {$ ^8 m+ Z+ B4 U0 P
ix = 2;0 q; D& D7 x0 J! Q2 N s
exitg2 = false;( i. C1 u9 q l1 n
while ((!exitg2) && (ix < 81001)) {# h2 |/ k. J. d I
ixstart = ix;# T; l3 Y& s5 Z( `! C. V9 y
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
3 r. @% K/ M6 |1 h' p; |: }' D mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];& P# }% V+ ^8 s& M# H' c+ C
exitg2 = true;. y& V7 L" i% i' ~' a2 \
} else {* q' g3 m. B1 a7 v# y5 E6 v
ix++;: ~2 w$ P. b. c8 b; P7 n
}
1 y; C7 E& K* Q# k) L% L' e }
( y9 I% h' s7 p2 i( f }3 o- m8 c1 K/ I! Y5 R$ d. |
# R/ q. Z* k) [) @
if (ixstart < 81000) {
2 n6 Z) v/ @& d1 w4 h! T7 K while (ixstart + 1 < 81001) {
8 y& [2 |. W0 U1 m. |4 D: u if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {7 a7 q# U# U6 K6 t/ o; Z+ Y
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
* X8 Y- n" h) e5 U4 D G" d }
+ e J. {$ p9 v' s4 X
& x6 U: E! Z: N+ C! A- E ixstart++; i3 O6 }( a [/ D
}1 `6 a. y( z) x* n8 P
}
! p$ x# { R2 G* E" f
3 S! e! T$ G% b ixstart = 1;
! M3 m4 O; p+ e" F) l yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0]; d) {( N% G% A s% l b/ ~( y C
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
/ ]4 t4 g5 y9 b% S9 o ix = 2;
% P6 i+ r* n" ^$ b Q exitg1 = false;6 b; T/ W: o6 g3 s9 X4 c
while ((!exitg1) && (ix < 81001)) {5 E) K* k$ g% A+ |% I5 V4 ^
ixstart = ix;' Y! T+ o f$ ~; v/ S1 g" @7 v5 L _
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {5 r) u5 U: `2 O: v
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
1 w3 Z% _+ ]" S' L1 n" J+ [6 A exitg1 = true;. Z' a' H$ [: x
} else {
9 Q) |) d, a5 K; \# r# E ix++;
: p, w' t6 k5 Q+ T$ \ }" G! \) V' S7 ]( y# @1 ? u! z* |( \
}1 I1 ]5 A5 M- _) `. {
}
4 b, O; B( ?! O X
# R& }: W* b. E* j L4 p( R if (ixstart < 81000) {
3 t/ o) M6 E. G: ~ X! s5 J while (ixstart + 1 < 81001) {) }/ l" u4 r/ `* V2 ?; c5 i7 c9 Q
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {; I6 _$ A& }9 I; r# [
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];# ^$ l! Z6 x4 t/ _
}; z# }# a" c9 l
: A# D, |: |2 r ixstart++;& ~, E' n- ~3 D3 G/ `4 W
}) b, C- p: b9 B4 M/ @/ c I1 h
}9 K$ z2 v2 t8 V( v. |+ d
6 L6 l% K: H8 X# N
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
3 c9 K3 [( w: A1 d if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {( U- M3 y( }/ \2 Y1 ]( {) m
yiDuanShuJu_mean = mtmp; _2 J- {. L( X0 w: G% Z) a
}
# u+ e) y! v J6 z# ~
! b- y) J& l L8 K4 O h /* 找出极值 */
% ], C$ E& `, F for (ixstart = 0; ixstart < 81000; ixstart++) {
4 S4 r/ ]% ]6 H: @7 O& h5 b youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
# `0 c5 K, }" S+ T( N M1 \ }/ E9 g6 h" Q6 Z% y& F
0 H/ g" L0 m) K; u4 g$ k/ R7 U- y
--------------帖子字数限制------------------
; v1 ?( ^/ f4 L" S9 x" Q6 p} h' F3 S: ?. b9 I9 b) K3 [% ~
1 Z( X5 B V5 o8 G
* s# {$ S- Q. h+ N7 y) p
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|