嵌入式开发者社区
标题:
debug时程序运行的莫名其妙
[打印本页]
作者:
zhangsan1231
时间:
2017-6-8 15:50
标题:
debug时程序运行的莫名其妙
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
' B, B" u, ]( I, L
7 p, h; K1 V) |1 v- V8 G$ z* \
各位大神:
! D- m. y z) f; |7 i
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
- \ Y6 j6 g+ U N8 I3 y
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
3 l. b3 y& |. g; P& ^
u& V& R) Y d3 |, W$ c, m) h+ \
[attach]2441[/attach]
( J9 ?) D1 d, ^' `* H0 v
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
% w! u6 I' k. U' N. \0 p0 P/ S
/ H, j1 A Q+ B3 Q
并没有其他线程
' n/ U) v. h9 k2 O/ x/ ]7 R
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
7 _! ?5 w J: r& j) {
也说不定是和堆栈有关系。。。。。。
5 E( _' n; N h. w7 G. e
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
9 |4 W/ Z9 @! l$ b
[attach]2442[/attach]
J9 y4 d% M, S8 ?
0 V0 U9 q! Q( m8 r) U/ f
9 F4 } h& _* x6 ^! t$ m1 c
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
5 C( S: @( e& p0 `
& U0 Z4 f x7 N' W3 d
, k) {2 w9 Q( D5 H9 @+ N' ?. ?+ k8 e
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
6 p) m% z' B7 {, _ G5 H: L
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
9 E' ~- o0 w! I
0 ]( F' l1 x4 U( Y! N7 h
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
$ @+ t, B; Q- Y2 j# I
const double data1000[1000]) {
% [/ P4 W) M% s; E+ L- w$ I
$ W" S7 Y3 w) [ Q, A4 I
int myfuck;
7 d% e b" I" K7 C- w0 q( o
double yiDuanShuJu_mean;
7 |3 c0 o" u" `
double yiDuanShuJu_LowMean[1000];
0 s3 q& i& i$ u! h% f# L7 c
int ixstart;
: Z. g$ v3 T% e" h5 W
double dv0[1000];
; y( p5 I+ _' v7 h
comm_AGC pAGC;
8 H, A/ W4 b9 \
comm_CarrierSynchronizer pFineFreqCompensator;
4 G7 g6 J0 K- E) _$ h V: H
dspcodegen_FIRDecimator pRxFilter;
( o4 C' m2 ]) V, R. s" r
comm_SymbolSynchronizer pTimingRec;
; P' [' O; g0 `
comm_PreambleDetector pPrbDet;
; ~/ w! w1 @9 `3 \0 Y/ r2 O
FrameSynchronizer pFrameSync;
- I5 z; |4 f5 z- l0 w1 Y V2 U
QPSKDataDecoder pDataDecod;
" ]5 Y/ y8 ?/ e1 u
static double usable_left_filtfilt[81000];
7 W# G% c9 ^& x
static double youXiaoShuJu_QuZhiLiu[81000];
, B( { S' T* @$ B4 Y$ I6 O6 e2 }7 p
double mtmp;
& S3 ^( r5 o& p
int ix;
; `( C7 ^- p) A) i2 `
boolean_T exitg2;
z- i1 k Z) K( p+ W
boolean_T exitg1;
. D! P+ }9 z+ R
double YiZhenShuJu[800];
. y- L5 O- x; Z
double dv1[800];
# Y! M1 O" J' j2 e
" {) f- j; @6 s* O8 Z
+ g1 u3 g6 Q8 D t2 F
double b_YiZhenShuJu[800];
R% M3 Z" A# R
double I_filtfilt[800];
9 p/ |( K2 ]) S7 G4 Q* v; g
double Q_filtfilt[800];
) Z& Y o) ]' F9 K% L1 k
creal_T b_I_filtfilt[800];
. ?; n* p6 @' a+ n
creal_T b[800];
8 `! y$ a5 D) t. M
creal_T RCRxSignal[50];
9 s, M; y# d5 D( p
creal_T fineCompSignal[50];
- r i, L, e- I+ [
double phError[50];
0 Y9 J4 O! L# t6 T
creal_T timingRecSignal_data[28];
P; g! Q6 E0 z& M$ Q% l
int timingRecSignal_size[1];
j4 T) e. |5 S
double prbIdx_data[28];
: K6 w% |7 n4 d1 p8 f
int prbIdx_size[1];
, y: }8 U" {/ e$ I4 `/ b' b
double dtMt_data[28];
6 |8 c4 }& @9 S+ r6 G: H/ \6 i( A7 U
int dtMt_size[1];
V: [' Z; R( Q8 N. T. N5 l
creal_T symFrame[25];
* j2 k3 E6 l* K5 j4 _ I
boolean_T isFrameValid;
8 `% G8 s4 a3 n( U" b0 `
double unusedU0[3];
* C% t& l. _5 k4 l3 V; P/ }
2 O4 f5 o6 i! X) G
//调试过程中的变量
/ c: b6 O0 y2 a& N2 @3 N
int enough_data;
4 ^( |' w: V1 y8 I \ f, `
. o. V3 L1 m0 I! Y
int enoughDataFlag;
+ U7 S& d2 F, f7 d
int yiDuanShuJu_mean_int;
( |2 r, r, v: O# S
int int_sum_dv0;
5 h9 [' R: G! y
int oo;
3 g0 _* q6 R- b1 l( ]3 q4 Q) h
int ii;
1 X. q' P( K) H
myfuck=10;
1 Q7 i$ @5 r9 B- h
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
+ ~1 Y1 ~0 `1 o; a; C- V' a: A
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
3 v+ W2 e" Q1 P9 L1 \& Y' h. g
' l. Y, w; C- f' y }9 m% K5 i
yiDuanShuJu_mean = mean(data1000);
" j8 {+ a+ q! J$ k2 P1 a C$ U/ x
0 U U% h ]( K7 u' _$ h( _/ @
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
% d. }3 n9 @2 u7 j! }5 ^1 ?' l" L Z
UARTPutc('A');
" A% E8 H) @4 g7 M
UARTPutNum(yiDuanShuJu_mean_int);
/ V& r0 _* S2 O- Z! t: p3 [
UARTPutc('\r');
) z, q. `% K0 d7 V a; g
UARTPutc('\n');
) [3 V) _/ y; A f( b
$ R6 ^; s+ r; y$ i' y) Q1 R$ e7 F
for (ixstart = 0; ixstart < 1000; ixstart++) {
6 a* E& d7 D; H8 ~: z$ d$ n
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
" Z+ {8 G& s2 j3 y# ^- r
}
( T+ z+ v/ E& k7 g0 L( e
: N6 a3 n% H( J1 j- Y
power(yiDuanShuJu_LowMean, dv0);
. y3 \' m( r7 l
7 C3 E, S1 A; ?8 W3 U- `; K
int_sum_dv0 = (int) sum(dv0);
/ a& f1 a8 l1 P+ J9 j/ I
1 d' @( Q9 o3 w$ \
UARTPutc('B');
b. Q5 i, d* u( B0 `
UARTPutNum(int_sum_dv0);
' Y; z. K6 l. E, A* ~
UARTPutc('\r');
1 U/ H2 q- { W
UARTPutc('\n');
. z, A$ ?7 G! C( `
, S( s. C2 `" l" R- m
// int compareFlag = int_sum_dv0 > 1.0E+8;
! O! `! [' o+ i' E* Z/ G5 [
+ }$ Y4 f% h/ U; M; x4 p- j0 T/ @$ p! Y
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
; r! w% j' N: l0 j
UARTPutc('C');
8 f" o1 Y. H% ~+ |6 n; W
/* 比较信号能量 */
! {6 y* X, x9 X, r
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
- h5 ~ I6 M0 R$ y; H
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
( r, l+ z7 \# O" m) x, G* d
// for (ixstart = 0; ixstart < 1000; ixstart++) {
/ i+ V+ `$ U3 u
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
0 C8 b+ T3 X4 A
// yiDuanShuJu_LowMean[ixstart];
) N' h; m' j& |# D* ^
// }
7 M* R$ b3 N5 C- R
//
: K: W6 q8 R. w# e" B
// youxiao_k++;
9 P0 E) t5 a* d/ O
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
5 q0 b: F' J9 I( T. F+ g
// /* 感觉要取21个数,即0-20, */
K: L- Q; ^* p0 M0 y' O; w
// enough_data = 10;//有效是10,无效是0
( L2 S8 U- a# Y9 p
// }
- y* c" L, O, p, T
}
8 O) ?: p# m2 |; |2 O
# F* f& j: R j7 k# X+ P, Q* J0 X: K, X
: x- X/ |3 K* Z3 B0 E$ ]! g
enoughDataFlag = 100;
1 A/ Z1 F3 ?& o7 N
enoughDataFlag = 1000;
! ?! S, _0 ~4 T
enoughDataFlag = 0x02;
4 ^8 j' d2 b: Q
enoughDataFlag = 200;
- n- k/ L* N, c" {; T3 H' X S
$ {8 v$ ?' |. X) d- D J
int myfuvk1;
, y$ `- z' G; B7 E
myfuvk1 =11;
' V' ^6 C: ?7 d( T
; J" O7 Y5 h; p( `
' L( A. B9 Q L/ G/ G9 ^6 V
enough_data = 0;
7 D3 H$ }& z/ P& ~. H) ]3 B
* r$ r+ M# x' \- T
// if(enough_data>50){
. t% t3 V0 ]; A
// enoughDataFlag=0x01;
0 Y& P9 e+ x R5 t' [. z
// }else if(enough_data<50){
1 M, Q7 H1 \2 ?' F8 q5 s
// enoughDataFlag=0x00;//0x00还是不行
8 C" x4 H2 F c8 u! |
// }
$ a8 F% u" h5 q
: Z! o: {: y' ]2 F: k
0 @) n( @5 j7 d; g/ N3 Y
oo=10;
: H2 @' N, m1 D' N* E
oo = oo < 5;
/ V' Q8 l& c( R. h$ O2 }
if(oo){
# X$ E( {- m, [
ii=0;
* S( a/ P) V4 a8 X( |
}
/ o- B$ M9 Q# Z3 r# m/ i" K7 a
if(oo < 5){
+ J/ _+ m. f) Q9 ~' n( s. r& p
ii=0;
1 L2 _% K8 t$ Y2 r
}
8 o4 m. f+ D }- L- b
if(oo > 5){
/ B* e% H; M; X5 f. r. P% w
ii=0;
9 q. R. P6 X. ^& Z) L r& L; @
}
8 S K4 ~# i- x9 v# \
! x4 h X! P; |" d+ v* ^/ I4 n: z
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
! l' x( T1 _, U4 u' {
/* 如果数据足够才执行主程序 */
6 h, J, t) q% }
oo = oo < 5;
* a( t3 y* x& x4 u: ?/ ^$ j! v
enoughDataFlag = enoughDataFlag < 5;
4 n. B* D0 V7 D0 v. A
if (enoughDataFlag < 5) {
3 G0 u* @ n5 {7 q: X$ H
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
* [" Y1 F5 A5 |
AGC_AGC(&pAGC);
' K2 ~/ C6 e) Q+ D- v* H
0 ]4 e; q+ x& K5 o
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
7 I+ Z, X5 ?$ r, L2 \
FIRDecimator_FIRDecimator(&pRxFilter);
' P8 z$ o+ d4 e! I
( J/ X" g! Y8 j, j2 @3 u/ z
/* Downsampling */
5 q# \6 o: e+ d. }
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
, Y5 v2 V5 a# P
5 }, `- g( @& j2 N0 z1 N
c_PreambleDetector_PreambleDete(&pPrbDet);
; J% ]3 }, K- U' p2 G, l% ]
W8 D; o# Q7 w$ T! ^) {$ e) e- f
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
: X- H* }5 T0 m- [' I- y! T' d
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
4 V; L9 I" U) h' A- r+ I8 K' J
/* %帧数量=100 */
" B9 b8 _9 Q* r
pFrameSync.isInitialized = 0;
; y0 T2 J: d5 f2 v V7 j5 E
0 q0 B* B8 Y6 e; g
/* [EOF] */
( d3 I8 A8 A8 o8 M" s* Z) [, h0 F9 U0 X
/* 前导码长度是13 */
; I/ K- E7 M6 n5 D9 A$ p- ~0 R
/* %qpsk */
6 ^7 n! ^0 s, c+ C7 W
pDataDecod.isInitialized = 0;
+ G$ l) D% \3 _1 ?7 Y) D! \
W. f) }3 D0 x2 d! F$ o6 R
/* end */
+ u; [4 ~4 h0 `0 B% t' {
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
+ E3 k7 `7 M# b0 f' u
/* Convert 3-dB frequency */
% j6 @/ S) B& F1 ?* n/ W3 q y6 V
/* Convert 3-dB frequency */
. Z- z( t4 H6 Q
filtfilt(save_buffer, usable_left_filtfilt);
! _8 O. v; c& R- l- y) T- L
for (ixstart = 0; ixstart < 81000; ixstart++) {
+ k p/ T C+ g; p) I- l& q( w
usable_left_filtfilt[ixstart] *= 2.0;
" Q: m: V, N3 T: {; {( M
}
5 H: L" L Y9 w( S; ^+ O* m
$ ^) v% t" j8 E Z- q. p
/* 注意乘2,处理幅度 */
% k g! d( y% r: s/ @: A3 a
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
; y G7 {$ I- Q9 x2 t) a
/* %% 行列转换 */
: h# R5 M6 n" r) S
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
3 F+ f3 B& W+ _- V0 d
for (ixstart = 0; ixstart < 81000; ixstart++) {
. m* }& J5 T; U
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
! {. I# b- w: ]& D# ^# `
- yiDuanShuJu_mean;
3 `4 {7 O0 K9 J5 b _
}
# E. g. J# l1 _, b# Z' k' C/ [) G
P7 a" \: |' t l
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
?( N4 Z1 S. [3 ]2 c* Y) c/ c+ i
ixstart = 1;
7 i* e+ B W" K. F4 f
mtmp = youXiaoShuJu_QuZhiLiu[0];
8 N" Q" |) |/ ]7 u" j: ^" y3 }; H
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
0 x, [* w4 l/ v
ix = 2;
5 M$ G7 Q* j7 x* T2 q0 b2 q
exitg2 = false;
( F6 N, {1 B2 W2 r
while ((!exitg2) && (ix < 81001)) {
& G$ A/ p6 m2 z. R. g
ixstart = ix;
: i4 d9 ]2 T w" Y3 |0 ]
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
* S2 P% w" t7 p a4 c. a
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
) k9 {3 P: g4 [4 A0 a0 z
exitg2 = true;
% W) s1 b* b4 S: {7 G
} else {
, g% W P" D! w" W `
ix++;
8 Z, J9 y7 o2 q6 {
}
& O( `% R+ |/ A. @
}
5 [- W' ?* e9 j. T. ]
}
3 v1 v% _- x- n: a
8 u, z5 x- X" Z9 a$ l
if (ixstart < 81000) {
- U+ d8 } I# v. X9 F
while (ixstart + 1 < 81001) {
C2 s8 s! [, u% z; J
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
_4 {% m; n9 P4 z
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
6 O, W q2 o9 h5 T' K1 y
}
+ u2 ?, }+ v+ W4 ^% t, B5 B
! @1 X( @; P, v J6 V( H3 F9 b
ixstart++;
3 h. V4 t8 P& E7 b9 j g
}
?3 W0 f; M, X' }+ |. U+ g. ^$ C
}
7 V4 P% W% u- v- i" ~3 m
0 C$ [2 }7 N3 A9 E8 m" Z+ j4 ]
ixstart = 1;
; t, y0 p5 i0 S) S0 h
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
0 N( s3 I. I; u) |+ P/ [+ ]
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
) W3 g! T& x8 T" j Y, l* |3 J! h
ix = 2;
- O2 d* M2 A4 N* V! S& f8 _
exitg1 = false;
9 T1 m0 R& F4 W- x+ }
while ((!exitg1) && (ix < 81001)) {
! T& S( h) I8 v: ]
ixstart = ix;
' l L2 o1 X. n- O/ e0 _4 e
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
, T& m) ^+ S0 j; E
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
0 i; X* n# R$ e! s- h4 O
exitg1 = true;
0 ]2 ]% e- O. k
} else {
0 @) G4 X, D% [" l9 g
ix++;
8 X1 U7 P9 _+ [ w0 i6 T6 t
}
$ Q1 C) ^: e6 c$ T3 @) t
}
4 _& w3 N; o& r
}
b$ ~7 ^/ v+ p- v7 n# B
, {7 h. x; M/ J) }
if (ixstart < 81000) {
+ Z0 Q9 S4 j# s/ \, U: a
while (ixstart + 1 < 81001) {
1 W% v3 L3 x+ h+ [- j
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
; O b! l8 X& f# `
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
4 s: Z' ^% P v( f! k' U+ ?/ m, ~
}
# p+ h% Q2 y% H/ I1 `; S
) B5 v% ?6 ~. M5 Q, H8 K5 ^/ b) H9 H
ixstart++;
, h* Z1 N- A! S
}
) ^' j, v& S& _+ n2 ]: d
}
, ]2 q# p4 w/ T4 H0 y
+ g# G& J1 @* N6 {* v
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
. g& P# N; v2 T, z1 ^
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
% A5 h8 D9 P& `+ m7 n) r2 L" w
yiDuanShuJu_mean = mtmp;
7 t0 s. \5 J" z
}
" C& N0 Z; c3 j
/ M4 h" \3 }5 ]
/* 找出极值 */
@1 }/ M, q1 J
for (ixstart = 0; ixstart < 81000; ixstart++) {
& X- o% [; w0 U8 i
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
# L3 F- N. ~ ^! N7 O8 i6 R
}
. @6 K7 I( k3 j- ]) b7 N* t
. C' L+ Y; W+ P% z" c
--------------帖子字数限制------------------
* [2 B% _8 G$ F9 j' m' x4 h
}
~9 p& D4 E: q( X
3 L+ M% v2 z6 E' t' q+ y- [( ~8 Q
0 t9 i C5 ^$ T* ~# F- ]! {
作者:
tenny
时间:
2017-6-8 16:37
会不会有其它并行的线程修改到了它
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4