当前位置: 代码迷 >> 单片机 >> code再入调用有关问题
  详细解决方案

code再入调用有关问题

热度:73   发布时间:2016-04-28 16:09:59.0
code再入调用问题
从网上下了个菜单程序编译的时候总是提示
*** 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,中断和主程序各用一个。
  相关解决方案