中断服务程序完成后怎样跳到main函数指定位置

如题所述

理论上来说,中断完成后,程序指针回到断点,继续往下执行
但如果你要转到指定地点执行的话,我提供个方法,如下
你可以在中断中设置一个全局变量,如果中断后,改变这个全局变量,在程序的关键部位检测这个变量是否改变,如果改变了执行“goto +标签;”的跳转指令,就可以让程序到指定位置
但该方式不能中断立即跳转到指定位置,但是因为单片机的运算速度实在太快了,知道你在关键部位写如个检测程序,如if(k==1)goto L1;//中断改变全局变量k=1,如果改变了k,那跳转到指定地址L1
这样的方式,只要你在程序关键部位设置合理,是完全能满足设计要求的追问

我用的是AVR-mega16单片机,C语言编写,GCC编译。
问题就是出在“该方式不能中断立即跳转到指定位置”。C语言真的做不到么?

追答

因为你不知道程序在执行到什么地方的时候,被中断,而中断结束后,程序自动恢复到断电处,顾要立即做出反映,那是不可能的,但介于单片机高速运算,一般你设置一个检测点,不管检测点在程序什么位置,只要能执行到,那响应时间不会超过1ms
C可以做到,我说过了,可以在中断中设置一个全局变量,如果中断后,改变这个全局变量,在程序的关键部位检测这个变量是否改变,如果改变了执行“goto +标签;”的跳转指令,就可以让程序到指定位置
记住,这样的程序你需要在个关键部位检测全局变量,格式如下
if(k==1)goto L1;
else k=0;

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-08-23
对于单片机的硬件,你熟悉吗?时钟和CPU是独立的,时钟中断程序时这样的:在CPU执行指令时,计数器(计时器)同时在计时,当计时器溢出时,就向CPU申请中断,如果允许响应中断,CPU就转到中断服务程序执行相关的程序。
单片机的时钟中断相应要满足两个条件:第一,允许中断源申请中断。第二,允许cpu响应中断。二者缺一不可。 EA=1;//开总中断
ET0=1;//开定时器0中断
ET1=1;
TR0=1;//启动定时器0
TR1=1;
你这些语句,就允许了中断响应,所以,当你的程序跑起来时,时钟时间到了,CPU就转入中断服务程序了,执行完了再返回主程序。你可以在编译器中用DEBUG查看执行过程的。如果你用汇编语言写,就更清楚了,可以看清每一步的操作的。
硬件部分是这样:在每个机器周期的S5P2,单片机会来采样,判断是否有中断申请。所以一旦时钟计数溢出,就会转入中断服务程序。
这个打个比方吧,你在上课,相当于主程序,这时时间到了,打铃下课了,你就不读书了,跑出去玩了。这其实是一样的道理。你在上课,这和打铃不相关,并不是你让打铃的,学校的时钟在不停地走,到了时间自动打铃,这不受你上课的影响的。但是如果你把耳朵堵上了(不允许响应中断),就是把铃打碎了你也不知道下课了,所以你就一直读书。不知你明白没?
第2个回答  2011-08-23
如果你这么问说明你对C的结构就不清楚。
你这个goto的越多,你的结构性越差。

中断服务程序完成后怎样跳到main函数指定位置
你可以在中断中设置一个全局变量,如果中断后,改变这个全局变量,在程序的关键部位检测这个变量是否改变,如果改变了执行“goto +标签;”的跳转指令,就可以让程序到指定位置 但该方式不能中断立即跳转到指定位置,但是因为单片机的运算速度实在太快了,知道你在关键部位写如个检测程序,如if(k==1)goto ...

急急急!keil中如何每次在中断后跳到主函数的某一特定位置
这种控制用汇编语言比较容易实现,是通过对SP的赋值实现的,但必须考虑中断前后的变量保护和恢复问题。用keil不易控制从中断返回到主函数的特定位置。可以在中断函数中设置一个变量,在主函数中查看这个变量,当变量为一特定值时就转到主函数的指定位置,这样,编译时就会自动完成现场的保护和恢复问题。

如何调用中断运行的结果怎么到主函数中运算呢?
要调用中断运行的结果到主函数中运算,很简单,直接使用中断函数中的变量。单片机的中断函数中所有变量必须声明为全局变量。如果串口接收到电脑发送的数据有多个,可声明一个全局数组变量,中断函数把接收的数据写到数组中保存。返回到主函数,再读取数组中的数据即可。

单片机中断结束后从哪main函数从头开始执行吗?还是回到while(1);那里...
Loop 当Visual Basic执行这个Do循环时会首先测试条件,如果条件为零,则跳过所有语句,如果条件为非零,则Visual Basic执行语句,然后退回到Do While语句再测试条件。因此,只要条件为True,循环可以随意执行多少次。如果程序一开始就为False,则不会执行语句。Do…Loop语句的另一种演变形式是先执行语句,然...

c51 单片机编程中断问题,中断后不能继续返回main函数,哪位高手看一下...
void int1_srv() interrupt 2\/\/INT1中断服务函数,中断向量标号2 { my_delay_10ms(1);\/\/延时消抖 KEY_BIT = 1;\/\/读MCS51的IO口之前要先对其置1 if(KEY_BIT == 0)\/\/按键仍然是按下状态 { \/\/while(KEY_BIT == 0);\/\/等待按键抬起 这部分就不用了。使用边沿触发,不必在等待按键抬起...

c怎样终止自定义函数(无返回值)跳转到main函数,然后继续执行语句_百度...
调用第1个函数时,c语言编译程序会自动加入若干保护调用现场的压栈语句,所以从这个函数返回时会返回到调用者(比如说是main);现在函数1又调用函数2,又有若干保护现场的动作被执行,你从函数2返回利用栈只能返回函数1,若想再返回函数1的调用点需要从函数1执行返回语句;所以说函数2无法从c代码的层次...

单片机80c51编程AJMP MAIN?
那么单片机就会将PC值跳转到对应的中断矢量入口。之后就会从入口处跳转到相应的中断服务程序了。例如在你这个例程里面,当定时器0中断事件产生以后,不管你的主程序愿意不愿意,都会直接蹦到000Bh入口,并且执行AJMP INQP,跳转到T0中断的服务程序执行,并且在执行RETI后才会回到被打断的主程序位置。

c语言中main函数的位置可以任意吗?
c语言中main函数的位置可以任意位置。在执行一个c语言编写的程序时,main函数就相当于是执行程序的入口。只要是没有语法和逻辑上的错误,main函数可以放在任意位置。\\x0d\\x0aC语言不限定函数源代码在源文件中的位置,但是函数内的标识符同函数外的标识符一样也必须满足使用的标识符先声明后引用的原则...

单片机定时\/应用问题请教下
---开始 写ORG 000H, LJMP MAIN , 就是说LJMP MAIN 放在单片机的000H 位置,一般单片RESET 后开始运行的地址就是0000H, 这句话的作用是单片上电后或RESET后就跳到MAIN:这个地方,不是跳到ORG 000BH 这个地方,而是ORG 0100H这个地方,也就是MAIN的地方,ORG 的作用就是设定ORG 后面的程...

单片机 我想问,中断服务函数可以写在其他c文件中吗?如果可以,会起作用...
首先可以肯定,中断服务函数可以写在其他文件中,并不一定要放在main.c中。中断服务函数如果有特定的关键字修饰,比如keil c51用interrupt,不仅可以放在任意文件中,甚至可以用static 把中断函数定义成局部的函数都没问题。其他的,一般需要自己定义入口调用,比如某系统的定时中断入口放在0x0008地址,则在0x...

相似回答