sn8p2511软件陷阱出错

[复制链接]
查看4978 | 回复7 | 2014-11-28 12:50:51 | 显示全部楼层 |阅读模式
本帖最后由 xujie201210 于 2014-11-29 07:38 编辑

各位大侠前辈;小弟做了一个小程序;结果在做软件陷阱时候出了问题;1.在未编程的ROM的地方全都写上nop jmp 0;假设在模块1中;设置出错(程序跑飞)此时设PC=0x1f0;当复位后出现:堆栈溢出;是什么原因?
程序结构如:
void main(void)
  {
   system_Lint();//程序初始化
while(1)
  {
  模块1
  模块2
  --
--
模块n
}
}
/////////
模块1:设置在模块1中;模拟程序跑飞;假设跑飞到空白未编程的0x1f0地方;
  void 模块1 (void)
  {
   if(key_flag==1)
   {
     --
   __asm
    {
    nop
  jmp 0x1f0  //模拟程序跑飞到地址0x1f0
  }

  flag_key=0;
}   
  }

///////////
程序总长度到0x1de为止;在0x1de后面都填写上nop jmp 0;如下

#pragma code_adder 0x1df
void err(void)
  {
  nop(5)
  __asm
    {
    nop
   nop
   jmp 0   //设置程序陷阱;进行拦截;再复位
   }
--
--
  nop(5)
   __asm
    {
    nop
   nop
   jmp 0
    }
}

说明:在使用sn8 c studio软件调试时;程序能跑飞到空白的0x1f0出;再向下运行能到复位00地址处;这个时候再向下运行时;就出现堆栈溢出;出错了?请问各位前辈;难道这样设置程序跑飞不正确吗?应该怎么样设置比较合理?还是松翰芯片抗干扰强不用设置程序陷阱防止程序跑飞?
疯子~lrh | 2014-12-9 08:48:33 | 显示全部楼层
直接开看问狗就行了,不用这么麻烦~
MCU | 2015-1-6 08:49:26 | 显示全部楼层
JMP 0并不能清除硬件堆栈信息,建议把system_Lint()函数代码直接写在该处试一下
zhaofu88 | 2015-1-9 16:58:35 | 显示全部楼层
123131321ihih
ZCY | 2015-1-10 09:20:59 | 显示全部楼层
本帖最后由 ZCY 于 2015-1-12 09:51 编辑

你好.
jmp ox1f0
这条语句.写在子程序里面.直接跳出,没有清除堆栈 所以会溢出
堆栈清除必须是系统复位,或者使用retrn语句.其他跳转并不能清除.会导致堆栈累加 而溢出
伏卧龙 | 2015-1-16 10:27:29 | 显示全部楼层
我想问一下,JMP不是汇编吗?怎么写在C语言里去了呀?
MCU | 2015-1-26 08:47:47 | 显示全部楼层
伏卧龙 发表于 2015-1-16 10:27
我想问一下,JMP不是汇编吗?怎么写在C语言里去了呀?

C内嵌套汇编
伏卧龙 | 2015-1-28 12:32:37 | 显示全部楼层
谢谢,受教了
您需要登录后才可以回帖 登录 | 注册

本版积分规则