异常与中断的概念引入及处理流程

文章目录

    • 1 中断的引入
      • 1.1 查询方式
      • 1.2 中断方式
      • 1.3 ARM系统的中断处理方式
      • 1.4 中断处理的重点--保护现场以及恢复现场

1 中断的引入

取个场景解释中断。

假设有个大房间里面有小房间,婴儿正在睡觉,他的妈妈在外面看书。

问:这个母亲怎么才能知道这个小孩醒?

  • 过一会打开一次房门,看婴儿是否睡醒,让后接着看书
  • 一直等到婴儿发出声音以后再过去查看,期间都在读书

1.1 查询方式

第一种叫做查询方式:

  • 优点:简单。
  • 缺点: 累。

写程序如下:

while(1)
{
	1 read book(读书)
	2 open door(开门)
	if()
		return(read book)
	else
		照顾小孩
	
}

1.2 中断方式

第二种叫中断方式:

  • 优点:不累。
  • 缺点:复杂。

写程序如下:

while(1)
{
	read book
	中断服务程序()//如何被调用?
	{
		处理照顾小孩
	}
}

我们看看母亲被小孩哭声打断如何照顾小孩?

母亲的处理过程:

  1. 平时看书
  2. 发生了各种声音,如何处理这些声音
    - 有远处的猫叫(听而不闻,忽略)
    - 门铃声有快递(开门收快递)
    - 小孩哭声(打开房门,照顾小孩)
  3. 母亲的处理

只会处理门铃声和小孩哭声:

  1. 现在书中放入书签,合上书(保存现场)
  2. 去处理 (调用对应的中断服务程序)
  3. 继续看书(恢复现场)

不同情况,不同处理:

  1. 对于门铃:开门取快件
  2. 对于哭声:照顾小孩

我们将母亲的处理过程抽象化——母亲的头脑相当于CPU:
耳朵听到声音会发送信号给脑袋,声音来源有很多种,有远处的猫叫,门铃声,小孩哭声。这些声音传入耳朵,再由耳朵传给大脑,除了这些可以中断母亲的看书,还有其他情况,比如身体不舒服,有只蜘蛛掉下来,对于特殊情况无法回避,必须立即处理。

1.3 ARM系统的中断处理方式

对比我们的arm系统:
异常与中断的概念引入及处理流程_第1张图片
有CPU,有中断控制器。中断控制器可以发信号给CPU告诉它发生了那些紧急情况,中断源有按键、定时器、有其它的(比如网络数据)。这些信号都可以发送信号给中断控制器,再由中断控制器发送信号给CPU表明有这些中断产生了,这些成为中断(属于一种异常)。

还有什么可以中断CPU运行?指令不对,数据访问有问题,reset信号,这些都可以中断CPU,这些称为为异常。

1.4 中断处理的重点–保护现场以及恢复现场

处理过程:

  1. 保存现场(各种寄存器)
  2. 处理异常(中断属于一种异常)
  3. 恢复现场

arm对异常(中断)处理过程:

  1. 初始化:
    - 设置中断源,让它可以产生中断
    - 设置中断控制器(可以屏蔽某个中断,优先级)
    - 设置CPU总开关,(使能中断)

  2. 执行其他程序:正常程序。

  3. 产生中断:按下按键—>中断控制器—>CPU。

  4. cpu每执行完一条指令都会检查有无中断/异常产生

  5. 发现有中断/异常产生,开始处理。对于不同的异常,跳去不同的地址执行程序。这地址上,只是一条跳转指令,跳去执行某个函数(地址),这个就是异常向量。如下就是异常向量表,对于不同的异常都有一条跳转指令。

.globl _start
_start: b	reset
	ldr	pc, _undefined_instruction
	ldr	pc, _software_interrupt
	ldr	pc, _prefetch_abort
	ldr	pc, _data_abort
	ldr	pc, _not_used
	ldr	pc, _irq //发生中断时,CPU跳到这个地址执行该指令 **假设地址为0x18**
	ldr	pc, _fiq
//我们先在0x18这里放 ldr pc ,__irq,于是cpu最终会跳去执行__irq代码
//保护现场,调用处理函数,恢复现场

(3-5都是硬件强制做的)。

  1. 这些函数做什么事情?
    软件做的:
    a 保存现场(各种寄存器)
    b 处理异常(中断):
       分辨中断源
       再调用不同的处理函数
    c 恢复现场

对比母亲的处理过程来比较arm中断的处理过程。

中断处理程序怎么被调用?
CPU—>0x18 --跳转到其他函数->
  做保护现场 
  调用函数
    分辨中断源
    调用对应函数
  恢复现场
  
cpu到0x18是由硬件决定的,跳去执行更加复杂函数(由软件决定)。

你可能感兴趣的:(Linux)