|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 2 q2 t m3 X* z. _
2 ^8 h, q5 E6 T' o3 N! H
各位大神:
Q8 M. Z7 G5 _; `1 x2 O" _' c+ z 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~). r+ ]9 X/ x. C" ~
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
4 \7 P2 K3 o) H' c# P5 y. Y7 u3 q# ~* m
& l2 ~' y ~. P+ T4 R
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。: r; C. A4 L+ Q, k3 s" P
: j$ t; }# x) W( N* p+ p
并没有其他线程
3 }# U9 @9 J0 H! u反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。- n8 e0 E3 |; K, l
也说不定是和堆栈有关系。。。。。。& f: T( e# k" |) [" B7 I' w: p+ X
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
$ A* P- w* o/ g9 }1 C6 E
! ?! m* r* Q% l7 Y, [$ I, T* n/ a0 T) R0 H; N+ {
4 A: R' j2 s$ x, G& }8 R
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
% g) e8 L' V4 X6 x- A8 E5 h+ m0 k, w* i; E$ p
( g: A. M. }0 M& d& c# i4 O附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];, j4 ?. h( u* ]
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
5 I2 D. N- H$ c- o
* t7 Y/ m- H* t) Nboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
( d; |# o2 e" t# r# Z2 D) ~ const double data1000[1000]) {
5 \, n3 P ?' d) |
8 I) e8 e- e3 w4 G0 c) x% s int myfuck;
2 i, S5 F7 |1 U" [' Q9 ]! W* e double yiDuanShuJu_mean;
! |3 [0 W: v. P- K |# N, M double yiDuanShuJu_LowMean[1000];! Q A: t2 ^6 f$ k* J
int ixstart;; S I/ _; g1 j7 W
double dv0[1000];" v0 W+ w/ C$ } [
comm_AGC pAGC;% _9 C. I/ ^/ {7 w
comm_CarrierSynchronizer pFineFreqCompensator;
' A- ~# g3 L# ? m7 \" ` dspcodegen_FIRDecimator pRxFilter;. I" g* q$ w- ~
comm_SymbolSynchronizer pTimingRec;8 l8 l2 C' O5 }9 ~0 j7 s8 |2 k6 D
comm_PreambleDetector pPrbDet;9 l: u. H, [ I; p+ n, B+ m
FrameSynchronizer pFrameSync;
& o$ n) z O& g4 [. @ QPSKDataDecoder pDataDecod;
( |4 |: y- w) o% Z! G static double usable_left_filtfilt[81000];
. h7 r% o' I% B+ h2 L- w# U static double youXiaoShuJu_QuZhiLiu[81000];
# L0 W1 y- E8 S" { double mtmp;
: A) t0 `, \" u, {6 o int ix;$ u" I5 B* T" o8 h
boolean_T exitg2;" P# O. }" n/ E2 A# T/ S
boolean_T exitg1;
9 P7 Q7 V P) j" V' l! n- P double YiZhenShuJu[800];
m8 Y+ T7 m9 i- T T: D' b2 Y6 \ double dv1[800];2 m) C+ r5 Z5 c3 z5 C( C0 Q2 u
. m5 E: k% b) C0 t, g* F; B# H
% b$ f. A- {& c9 E% @ double b_YiZhenShuJu[800];
' L) u6 h8 @) ^+ G9 q* K1 d, D double I_filtfilt[800];
# [! R2 h5 A2 m: _0 ^ double Q_filtfilt[800];& B8 n- e- D, S$ Y$ O' O8 ^9 U7 @
creal_T b_I_filtfilt[800];3 e. D( E+ G$ E, t
creal_T b[800];
p, _# `9 [6 B6 R- ]9 G* a creal_T RCRxSignal[50];* w) E e# p6 n3 T& W
creal_T fineCompSignal[50];. s) ]) L i3 K# F8 P7 F9 B8 |7 k
double phError[50];4 O9 w/ U; F% I5 E i' N! v* z
creal_T timingRecSignal_data[28];) b! `% {2 c& c
int timingRecSignal_size[1];
3 R y$ F* g3 S double prbIdx_data[28];1 b% [0 ?/ k& u" i" ~
int prbIdx_size[1];
4 P8 U0 L' A6 Z9 i& h4 e0 @% r3 j double dtMt_data[28]; ^7 f$ K+ P. \2 m) n4 I* R0 L
int dtMt_size[1];
0 k6 m7 ]3 e1 O2 d' t+ _5 ~ creal_T symFrame[25];
3 ^. G# }- N0 m" ~7 w0 q/ O4 e7 k boolean_T isFrameValid;
. S5 z+ G* j' E$ a- Q double unusedU0[3];! h" v/ q V }; b
2 Q/ y+ Z# l$ f% E% P$ w4 A; u //调试过程中的变量2 z* s. N1 q& d* T; y
int enough_data;/ c7 i/ l/ @4 B* {6 \
7 g' C/ i1 z; b5 E( t9 j- S! Q int enoughDataFlag;
& z! _- k- G# B' R int yiDuanShuJu_mean_int;
9 j5 C8 z3 w! E2 ]. K3 o int int_sum_dv0;
; \) V7 Q$ v# D* N# S+ P int oo;
6 y7 Z' B) Y7 [) q3 Z7 o- }: N K int ii;
$ I' ~5 s/ l! P ~7 g0 r" n myfuck=10;
' K9 s9 D; c0 e /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
8 @2 \# Q9 p/ {* R /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */1 L: U$ B! _' D+ o3 W
- P6 u0 B0 _2 n$ Y o yiDuanShuJu_mean = mean(data1000);
" }) v* S B0 O+ O, K9 j, j& M: t5 a* [7 f
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;- F; R+ {* A9 p% L Q3 @1 [+ R1 J
UARTPutc('A');- U+ n$ Q1 h: E7 D- `
UARTPutNum(yiDuanShuJu_mean_int);% Z1 n/ R* O' Y2 _
UARTPutc('\r');
2 U5 X$ E: N3 |8 g UARTPutc('\n');3 {9 R6 J0 c5 _
2 t* H* B0 {7 F* n5 X
for (ixstart = 0; ixstart < 1000; ixstart++) {; c) K3 ~( S3 i% `# _& D, R% V
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
5 `& q/ R% w3 f }
: g& B% h8 Z% B2 l! w0 Q4 G) m0 i$ E7 `7 i
power(yiDuanShuJu_LowMean, dv0);
5 W1 d( I" V6 l, a
: y) t- L) ` m @, M0 V int_sum_dv0 = (int) sum(dv0);
+ G( ~$ O h/ r! g9 |
9 [" Y8 x, u% B) b: J) S UARTPutc('B');$ C; T1 b' B. g. r5 L Y
UARTPutNum(int_sum_dv0);
* n1 G: f8 T& i UARTPutc('\r');3 i& s: q! m }" F4 J" k
UARTPutc('\n');
- v' B, j9 j- E7 |, z0 {
% V9 n$ P- D5 `, \! g c// int compareFlag = int_sum_dv0 > 1.0E+8;
! L. D8 C( X. R+ _7 \1 j) M
$ _( I, s) E- O if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
- e( l1 |1 [' K7 K! k2 d8 a UARTPutc('C');4 m4 I& t T. J0 i+ x% V, M! G* K
/* 比较信号能量 */. V* ?, P/ ~7 p- g* G
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */* c5 i4 B! ~ W1 N/ X. n* F1 L) S
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
. \. t" |% S! A/ s// for (ixstart = 0; ixstart < 1000; ixstart++) {
" S) U, ]9 w% w* O// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =, g& b, |+ `; Y3 K- O5 p
// yiDuanShuJu_LowMean[ixstart];7 U" |# r( O% @+ {8 W/ Z
// }
' n8 M! t; s8 H9 p' h" W//
; A' i3 W. v- @% A- n# N0 e* J+ m// youxiao_k++;
9 F" E3 W0 a7 A+ m% E+ j7 x// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
- L* \/ ?" L( g6 C( E3 r5 t// /* 感觉要取21个数,即0-20, */
5 D$ m) o5 e. J8 x4 |! W// enough_data = 10;//有效是10,无效是0
- D* n" M; B' X2 _ M8 h* _- }1 Q// }6 H% J3 Y( |8 z {# \$ z5 m+ c
}( T) K! E d+ v. S* r5 k
8 }0 G9 H0 ^) z8 H% R$ ]! [
: l* g# u4 P# f' q% p enoughDataFlag = 100;- c4 U$ G+ w# \4 p5 U* P, o
enoughDataFlag = 1000;6 `7 R3 y# t5 E, o0 U( F
enoughDataFlag = 0x02;7 j0 S# Y9 o @; e$ I. L% u, T; i
enoughDataFlag = 200;
. ]) @) g! ~! e6 j- {( N+ c$ [# H% n9 w
int myfuvk1;& a+ [1 \. G3 d& X; F0 L, M0 D
myfuvk1 =11;
5 b' X0 B* n8 X0 k+ A4 J2 W1 Z& k _; i& `/ _0 M1 O* D
! `) k: K9 f- t% a6 a& o) Y enough_data = 0;% I, i% X, @7 W3 E7 G7 G7 K4 a7 ^
9 u, F* ^' V& B4 `7 G
// if(enough_data>50){
/ q, U( ?/ d; h, m// enoughDataFlag=0x01;
% v" _# W& I' H3 s7 y// }else if(enough_data<50){! ^" L+ v! s- L3 z! r& r
// enoughDataFlag=0x00;//0x00还是不行% [: _& ~- r7 u) `- l' t' r1 ~! Z
// }
9 L2 \$ E% P6 g' C0 ?' k
' r5 y7 |* D: g4 I4 |0 t& p! X7 Y: j4 Y4 ]# Y. i1 j$ v
oo=10;: m* W- N* n% |. o
oo = oo < 5;' B z c! f( d0 x5 v6 F4 B2 w
if(oo){* a) c" I! B3 N( x) C' s/ d
ii=0;
1 c( S# V0 E& i4 i& N }
" @4 p2 B6 B% \$ |% j if(oo < 5){& T' e4 k$ W6 Y5 P M
ii=0;
( G& \0 N1 Q$ M2 ?5 z! _ }
+ d& u/ {, ?! ?: J6 ]8 H E V if(oo > 5){3 F3 G8 E: d: j# p0 q. g7 J5 _9 C3 p
ii=0;
' R8 N3 x6 e+ I. m+ ~, j [( t }+ `3 H' i; T: v5 z8 K
& j) E" m1 n3 z# }# x% ?: r( k /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
7 n: r$ m7 b* V! G; j /* 如果数据足够才执行主程序 */
2 i! O5 O4 r; K: B7 T9 q oo = oo < 5;0 N& B% d9 R- k, E) l9 g
enoughDataFlag = enoughDataFlag < 5;
5 Q: r6 v/ v$ a( m' o. s if (enoughDataFlag < 5) {
" k9 x+ I% ~1 _8 M: l& [( b! F// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
4 s4 X9 e, M8 A+ h/ f/ Y1 | AGC_AGC(&pAGC);
" d# z- [: a' J* G9 {& g
7 T' q4 ^# J/ D. u2 O; d c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
! a" B2 j& w8 w6 F& O FIRDecimator_FIRDecimator(&pRxFilter);4 ^& {6 y" {( g) q+ X" |8 u* t2 f5 ~
( X5 f2 }7 V+ ~# l. K2 k9 o2 s /* Downsampling */! ~ {7 `; S( i- m& Q
c_SymbolSynchronizer_SymbolSync(&pTimingRec);, N4 P, T$ T+ W. s/ c
& u Z2 c5 D2 y) y c_PreambleDetector_PreambleDete(&pPrbDet);2 V2 t- A3 x% g5 D/ i" D9 t, r
" Q2 q4 [( W: E, J* X2 [ r /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
& v, D5 ?$ T2 M) u) B2 r" N /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */- D" Y! r* N. {! Q7 x: @
/* %帧数量=100 */
; F7 _2 O2 x# U4 \" w pFrameSync.isInitialized = 0;% r) p+ H0 u8 o$ Q+ L2 v* A
1 N6 X- p6 c6 d5 a
/* [EOF] */
$ D8 E. j4 h/ B /* 前导码长度是13 */5 S% v+ b5 a" P# b9 z2 _0 X
/* %qpsk */
1 u! ~* ~" J4 ^6 O pDataDecod.isInitialized = 0;
4 O7 x0 D( f$ s' A: b
0 s4 T6 _* J/ ? /* end */
6 d( F0 t) j a0 y. m5 U6 p1 J /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
& l1 {2 v) u l# l+ a4 ? /* Convert 3-dB frequency */
- w z1 r! N( p+ K( h- m2 j. X7 v /* Convert 3-dB frequency */& |* Q- I6 |' m% Z, N$ v
filtfilt(save_buffer, usable_left_filtfilt);
8 I( o, ]- z$ e( X' S$ Q for (ixstart = 0; ixstart < 81000; ixstart++) {
# N( t9 s. h& a' B8 ~ usable_left_filtfilt[ixstart] *= 2.0;$ M2 a( X6 P. F5 c/ n4 c/ C0 a
}, y g: t- m {! E- ?+ i
# V' i$ N$ S+ j. X* E+ G, F" M
/* 注意乘2,处理幅度 */
- i# y* R. c5 p$ ~, z1 L9 ^ /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
! c" }+ t1 W3 } T( a /* %% 行列转换 */
- Y0 }1 a# f/ |# E yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
. ^1 L, L0 S* e$ h. W$ @ for (ixstart = 0; ixstart < 81000; ixstart++) {6 Y4 N; e/ z; ]; {8 ]+ Z
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]" i$ T" _3 d& O& K
- yiDuanShuJu_mean;
0 h, x; n4 |9 r8 X# t* j7 C0 D }- s; y/ s0 y+ u8 ?6 l0 C
, q. C1 w# C7 |- T$ t2 @2 d3 O- U /* %% 应该对数据归一化,但是这一步放在哪比较好 */9 {8 O/ b7 \8 u' N% D: b: s. v/ w
ixstart = 1;6 N1 B# P" P' r9 }6 O3 f3 ?8 [! W
mtmp = youXiaoShuJu_QuZhiLiu[0];
0 G. q8 a2 C4 @/ Z if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
8 i }- T% Z/ M2 W& F ix = 2;& f- y3 U! N! v
exitg2 = false;
1 x! `- L @9 V while ((!exitg2) && (ix < 81001)) {
% j2 x6 k0 X& q; n# R8 s( z* ` ixstart = ix;) s. M% J2 k* F9 Z' ?7 B3 _+ Y) z/ K! M
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {6 K4 [ Q- K; k2 v! R& w& Q
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
6 }6 v6 m3 |4 Q1 x; f exitg2 = true;
d" G* @. i2 d/ U* } } else {; X$ k; |6 v# |& e
ix++;* O5 C( K8 l' I- G$ a" ~
}
! M& b/ i0 x/ @+ t$ R }
! q, {, X. h+ i) ]" k }) B# V* g7 c1 Y L9 K
; o& ]& M' r: f2 Q* M6 P; {& o9 P/ n% s1 R if (ixstart < 81000) {& ?9 v# G& `/ L$ k8 \, K
while (ixstart + 1 < 81001) {
5 V, G( N; {- T; F if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {% w4 C# }7 [2 T4 s$ A
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];3 T4 ~0 v& i' t+ q E/ n
}* H4 F% M" i" F8 t; Z8 o
* k) t- l; w5 b3 N ixstart++;
+ c; R+ F! S2 X9 X+ k# B8 ^- p }/ }' C8 T* ^- j' ^/ V* i
}
8 s3 q% ~$ Y+ b- g) S' v; s/ c" Q R0 f, U# \
ixstart = 1;
3 n7 R; S+ V! y0 [4 d( t. J9 I yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];1 J+ |& A5 E/ l8 ^
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {0 `* X) h% [8 s1 I1 I
ix = 2;- } P a! R$ s1 q* {
exitg1 = false;: `+ O2 @( F' f6 ]* V1 B" D
while ((!exitg1) && (ix < 81001)) {
: i6 R5 D Y+ p2 t0 q ixstart = ix;! i1 ?' n3 U1 L8 z, n* c3 Y
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {, v( x8 |# X9 o0 I$ u) q+ M
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
1 L7 }1 J5 T" B: I exitg1 = true;
+ ~3 k& I# u- j7 F4 k! b } else {* U) E9 E& Z- Q+ p, R
ix++;- r8 A+ x5 ?$ Y6 w' ~
}
$ m( Y0 _3 w4 |/ u+ l }
$ i. X/ I7 j! X1 Y }2 T. S- R% M1 i4 k, }5 r
# l! F2 G) Y) {) _
if (ixstart < 81000) {
+ D: g$ N% C. Z% G2 Q while (ixstart + 1 < 81001) {2 Y' O6 b* \8 P5 S8 r) V# {
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
' r8 ~9 w; P7 p yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];0 j- `4 u4 K9 C
}
- u( u0 Y/ T! @2 A% R4 t) T
% t: Y' |1 w: W' R4 Z ixstart++;9 \; h, h) v6 d* b/ d
}/ l5 q7 w* y. ]
}
4 U+ {5 ~! i8 L2 }7 r1 n, g! ~# Q S9 ]
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
8 M& _% o5 I m, m if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
* Z$ g1 F& W+ k" R yiDuanShuJu_mean = mtmp;# @6 N. _- ~% T( [+ J! L
}
% s7 }2 [3 J8 ]! E
& o. `/ B# ?" y3 b! i% h /* 找出极值 */
+ ?& M3 e( b' S: {5 g5 U* H for (ixstart = 0; ixstart < 81000; ixstart++) {
; C( C7 ^9 p) @ youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;$ e' Y1 e0 `8 l1 c/ B) e" }
}
3 p- S% r$ q* I; P: h( D
% W* \# R( b V1 B7 M- Y d. t --------------帖子字数限制------------------9 U2 ^* I" Q: }. D
}
6 y5 h+ p% Q/ o3 o1 G N# t
+ f5 v/ h" j; V, D, D! s5 o/ x/ Z5 ]0 [4 S- W
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|