前段时间,用MSP430单片机开发的病虫害统计器的菜单程序出现了严重的问题,出现无缘无故死机和屏乱码,纠结了好几天,找不到问题的所在,幸亏有学长的指点,原来是堆栈的溢出,分析后是由于我的菜单是一个界面一个while(1)组成造成的,如下:
Void Screen(void)
{
界面相关显示不变的
While(1)
{
扫描按键
If(按键一)
{
Screen_1();
break;
}
If(按键二)
{
Screen_2();
brreak;
}
……………..
}
}
Screen_1(); Screen_1();也行如Sreen这样写,切换几个界面可能没有什么问题,一旦界面换多了,它就会不断地在函数里面调用,跳不出来,因为每次调用函数都是放到RAM中的,函数套用多了,就会堆栈溢出了,而且出现死机是有一定规律的。
根据学长的讲解和指点,可以用标志位来切换不同界面,这样就不会出现如上情况,按键扫面可以放到整个大循环或者中断中,就不需要每个函数都扫描了,将固定的不变的没有while循环的界面程序写入相关界面函数即可,从而避免函数中调用函数,break跳不出来。如下:
uchar S_S=1;uchar S=0; //标志位定义
Void Screen(void)
{
While(1)
{ 按键扫描
Switch(键值)
{
Case 1:
相应键值标志
Case 2:
相应键值标志
}
}
If(S_S==1)//默认初始界面
{
If(切换到下一界面的键值)
{
键值复位;
Screen_1(); //第一界面函数 无任何按键操作函数和循环
S_S=0;
S=1;
}
………………..
}
If(S==1)
{
If(切换到下一界面的键值)
{
键值复位;
Screen_1(); //第一界面函数 无任何按键操作函数和循环
S=2;
}
…………….
}
If(S==2)
{
…………………..
}
………………
}
Void Screen_1(void)// 界面相关显示不变的
{
Disp_HZ_1(40,120,(unsigned short *)"病虫调查统计器",7);
Disp_HZ_1(80,200,(unsigned short *)"南京恒裕仪器",6);
Disp_HZ_1(10,293,(unsigned short *)"菜单",2);
Disp_HZ_1(95,293,(unsigned short *)"关机",2);
Disp_HZ_1(180,293,(unsigned short *)"统计",2);
………….
}
这样一改,菜单就可以了,几乎不会出错,不知还有没更好的方法,希望得到大侠的批判。
用户1650614 2012-10-22 16:41
egaiai.1989_868445655 2011-7-8 12:26
egaiai.1989_868445655 2011-7-8 12:26