|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
% y# y& t$ s$ j6 S; M& D
4 X) R7 j- y7 }$ @9 Z! W- \7 ^! i各位大神:
- p! z$ |# h Z# A7 m; [) s8 T6 E U" ` 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)% U4 [# o3 H. X* f9 U
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:+ h! j1 w/ K% B' E
9 S1 a0 P4 c. i. t8 V7 b/ u X) P
1 [2 N; I) {: f; }5 P2 ]% L" ^这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。: R* ^' y' h1 d4 x
- N% K: O+ a$ l5 a% o7 B
并没有其他线程
0 v/ @( f z% Z反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
- M4 V" m( _$ b- @. U; _也说不定是和堆栈有关系。。。。。。
* E- A0 q g8 t7 L2 B$ V/ i请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数..../ j' b* h. X* ]& p0 d
0 Q7 d6 X3 Z8 L% T
) Q9 g& q d: Q1 z' z" C# `0 v7 z, ?$ b
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
; q. ~$ \# q% B, n! c) r7 |2 s" g. Y9 [ j! C }
" @2 C3 ~& b* c, f2 w* a附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
: ]' r" J* F# g7 B& ?1 _ static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
* U* p) Z. a( a) G
/ k+ V+ w! H* \; tboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(1 F; M. h) |/ F! x0 D: L. _
const double data1000[1000]) {
" K4 a5 u/ @$ d! [, l$ X
' P4 K# b- j2 _; z int myfuck;3 M0 x/ C7 a) w5 c1 v5 k/ d
double yiDuanShuJu_mean;
! P4 c* }2 e* x& J# O( K. \ double yiDuanShuJu_LowMean[1000];+ I/ P! T: n7 L! k; s5 ]9 |
int ixstart;4 B& r: h8 T$ j% u2 x) V G6 R
double dv0[1000]; e9 `$ [, G# K/ r+ B% T( G6 ~7 P
comm_AGC pAGC;
* R2 z* P& {: L$ u) q; Y% ` comm_CarrierSynchronizer pFineFreqCompensator;! Q# @! h: E; ~5 x( P/ g
dspcodegen_FIRDecimator pRxFilter;* m% K% f# c7 X
comm_SymbolSynchronizer pTimingRec;
' s! M. L* H a( e comm_PreambleDetector pPrbDet;
b( ^; }( S) R3 o5 Z/ [ FrameSynchronizer pFrameSync;
* U6 p( f# @5 w' \+ a2 d* E QPSKDataDecoder pDataDecod;$ t; d% y) n& _" W$ \6 u1 N( C) V2 U
static double usable_left_filtfilt[81000];
# S% g, J* a3 L# l! A/ D, X2 U static double youXiaoShuJu_QuZhiLiu[81000];' j* m& F/ b& K* r& V, M& l! o
double mtmp;
; t4 D( p. B# }- i int ix;' N( _! ~/ U* q4 ]/ \
boolean_T exitg2;
& a# N; E2 r! L& C/ a& y boolean_T exitg1;5 l! X* T0 L& _2 _5 h: X- j2 `
double YiZhenShuJu[800];% H$ D+ }( p& A% R7 w0 d
double dv1[800];5 V) I( Q% k# X a
# ]$ a8 ]# M( G2 J
( x. b1 r$ h3 p" V- ]8 S+ d# \
double b_YiZhenShuJu[800];# O; Q+ Y8 r, O8 V
double I_filtfilt[800];
G" Y, B+ w3 x! k3 z* u) | double Q_filtfilt[800];
{: x* E8 d0 p3 o1 f, O, { creal_T b_I_filtfilt[800];$ j G3 F3 Q3 Q9 v1 e) W$ ]
creal_T b[800];
3 ]2 g2 I' N; ]7 r, i creal_T RCRxSignal[50];
' ~# a: c0 j8 e$ u3 O creal_T fineCompSignal[50];
6 F- d3 O0 @( |0 [+ {5 [5 a double phError[50];
3 B2 N# |- d' S2 D: a creal_T timingRecSignal_data[28];
3 H% H, t4 [( b" f int timingRecSignal_size[1];; I* @1 _: G. w9 v n
double prbIdx_data[28];
: }/ w x9 n1 n7 I- N: ^. _' A0 F int prbIdx_size[1];
2 ^) n. g2 a3 y$ B \0 E0 C double dtMt_data[28];! c6 k- F! B9 U
int dtMt_size[1];4 U4 J% ]& ]: D# A7 K5 G8 e8 K0 V
creal_T symFrame[25];
% g# }( v% \& T. X5 `) M" l. o boolean_T isFrameValid;
# r% A# r! _' B1 x. W8 V1 p double unusedU0[3];
. J7 f0 l* D2 U7 h# u3 W, x! M
e, x2 h( z0 c. x# N% l/ c" K //调试过程中的变量
. H% ] O6 I1 ~. U, q: x7 p int enough_data;
2 W S) o. y9 z. U7 B6 W
P2 M7 v4 R$ Y4 S8 Y9 Z int enoughDataFlag;
6 F- c+ `# L. ?9 z' |/ ] int yiDuanShuJu_mean_int;6 o0 F$ d4 |( n
int int_sum_dv0;
( Z) t& y0 r! s+ Q( I+ Z- s5 w int oo;! D. e6 N* r! F5 B
int ii;" s5 Y+ u" H; s; R$ b
myfuck=10;2 c+ c5 ?& a/ k) C$ u v
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */2 K3 u* x' }$ i; w! i
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
, r( C) }. W7 }2 \ D1 ]7 ]+ ~' P6 k* }, O9 z
yiDuanShuJu_mean = mean(data1000);& u. _) w7 g5 E1 z2 u" S3 \2 [
% Y ~% a' f0 L) C yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;) a" D2 S# S' K9 W t
UARTPutc('A');, q: ~ B2 o9 J( l
UARTPutNum(yiDuanShuJu_mean_int);
8 Z( t9 p0 X% k UARTPutc('\r');
8 i. k8 C6 C4 @ UARTPutc('\n');0 h1 [: M( l5 D& C4 G2 u- d: s
5 K5 o! z4 z. E/ ^2 x; t
for (ixstart = 0; ixstart < 1000; ixstart++) {" O' m$ `# z7 e' h
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
! N- X5 g' w. i1 K }' A9 k; f! T0 T1 k, r0 q* D$ B
5 t5 \5 L; I8 m( k
power(yiDuanShuJu_LowMean, dv0);
+ K# N" B- g0 T' h9 [
7 A7 ^8 s/ q! b: L/ D. w int_sum_dv0 = (int) sum(dv0);
0 i# l3 S4 K8 N- a! k' U
8 ^( |0 s+ @# l+ i UARTPutc('B'); ~3 o6 W$ T$ o0 h) c
UARTPutNum(int_sum_dv0);' ?0 M" r( R' q
UARTPutc('\r');
/ A- e" P! _) m3 I1 g. c UARTPutc('\n');
1 |$ l6 N+ U3 |8 ?# ]' }. E7 g* L8 x# f+ Q
// int compareFlag = int_sum_dv0 > 1.0E+8;/ X+ S+ n* N8 C0 _
1 }2 Y# S7 D; k# l1 Y$ x) m if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
) s! ^0 E4 Z5 L/ R' l5 Q! a$ V( ` UARTPutc('C');# g6 r, n0 F( C8 @
/* 比较信号能量 */
' b4 s, j% u2 G0 O: E /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
; t, v9 Z/ V& W: y// yiDuanShuJu_mean = 1000.0 * youxiao_k;( P( x* Y; @" s' w
// for (ixstart = 0; ixstart < 1000; ixstart++) {
* m% J6 d" ^- f- n i// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =9 y' f; K5 c$ v" Y
// yiDuanShuJu_LowMean[ixstart];+ {4 X4 n: p- q( f* @$ |
// }
& }& @+ d" v* b//
& n" O. } a; x2 b3 j// youxiao_k++;( e6 J0 h t. Y4 [
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
; |3 }0 }" n% W6 u$ \// /* 感觉要取21个数,即0-20, */: w! L G. n- s' w
// enough_data = 10;//有效是10,无效是0
$ _" Z; P' L3 [ L( o# H) r// }
! i! x4 q, D) Y, W }5 ~ n9 U% L; y" O, L
( ^1 ~5 O. {3 D! }' [' d
( x1 B. j/ ?% j# {$ Y* E8 K enoughDataFlag = 100;; }7 Q* Z* \$ l& x3 P6 g
enoughDataFlag = 1000;
! h" F# S* s3 E. j enoughDataFlag = 0x02;' m. N1 R4 x& ]* X8 h
enoughDataFlag = 200;+ T; \) l7 t C7 i9 |4 {
" k ]% U2 \0 t R int myfuvk1;
2 W" M. R/ y0 a myfuvk1 =11;' K8 r* S) m! B/ C" {: I% n
2 E1 ~, t O, V+ K8 V
2 }* i; x, t3 ?# }0 r
enough_data = 0;: j0 a0 P( s5 Y5 ]% c
' W8 L0 Q. c/ Z6 ^5 m4 [// if(enough_data>50){
% k+ d! @ c7 q// enoughDataFlag=0x01;
1 p+ m2 \8 t. @* ^- P// }else if(enough_data<50){; q! u) @/ S$ B2 Y( v. k
// enoughDataFlag=0x00;//0x00还是不行
6 p% f8 }/ q2 O/ t: l8 }" F// }! r$ ~1 N; |5 W3 J& O
% _, K9 a( K! _9 N" r' R1 y8 r
: i6 U5 T4 `6 \5 I
oo=10;0 W4 M/ T7 V( f; P
oo = oo < 5;& ~' a% ^ @5 o5 t( w' w, y% ^, l
if(oo){! c O) c/ u I# `: f
ii=0;
3 x3 z7 L+ S x: i3 R" S" C5 N }
( Y1 X1 {0 B! Y% k( V/ S if(oo < 5){% {$ F- s5 ]% h8 Q7 V
ii=0;
7 j8 i0 @# O0 Y# P! Z- o# H3 h }
. C* g0 X' v- N/ v" ?3 L6 V4 a, ? if(oo > 5){
6 ?( Z2 Q' ]" x; h0 ] ii=0;
, h" q5 w* z# P. f }
1 n3 b! u! j* o9 h2 K- _. C9 Z5 o
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
4 O5 `+ h6 A+ S3 Q$ B /* 如果数据足够才执行主程序 */
5 p3 ]1 l4 Q( L! Y oo = oo < 5;3 O6 I* r4 i& L: [- k
enoughDataFlag = enoughDataFlag < 5;
3 t0 w G7 C& |# c1 h1 Z* g5 W if (enoughDataFlag < 5) {9 a/ |1 B1 r0 w; S1 p
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
7 `( G }8 R, L4 {' I AGC_AGC(&pAGC);
! @/ ~, K* c1 G6 x2 g
2 [7 l: J/ b1 T1 [3 v# K7 V c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);& u. E$ ]% W L9 r
FIRDecimator_FIRDecimator(&pRxFilter);
& \. J8 f; P2 Q- D5 ^
5 j8 X; d: C: L9 _ /* Downsampling */9 \- N! T( l$ L3 B0 d2 j7 n% Q' G
c_SymbolSynchronizer_SymbolSync(&pTimingRec);/ t5 U: P: X, k5 e. Q) q
" |. I+ J& u! i2 U! \( X
c_PreambleDetector_PreambleDete(&pPrbDet);; B0 C8 v! k. R6 o {* B
. n p1 x: C# s2 H /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */- O k! `5 Z: a" {0 j
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */9 Y* m: R6 ~! R! v. i
/* %帧数量=100 */' }3 l5 }/ Z( N& A+ q% i: B
pFrameSync.isInitialized = 0;
$ p7 W) d' |" p( Q. g
0 h) i7 K) D) v$ C" ` /* [EOF] */
( I+ |4 Y) }! M) I" J' {4 g) K /* 前导码长度是13 */0 y0 Y4 G5 _1 j" M& g
/* %qpsk */
; s' h% Y2 \% y7 c# a pDataDecod.isInitialized = 0;9 G+ e' I3 ^4 Z9 _6 z
4 o. u- f/ `" }. K8 N3 O /* end */
. n; M9 B8 B# G# [" _, z# k /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
7 y; E* e: S k6 k- `: q4 I /* Convert 3-dB frequency */
5 |9 T8 N D) X5 w% u /* Convert 3-dB frequency */
, d i! }; ^7 ?/ A) t filtfilt(save_buffer, usable_left_filtfilt);4 T, q4 o# P9 I! d' O
for (ixstart = 0; ixstart < 81000; ixstart++) {
; |* X8 s4 _* @- Q: ^ usable_left_filtfilt[ixstart] *= 2.0;
. T A3 n: B$ A m) \/ I% S }
) [( c; a( F$ o. d( @: T; ~$ C d
/* 注意乘2,处理幅度 */9 _/ x$ W& ^- P/ W
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
0 Z% f' e! `! s* r+ J7 k9 F /* %% 行列转换 */. X' m- [) C0 l3 M
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
& R" i2 M0 }$ N: r, q for (ixstart = 0; ixstart < 81000; ixstart++) {
3 H. ~ u2 L( j, o' a youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
$ V* y$ V" t1 ^/ \1 g1 u - yiDuanShuJu_mean;
{$ K/ O6 j& a) N1 _5 J }, y0 L& X' `2 k2 Z4 z
1 M7 N9 U# ?4 T8 ^6 y3 E& I
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
4 y) U( @0 [0 M7 A' ?5 [" j ixstart = 1;
% r( t$ S) i" \2 o mtmp = youXiaoShuJu_QuZhiLiu[0];
- f3 F! r- `) r if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {( a4 c; e* q' c* s6 x* D
ix = 2;
/ {/ ^' ~; P& r: g0 i exitg2 = false;* y5 X, T2 v3 h+ a. ?5 m; r0 |
while ((!exitg2) && (ix < 81001)) {
( h9 N( s/ O8 T+ l I ixstart = ix;
3 [+ M' ^' l1 O if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {0 \/ }! r4 y* R$ O
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];4 L, r g5 E$ O6 w% Z
exitg2 = true;1 y" T/ B! M6 {4 l8 r- t1 J. H
} else {5 m0 [1 G( ]( ~, |
ix++;
' i8 r* o) c- U$ N }( I5 F- y) ^6 J/ Q/ D
}
C9 v1 ^; L+ q, A }
9 l: w( j% m( p7 I1 ]4 L' a ]" Y& R
if (ixstart < 81000) {
0 O! a$ _" Z, v8 L while (ixstart + 1 < 81001) {5 o0 a2 |2 g9 U
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {- D7 ^' B' I% L
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];0 F d6 |0 c1 ]: Y8 X" ]% N% w9 ^0 b( A
}) v I, i) Q3 r3 {+ w, [; h; S* u
- v3 v' g& F6 s o, m* R0 p% T
ixstart++;! t' B2 D/ s4 S% `/ T
}7 M# @( v5 h# L
}
8 |4 R& W* y3 W! n2 U4 V5 w
% q0 g9 D$ c" ^$ y' ~6 R$ G ixstart = 1;$ y. Y' `6 Z, H
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
/ @4 E/ f5 ~8 k% W, ? if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {* @: o6 b s7 K5 f' i
ix = 2;
! r, f/ s& z+ V8 }) ] i exitg1 = false;# o& W1 O1 F& S# W' X
while ((!exitg1) && (ix < 81001)) { b1 Y( P' D& G2 c# X, K& G
ixstart = ix;
1 U) Z; q/ d0 w if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {2 I: |+ O( e$ h8 I3 ~; J
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];, ]+ k1 |5 X2 _" ?3 Z
exitg1 = true;. n6 A1 G9 E% G0 s9 m
} else {! u, M6 b. J; P) w0 E
ix++;, J9 ]; C! U& D+ X" Q
}
& G# F8 z7 K, }. o# [# O* R }' R6 |5 t% |4 T$ u- S
}! X% K* Z" x! ~2 j# G+ F
' M7 A( a; B* x3 i/ X
if (ixstart < 81000) {
5 Z, o0 @6 K6 M6 t j& o while (ixstart + 1 < 81001) {
2 D# }5 F" S: V if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
8 h( |* U5 [+ V0 p* t( d R yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
- @3 F+ F/ `, C3 L }
) F6 _: o9 ^5 y3 j
" f" D& u2 k$ P, r! Q: w ixstart++;
" |2 H+ X0 [# E; m* W5 l2 c }/ L. j! g0 }9 y1 {2 S8 O
}
! }; Y- v8 b7 E8 N% [3 B( G% K) q# U3 L5 I7 \7 B4 |8 X
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);0 i; {' M9 N8 x& \# Z
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {$ G% c$ c. m5 r( A! s# u, B
yiDuanShuJu_mean = mtmp;$ p( g- ~6 R% Y- F6 }; O: q
}0 C7 _) N/ W) _
7 \1 T) X% V, E8 B* C _
/* 找出极值 */
7 s8 H E* A. _% H2 C for (ixstart = 0; ixstart < 81000; ixstart++) {
, S6 K* Y5 ]/ U O6 a; O youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;. z N7 c7 }) F. p2 W
}
* B. T- @7 y/ x
' h, _) s. O4 q8 c" |& f --------------帖子字数限制------------------. d8 r6 @$ X. q1 i& S9 q# x
}
2 @% s" I- Q2 i# i! `0 n
3 X8 j }( D1 m t) A
, r4 Q* j7 W. C- M0 T |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|