第二讲:【愚人节特别奉献】今天被自己愚弄了一把,一个粗心大意引发的BUG,细节决定成败
导读 今天吴鉴鹰将程序的一个变量Vol_Device_Data 置为1,但是在主函数里面怎么也进不了if(Vol_Device_Data == 1){ display(); }这个判断语句,你说奇不奇怪,诡异不?貌似很神奇吧。
简化的程序 #include <AT89X52.h> #define uchar unsigned char//宏定义 #define uint unsigned int //宏定义 #define KEY P3_7 //定义脚踏关凯
uchar Vol_Device_Data; uchar disp; uchar pic=0,num=0; uchar Vp_Fr_Data; uchar Pl_Tk_Count=0,Data_Num=0;
void main() { uchar Tr_Value; uchar Xs_Vk_Dl; uchar Fd_Drt_Pl; uchar Vol_Device_Data = 1; //注意看,我在这里将这个变量置为1了 uchar Qp_Ml_Data; uchar Pw_Sf_Count=0,Kmv_Num_Ds = 0; while(1) { Jisuan_Count(); } }
void Jisuan_Count() { uchar Fr_Test_Value; uchar X_Voint_Dl; uchar Fs_Doint_Pl; unsiged char Vol_Device_Data = 0; uchar Lp_Fr_Data; uchar Pm_Sm_Count=0,Solid_Num=0;
if(Vol_Device_Data == 1) { pic++; 将断点这子啊这里,可是怎么也进不来,你说奇怪不? } }
原因分析 亲们发现问题了么?为什么就是进不来呢? 我找了很多原因,单步调试,也找不出来在什么地方给Vol_Device_Data置为0了,用变量查看器查看,值是1,但是怎么就进不了中断呢? 怀疑是堆栈溢出了?指针出错了?数据存储区写满了?还是单片机内存分区出错了(定义数组的时候可能会遇到)?经过一系列怀疑后,还是没有找出问题,最后没有办法,将哪些地方用到了这个变量重新查看了一遍,发现原来定义了一个全局变量,还有一个局部变量。请仔细看程序,虽然在主函数的里面初始化的时候给Vol_Device_Data置为1了,但是在子函数void Jisuan_Count()里面将Vol_Device_Data置为0了,所以判断 if(Vol_Device_Data == 1)的条件满足不了,自然也就进不了。在线仿真用变量查看器来看,看到的是全局变量的值,是1,但是在子函数中,其实他的值是0。
简化的程序 #include <AT89X52.h> #define uchar unsigned char//宏定义 #define uint unsigned int //宏定义 #define KEY P3_7 //定义脚踏关凯
uchar Vol_Device_Data; //定义的全局变量 uchar disp; uchar pic=0,num=0; uchar Vp_Fr_Data; uchar Pl_Tk_Count=0,Data_Num=0;
void main() { uchar Tr_Value; uchar Xs_Vk_Dl; uchar Fd_Drt_Pl; uchar Qp_Ml_Data; uchar Pw_Sf_Count=0,Kmv_Num_Ds = 0;
Vol_Device_Data = 1; while(1) { Jisuan_Count(); } }
void Jisuan_Count() { uchar Fr_Test_Value; uchar X_Voint_Dl; uchar Fs_Doint_Pl; unsiged char Vol_Device_Data = 0; //定义的局部变量 uchar Lp_Fr_Data; uchar Pm_Sm_Count=0,Solid_Num=0;
if(Vol_Device_Data == 1) { pic++; } }
这就是愚人节送给自己的礼物,祝大家愚人节快乐,努力工作,明天又是美好的一天!
|