请问一下 关于51单片机的中断

2019-07-15 16:05发布

主函数正在执行程序,突然外部中断了,此时主函数这边被压入堆栈,跑去执行中断函数
我希望运行完中断函数后,不跳回主函数正在执行的那段,而是从主函数另一个指定位置开始执行,怎么做?
比如:
  1. void main()
  2. {
  3.         while(1)                //主函数的大循环内,有很多行代码,这里先忽略
  4.         {
  5.                 ....                //不知程序运行到什么地方,这时外部中断被触发了  
  6.                 ......                //假设这里是中断点---被压入堆栈
  7.                 .......
  8.         }
  9. }
  10. void init() interrupt 0
  11. {
  12.         .....
  13.         ......                   //我希望程序运行完成中断函数后,不返回主函数的大循环内,而是跳到while(1)的上一条语句
  14.         .......                       
  15. }
复制代码


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
17条回答
1522495332
2019-07-17 03:15
music_mc 发表于 2015-9-23 15:10
因为汇编太久没用,基本忘光了,我试了一次,能用,我最近再挑一些程序来试
请问下,如果在中断函数尾,直接用goto 指令,效果会不会一样?

C语言的goto只能在一个函数内跳转,原因很简单,不同的函数的栈不一样,如果从一个函数跳到另一个函数,会导致堆栈不对称,而使程序跑飞。
举个简单的例子来演示一下,加入函数func1使用了5Bytes的栈空间,那么当退出func1时就要释放5bytes的栈空间,函数func2使用4bytes的栈空间。这时假设你调用了func2,消耗了4bytes的栈空间,原则上说你退出函数前要释放这4bytes,然而你用goto直接从func2跳到func1中,程序就不会从func2退出,而是从func1退出,释放了5bytes的栈,这样栈的对称性被破坏了不说,连调用者的现场也被破坏了(原本是保护a寄存器的值,最后却还给了b寄存器)。
所以c不允许这样的非法跳转。汇编编译器则不会限制你这么做,因为汇编里函数的概念没C这么强烈,但随意的在函数间跳转除了会有栈方面的问题,寄存器方面也有问题。

评分

参与人数 1积分 +1 收起 理由 sxzu + 1 答得很棒!

查看全部评分

一周热门 更多>