请问一下 关于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
1楼-- · 2019-07-15 19:03
  这里顺便提一下,给需要的朋友。在我的代码基础上进行扩展,可以实现51单片机运行多任务。
  简但来说,就是定义几个像代码中TargetAddress这样的变量,组成一个数组,成为任务列表,用来保存每个任务的运行地址。如果要创建新任务,就把新任务的地址赋给一个空白的TargetAddress成员。然后把实现跳转的代码放到定时器中断里,由定时器负责任务之间的切换。定时器的周期可以是1ms或者10ms等。进入定时器中断时保存当前任务的地址到它对应的TargetAddress变量中,还有现场环境,然后用算法选择下一个可运行的任务,恢复这个任务的环境,再在中断返回后跳转至这个任务的地址。周而复始,任务之间不断切换。
  最后不要忘记任务退出后的清理工作。
  我在这里只是抛砖引玉,有兴趣在51上完多任务的可以自己琢磨。 最佳答案
1522495332
2楼-- · 2019-07-16 00:44
把你要跳的那条语句的地址替换掉堆栈里保存的PC值即可
music_mc
3楼-- · 2019-07-16 03:43
1522495332 发表于 2015-9-19 10:48
把你要跳的那条语句的地址替换掉堆栈里保存的PC值即可

好像只有汇编可以吧? C语言怎么写?
wenpeng123
4楼-- · 2019-07-16 07:38
 精彩回答 2  元偷偷看……
hanking1111
5楼-- · 2019-07-16 09:42
可以尝试使用break语句结束while循环,,,,,或者用continue语句结束本次循环,重新判断循环条件
1522495332
6楼-- · 2019-07-16 11:11
回楼主,C无法办到,但可以采用C和汇编混合编程的方式。
我已针对你的问题做了一个测试程序,开发环境为Keil4,如果打不开,请直接把src文件夹下的main.c和sub.asm添加到你能打开的空工程中。
只有这两个源文件,main.c相当于你目前在写的。对于C无法办到的事情,用汇编写在sub.asm中,里面有两个函数。有详细的注释。

附件暂时上传不了,我稍后再补上

一周热门 更多>