从网上下了个菜单程序编译的时候总是提示
*** WARNING L13: RECURSIVE CALL TO SEGMENT
SEGMENT: ?PR?_DISP_CHARA?SIGNAL_GUARD
CALLER: ?PR?DUMMYJOB?SIGNAL_GUARD
程序如下
typedef struct
{
uchar KeyStateIndex; //当前状态索引号
uchar KeyDnState; //按下"向下"键时转向的状态索引号
uchar KeyUpState; //按下"向上"键时转向的状态索引号
uchar KeyCrState; //按下"回车"键时转向的状态索引号
uchar KeyBackState; //按下"退回"键时转向的状态索引号
void (*CurrentOperate)(); //当前状态应该执行的功能操作
} KbdTabStruct;
KbdTabStruct code KeyTab[]=
{
// dwn up en/m ex
{ 0, 0, 0, 1, 0,(*DummyJob)},
。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。
。。。。。。。。。。。。。};
。。。。。。。。。。。。。
void DummyJob(void)
{
KeyFuncIndex=0;
disp(0,0,top[0]);
disp(1,0,top[1]);
disp(1,5,top[3]);
};
uchar code *top[5]=
{
"显示系统",
"运行中......",
"自动撤防运行中......",
"手动......",
"菜单"
};
高手指点
谢谢!
------解决方案--------------------
按提示是:
DummyJob-》disp-》DummyJob-》disp。
看看disp()
------解决方案--------------------
单片机里不支持代码重入,也就是可能出现在同一时刻的不同地方,调用同一个函数。
另一种情况就是自己递归自己
像这样的话,先查一下自己有没有递归调用自己
如果没有的话,去看看定时器,外中断等,有没有在中断中调用这个函数
------解决方案--------------------
应该是中断函数里用了disp,在正常程序流程中也用了disp
这样在正常程序流程中运行disp的时候,其分配的ram空间已经被使用,而遭遇中断,在中断服务函数中再次运行disp,就会使之前的ram空间数据被篡改,轻则数据丢失,重则程序崩溃。
解决办法,中断服务函数中用到的相关函数,用一个不同名的函数来替代,例如复制disp,改名disp_int,其余的内容不变,当然,如果用到全局变量,也要做类似处理
------解决方案--------------------
把disp复制一份叫dispxx,中断和主程序各用一个。