嵌入式开发者社区
标题:
debug时程序运行的莫名其妙
[打印本页]
作者:
zhangsan1231
时间:
2017-6-8 15:50
标题:
debug时程序运行的莫名其妙
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
H! }; g! u7 j( o$ Y5 }5 v$ g
& }, }* _7 _1 R4 o/ b: W
各位大神:
1 j7 d+ Y+ n$ M! g! N' B: k
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
$ v0 A: d6 M. s( f# X
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
. d; Z. V/ X* m- r' Z* C
% b8 X) N {$ j
[attach]2441[/attach]
! }/ N5 u7 q' p, r8 U6 g
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
% d- p- c' [' ]" T2 Q& y% S. n
) q3 @+ y& {5 v, ?1 s
并没有其他线程
! o! U4 C# ^$ Y$ H+ U
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
4 v7 G' I1 ^8 D6 V
也说不定是和堆栈有关系。。。。。。
5 h, p6 i4 g. j+ d/ v f, x
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
; C% y$ p6 R6 s* k
[attach]2442[/attach]
( S; C* v) B& r" j. |7 B* I; P7 }
b/ Y8 V8 w5 w* B u
! O6 T/ J* u' Z; M) q' H0 @
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
: v8 t4 e. H( e3 c: x; t1 D
8 \$ ^% j" `- @: _9 g! I& |
( r( M& s# j" D# [6 J5 a3 {
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
9 J0 U! M* l# Y# R+ `
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
5 w( n; p# ]3 N
0 [$ D, r, N: `! Z! [
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
9 w/ j" G: {" K8 A7 G) E( @# Y0 l5 u
const double data1000[1000]) {
/ d0 q4 Y: i% }4 y, F& p7 B
, n8 [% k" Z6 W4 A
int myfuck;
* @2 T8 Y2 M# s# a. m y9 w
double yiDuanShuJu_mean;
0 V2 ]$ x, _6 k4 o; C
double yiDuanShuJu_LowMean[1000];
+ `+ z2 r" v, d) D1 K N
int ixstart;
- ?# Q7 X' u# s+ N
double dv0[1000];
8 u' d+ z+ n3 h8 }8 a3 l+ X% a
comm_AGC pAGC;
1 }, E9 t9 {% B9 w
comm_CarrierSynchronizer pFineFreqCompensator;
$ c1 {% x8 B% F' F- Z& ~
dspcodegen_FIRDecimator pRxFilter;
$ V4 l% K9 G2 r
comm_SymbolSynchronizer pTimingRec;
- B, p5 @+ o) v7 U' i0 r
comm_PreambleDetector pPrbDet;
" Y, ^6 k1 n( l; J; \1 P: b2 h6 \( @
FrameSynchronizer pFrameSync;
( F8 U7 n6 i( Q5 i- K6 ~
QPSKDataDecoder pDataDecod;
8 g5 h4 d2 k8 a4 a6 [- `. H
static double usable_left_filtfilt[81000];
, I" e4 D6 i8 D) h6 E! Y4 j
static double youXiaoShuJu_QuZhiLiu[81000];
! M0 M& \8 L/ S5 j4 y
double mtmp;
& P2 T3 b( |: D# Y
int ix;
! {- V, C& ?+ p, F1 s
boolean_T exitg2;
( g& o8 J+ p5 L& _! }5 k
boolean_T exitg1;
9 w7 m9 [' ~" W' J0 m9 k f! k% E6 l
double YiZhenShuJu[800];
( Y0 A1 V6 N8 R- q( N
double dv1[800];
+ i/ O8 c0 u' k/ ^
: x* {2 g; P3 l m4 N8 }- y
# G" s8 e& b8 O/ F/ j e
double b_YiZhenShuJu[800];
3 N9 g& n, h6 A" U
double I_filtfilt[800];
, M: U+ l6 v% t, y
double Q_filtfilt[800];
8 o; t& N* f4 y" i# b+ H& b6 g
creal_T b_I_filtfilt[800];
' N" d9 h- a& K5 o
creal_T b[800];
' W4 U) |) ^: Y" U% ?6 v) f& |
creal_T RCRxSignal[50];
: I9 _: [' L1 b
creal_T fineCompSignal[50];
- y; N% g4 y! [" F+ B) b6 f# j
double phError[50];
' D( F Y0 o" A- e' ?+ y
creal_T timingRecSignal_data[28];
& R1 X9 }6 ~& A6 B r
int timingRecSignal_size[1];
, y- D/ _7 [9 @$ H5 Z
double prbIdx_data[28];
; x% ?7 [% X2 o2 X( ~+ t" ]
int prbIdx_size[1];
: d- M$ K, z3 v! D, `6 I) p
double dtMt_data[28];
3 [. F1 ]& c! p4 n8 `8 w+ B
int dtMt_size[1];
( y2 s: C8 U: [5 [
creal_T symFrame[25];
2 v: s* c! y* ^$ {6 X) I# h
boolean_T isFrameValid;
; c& c1 b5 Q! b6 ]7 U+ s5 U+ z# K& v# B: _* q
double unusedU0[3];
/ i7 \9 R3 \9 K* p5 f% c
) t; H0 n1 x3 s. w( r" {6 s$ |: g4 j
//调试过程中的变量
' s3 F+ [! P* j7 ^
int enough_data;
9 J. p& S4 ~6 m6 |5 y& k4 ~! L
3 h" v8 p; X8 j' u& x
int enoughDataFlag;
) x4 y; O8 e% N* d4 f" d
int yiDuanShuJu_mean_int;
6 n! |. z0 w: Y; p/ O2 t2 d* A
int int_sum_dv0;
5 N. T- z8 }3 S+ B9 m) N- h. C
int oo;
]- q+ m- t2 W: K* L2 n3 _" L
int ii;
4 _6 O' B# |' ?" l) Q. i
myfuck=10;
/ a; c! K: P6 W$ R2 P `& m5 Z
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
% V* {: F& R& P; A" o' {
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
# c1 {3 M9 d" Y
* ~; M( V5 P% r, ?
yiDuanShuJu_mean = mean(data1000);
2 x) O: G) Z6 D6 h0 C9 J
. ^& d0 O# X# A0 A) m: X
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
/ c% E& L$ ^7 O( a! g. o0 M
UARTPutc('A');
1 @" [* \7 @0 {% U b. @* Y) I
UARTPutNum(yiDuanShuJu_mean_int);
5 X6 U! k: h- B5 ~# m; ~
UARTPutc('\r');
T" c4 x4 b5 U- u
UARTPutc('\n');
7 N, ^. X/ |+ e2 e9 ?* D! r$ p% T# b
& R# P# S/ L) @, V7 h4 c. O& V7 C
for (ixstart = 0; ixstart < 1000; ixstart++) {
! k$ K& x: S$ k- _" y6 m
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
z# `: X3 m% ? t/ j% V' Z' C/ ^
}
' y. D+ N0 `9 C0 f4 t O t( A, z
- w" W }4 `7 o) _% ?
power(yiDuanShuJu_LowMean, dv0);
$ p" B4 z# x P1 M! Q; x
5 g/ \+ N1 m3 k8 h9 x. o
int_sum_dv0 = (int) sum(dv0);
& ~5 ?1 ^% a5 l: }- f5 f# O
+ e: a$ u# [$ [
UARTPutc('B');
- q4 _' p3 Q& ?% z: |$ }
UARTPutNum(int_sum_dv0);
! C$ a+ e! h4 f: _
UARTPutc('\r');
9 I: v+ v$ B: T6 `2 ?$ u
UARTPutc('\n');
5 @' @- U, a% Z: a
; L5 i) m2 _' q4 `0 W3 t
// int compareFlag = int_sum_dv0 > 1.0E+8;
' h" ~$ X& u+ n/ P
% n. ]; S$ n5 ?: a+ q" H& f; J
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
w' G/ r" u: i1 x
UARTPutc('C');
( n- V4 d9 k& n! @- T: \: T
/* 比较信号能量 */
% @. A6 t3 ^5 U5 d: B
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
6 V. M% o- B3 z2 T- Z
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
7 I2 {% m9 q# L B) a0 j! V, u
// for (ixstart = 0; ixstart < 1000; ixstart++) {
9 Z; q: A# `, ?$ f- v# H
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
! W- _8 k( f8 N' {) g* G) `" j
// yiDuanShuJu_LowMean[ixstart];
4 P" Z/ i1 X1 u O
// }
& t7 m3 y5 ^& o: t% a
//
0 |) U$ P% S/ s+ C9 R# f4 p
// youxiao_k++;
$ t7 h: V0 y& L) J. ?8 S
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
% D4 b8 l1 H, a$ @
// /* 感觉要取21个数,即0-20, */
: x. `+ t- ]% L
// enough_data = 10;//有效是10,无效是0
. e/ E0 f1 l/ P& u2 V+ V) F
// }
: z# q" x8 O" b
}
5 Y" E B- k% C! w
* I( s ]1 B) o3 o/ F
2 y$ ]/ Y# L% n9 o, h% Q6 ?3 K }
enoughDataFlag = 100;
7 b% W7 F7 r, j& A1 a+ H
enoughDataFlag = 1000;
- H5 J& f% X& w6 Q, l; b n1 k \
enoughDataFlag = 0x02;
: f0 {/ r' H/ n$ D& }! a$ M7 y
enoughDataFlag = 200;
9 ?; t2 ^# l2 l' P; e
- o. }& @4 z {1 _2 Q& {$ A# p7 X3 ~
int myfuvk1;
' ^" G# q& m( _4 q$ U
myfuvk1 =11;
x% {9 H' ~4 V1 \: K* d
# l- e$ f2 T3 n4 \
9 i' `0 t$ @) k) l# Q# o7 C3 j6 Z
enough_data = 0;
7 b; A6 a8 @' q' A! R. T- u. y
6 q. Z9 q- H; H/ I- ], |
// if(enough_data>50){
' N) t$ v: i% t# h! E: U# e& H
// enoughDataFlag=0x01;
& n/ }. C( [" }& _
// }else if(enough_data<50){
" M( }; J4 o# R6 u; A7 O
// enoughDataFlag=0x00;//0x00还是不行
0 J" u/ ]( \+ ]* d- u1 v0 W- T* N
// }
# j, ~2 d/ v" d8 L b/ O$ @9 Q U$ ~
" E) K' g e& S# m
2 f$ e) w) v1 j0 f; m& n4 _
oo=10;
4 j% e S: X, t: e8 q5 h3 Z, g
oo = oo < 5;
% p9 ~ x8 b# j# {) t
if(oo){
$ k& j3 Y* B" m
ii=0;
q, G7 E' C3 ?* L
}
A# |8 u9 t, u- W2 V
if(oo < 5){
7 N, b. q% H* Z
ii=0;
# ^+ R5 d3 C+ I1 H' C
}
6 `3 A, k& c5 C: Z
if(oo > 5){
8 N1 e; j/ \; t4 y+ H
ii=0;
7 @3 ?# }) X8 N0 Y) z
}
8 W% y7 |5 w1 @. k) d7 q
& i, E! K& d( g+ K
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
& {2 G( k1 [) j4 e3 j3 {4 m2 r: f: F3 B* _
/* 如果数据足够才执行主程序 */
! S: T6 i& N& M0 p6 B h& ]
oo = oo < 5;
% j2 H7 P$ n H
enoughDataFlag = enoughDataFlag < 5;
8 A; O w3 y/ y( [4 r) B- U
if (enoughDataFlag < 5) {
$ V7 C; t5 F0 E) Z
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
3 X3 Z$ A. I2 N. `2 v# y4 e3 O
AGC_AGC(&pAGC);
2 r4 A' S( c( ^8 Q- o4 E; r
H; ]; x& S/ A0 F# R/ g/ f
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
, ?2 j8 {2 d, c6 f
FIRDecimator_FIRDecimator(&pRxFilter);
. U6 X4 [% s0 s9 Y9 c
6 [3 F5 U7 e$ k% u' Z, ?4 S
/* Downsampling */
) y5 r6 Y( E& ?) m: V, ^. F
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
% e2 J- i6 A! r9 X$ s
- C. Y- i6 R+ @; O
c_PreambleDetector_PreambleDete(&pPrbDet);
' o4 z7 L# z0 ~! D8 }* R
, D* s& l& [5 e- z' w$ R' y6 H2 X
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
+ G9 X6 ?* R2 p ~( ]; u
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
. B4 c4 C0 S8 ~# {2 e. {5 x
/* %帧数量=100 */
: W' s9 n; I; |9 D9 n9 h$ f
pFrameSync.isInitialized = 0;
8 r. ~$ W- ^+ q4 D: ?% s# {, P4 |
/ {& G7 W( N9 `$ x
/* [EOF] */
8 U# n5 L* y* h1 V' t
/* 前导码长度是13 */
2 G2 Z) b/ H1 ?: c+ Q
/* %qpsk */
3 }2 S5 ? A3 m# R
pDataDecod.isInitialized = 0;
# P8 I& o. z5 T% V P2 ]! r3 _
l. V1 x' N }+ t+ A
/* end */
, G2 T+ b q" R+ C% H: V# N
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
0 i: E0 W, l1 C Y0 n' v
/* Convert 3-dB frequency */
* U8 E4 F W0 u- Q' |
/* Convert 3-dB frequency */
' {3 | p, q n$ g7 D
filtfilt(save_buffer, usable_left_filtfilt);
' d, e$ z" ~- C$ [! N
for (ixstart = 0; ixstart < 81000; ixstart++) {
) E3 }, A' g5 H8 C2 L) }. a
usable_left_filtfilt[ixstart] *= 2.0;
) d" N; h. e* S% }4 ^0 m
}
, v) R, u- g, g& U1 }0 z& Q4 k
8 @* k$ ^0 d; q8 r! L( w
/* 注意乘2,处理幅度 */
3 n* r# q' Q: A+ \) @9 u0 X
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
& o0 I, f" `% Z
/* %% 行列转换 */
8 U- a, y+ V$ _9 T' z. F5 [
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
; O M8 H( N- g) ], u
for (ixstart = 0; ixstart < 81000; ixstart++) {
C3 h4 U$ q$ ]& @: R9 d) Q
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
# Q' b7 G1 ?& _- v8 t
- yiDuanShuJu_mean;
5 N1 B& s% f/ F# P
}
8 @. H) c" M+ l5 v. d7 t
/ [/ R$ w+ k7 k; j* Y! w @
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
* f, t5 R, I& u4 H
ixstart = 1;
" ~% }0 L0 z' q/ q- W
mtmp = youXiaoShuJu_QuZhiLiu[0];
' \) Q1 _ I2 ^- J
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
8 P& a: ]' c5 D& @ Q0 t% W
ix = 2;
* n& P+ x6 F1 j2 s O4 C) [
exitg2 = false;
# F, g0 x8 U: A: t, N% s6 ?
while ((!exitg2) && (ix < 81001)) {
7 Q5 }- X8 O A! W6 P# M: t: w3 F G
ixstart = ix;
: X- I. h5 j5 V% }: J$ W
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
- s! O& V0 e) g
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
" N9 E& x. g1 ?! H; X- }4 b
exitg2 = true;
& ] v& k( X3 u0 R& t
} else {
% a) j, l# O" S: A2 T
ix++;
8 X. P l% ^) Z+ a# c
}
; ^0 i( o% Z/ L0 O
}
& t- t& a/ v: ~2 K
}
2 ^; G: @4 d) c! J1 ^+ w4 `
) n" W) B$ B, q4 n" C" {! M9 g0 g
if (ixstart < 81000) {
4 f8 C9 ~3 `, P: v
while (ixstart + 1 < 81001) {
0 V S# j" _( |- S$ ~2 Y" }7 y
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
! j) N; Q1 g) E5 b2 D
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
& s! h5 l! U9 V
}
4 n6 t8 t3 p' U# Z7 W; G
. [2 j9 }, a9 q% X& @, y
ixstart++;
B2 v8 H$ Y8 X, C9 S0 Q
}
' P- u! o& B& O, x! T) l
}
, m" \+ v6 C0 Y, q& k, E% p" j
9 O1 t7 `& A4 N+ V% D) d8 o% ]/ g; }
ixstart = 1;
6 k9 \, Y! `3 K7 A
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
; ~( b3 l$ Z! [: f$ V
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
+ ~) ^/ a2 n9 t) Q* F" g
ix = 2;
. v7 u7 ?* P' J f. k2 }
exitg1 = false;
+ O# B- ]" N! ]1 L
while ((!exitg1) && (ix < 81001)) {
2 d# v7 `. ~3 Y5 n' t6 o# L
ixstart = ix;
d1 m' |9 u; t# d0 {% x0 W5 J
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
- T: b/ {- s+ t c2 }" \3 o# O
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
3 y/ ]* f) f. j5 C
exitg1 = true;
) P. `4 Q# Y4 S6 `% b8 F* f( v
} else {
) [6 G I& ]! _3 m7 }" _
ix++;
5 q6 x M1 K0 E1 y- E
}
3 t3 ?/ B; E }. P. [* c1 ^0 g$ N
}
. E6 P7 p: Z3 S
}
7 K' x/ y. I6 |0 q
: m5 z! ?. i+ D4 F
if (ixstart < 81000) {
* \, `5 p* \# L
while (ixstart + 1 < 81001) {
6 E6 |6 E' ?# {
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
8 w, X! W+ f; k6 H# \
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
% s$ R) `& ]( ?! {5 c; c# T
}
. S8 h& t3 M" B- y9 g9 r
8 r7 Y) t6 |2 d3 Y
ixstart++;
3 k B6 w+ K; V5 y
}
0 I6 x! ]7 U3 P2 c9 \8 v
}
4 S. z& ~1 C( ?
3 p& t( H7 {% W" E6 o+ Z
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
$ p; o# ?8 n0 ]9 U' ?7 y
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
# S4 c) Y0 _+ s( T8 G1 _+ `
yiDuanShuJu_mean = mtmp;
# ^, c6 @" o$ q2 V) E- L7 q5 B
}
+ X& z$ Z: `& E, a" g
/ M1 }; k9 b1 l% J( W
/* 找出极值 */
; d8 F' n1 @& X( \) D' A
for (ixstart = 0; ixstart < 81000; ixstart++) {
2 O2 J$ B6 k* B2 T, q
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
, B- |- [1 h9 b4 b
}
; I* @, v( L$ D. C' L
G/ i x( p7 i& Q# p" s; ~
--------------帖子字数限制------------------
8 ~) a1 _# Y; A
}
$ e6 c6 ]1 z, @ _
$ z( O* `0 L, W
$ J2 \, e! l% i* ^1 k* a. F8 j& o! Q2 B
作者:
tenny
时间:
2017-6-8 16:37
会不会有其它并行的线程修改到了它
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4