中断函数是一种在程序中间及时响应外部事件的方法,当外部事件发生时,CPU暂停正在执行的程序,转而执行中断函数,处理完中断事件后再返回到原来的程序继续执行。
中断函数通常包括两部分内容:中断发生时需要保存的现场(如CPU寄存器的值、程序计数器的值等),以及对中断事件进行处理的代码。中断函数常常与中断向量表一起使用,中断向量表存储了每个中断事件对应的中断服务程序的入口地址。
中断函数触发的时机与中断事件的发生有关。一般来说,中断事件包括内部中断和外部中断两种。
内部中断是指由程序的执行引起的中断事件,可以通过使用CPU提供的中断指令来触发。而外部中断则是由CPU以外的其他设备产生的,如硬件故障、定时器、串口通信等等。外部中断的触发通常需要使用一个外部中断引脚(如INT0、INT1等)来感应中断事件,当引脚被触发时,就会向CPU发送一个请求,请求CPU暂停当前程序执行,并跳转到相应的中断服务程序中去处理中断事件。
在某些情况下,中断事件可能会同时发生,此时就需要考虑中断服务程序的优先级问题了。CPU一般会为不同的中断服务程序设置优先级,优先级越高的服务程序越先执行。如果当前正在执行一个中断服务程序,而紧接着又有一个优先级更高的事件发生,CPU会立刻停止当前服务程序的执行,跳转到优先级更高的服务程序中去。
在某些情况下,中断服务程序的执行时间可能很长,而此时又有一个优先级更高的中断事件发生,如果直接中断当前服务程序的执行,可能会导致原本正在执行的工作无法完成。因此,一般情况下,中断服务程序需要在中途加入一些可以被中断的标志位,当高优先级的事件发生时,先将标志位置位,等待当前服务程序的执行完成后再跳转到更高优先级的服务程序中。
当一个中断事件发生时,CPU会首先自动将当前程序的现场信息(如CPU寄存器的值)保存到堆栈中,然后根据中断向量表中所保存的中断程序的入口地址跳转到相应的中断服务程序中去执行。中断服务程序中会包含一些对中断事件的处理代码,处理完成后,CPU会自动从堆栈中恢复之前保存的现场信息,然后再跳回到原来被中断的程序中继续执行。