“第014课 异常与中断”的版本间的差异

来自百问网嵌入式Linux wiki
第1行: 第1行:
 +
=第001节_概念引入与处理流程=
 +
取个场景解释中断
 +
 +
假设有个大房间里面有小房间,婴儿正在睡觉,他的妈妈在外面看书。
 +
问:这个母亲怎么才能知道这个小孩醒?
 +
1 过一会打开一次房门,看婴儿是否睡醒,让后接着看书
 +
 +
2 一直等到婴儿发出声音以后再过去查看,期间都在读书
 +
 +
第一种 叫做查询方式:
 +
优点:简单
 +
缺点: 累
 +
写程序如何:
 +
 +
  <syntaxhighlight lang="c" >
 +
 +
while(1)
 +
{
 +
1 read book(读书)
 +
2 open door(开门)
 +
if(睡)
 +
return(read book)
 +
else
 +
照顾小孩
 +
 +
}
 +
 
 +
</syntaxhighlight>
 +
第二种叫中断方式:
 +
优点:不累
 +
缺点:复杂
 +
 +
写程序:
 +
 +
<syntaxhighlight lang="c" >
 +
 +
while(1)
 +
{
 +
read book
 +
中断服务程序()//如何被调用?
 +
{
 +
处理照顾小孩
 +
}
 +
}
 +
 +
</syntaxhighlight>
 +
 
 +
我们还是看看母亲被小孩哭声打断如何照顾小孩?
 +
 +
母亲的处理过程
 +
1 平时看书
 +
2 发生了各种声音,如何处理这些声音
 +
有远处的猫叫(听而不闻,忽略)
 +
门铃声有快递(开门收快递)
 +
小孩哭声(打开房门,照顾小孩)
 +
3 母亲的处理
 +
只会处理门铃声和小孩哭声
 +
a 现在书中放入书签,合上书(保存现场)
 +
b 去处理 (调用对应的中断服务程序)
 +
c 继续看书(恢复现场)
 +
 +
不同情况,不同处理
 +
a 对于门铃:开门取快件
 +
b 对于哭声:照顾小孩
 +
 +
我们将母亲的处理过程抽象化
 +
母亲的头脑相当于CPU
 +
耳朵听到声音会发送信号给脑袋,声音来源有很多种,有远处的猫叫,门铃声,小孩哭声。这些声音传入耳朵,再由耳朵传给大脑,除了这些可以中断母亲的看书,还有其他情况,比如身体不舒服,有只蜘蛛掉下来,对于特殊情况无法回避,必须立即处理
 +
 +
对比我们得arm系统
 +
 +
---》图2 
 +
![](https://i.imgur.com/Yg9tRdq.png)
 +
 +
有CPU 有中断控制器,我们的中断源发送
 +
中断控制器可以发信号给CPU告诉它发生了那些紧急情况
 +
中断源有 按键 定时器 有其它的(比如网络数据)
 +
这些信号都可以发送信号给中断控制器,再由中断控制器发送信号给CPU表明有这些中断产生了,这些成为中断(属于一种异常)
 +
 +
还有什么可以中断CPU运行
 +
指令不对,数据访问有问题
 +
reset信号,这些都可以中断CPU 这些成为异常中断
 +
 +
重点在于 保存现场以及恢复现场
 +
 +
处理过程
 +
a 保存现场(各种寄存器)
 +
b 处理异常(中断属于一种异常)
 +
c 恢复现场
 +
 +
 +
arm对异常(中断)处理过程
 +
1 初始化:
 +
a 设置中断源,让它可以产生中断
 +
b 设置中断控制器(可以屏蔽某个中断,优先级)
 +
c 设置CPU总开关,(使能中断)
 +
 +
2 执行其他程序:正常程序
 +
 +
 +
3 产生中断:按下按键--->中断控制器--->CPU
 +
 +
4 cpu每执行完一条指令都会检查有无中断/异常产生
 +
5 发现有中断/异常产生,开始处理
 +
'''对于不同的异常,跳去不同的地址'''执行程序
 +
这地址上,只是一条跳转指令,跳去执行某个函数
 +
(地址)
 +
指的是异常向量
 +
如下就是异常向量表
 +
对于不同的异常都有一条跳转指令
 +
 +
 +
<syntaxhighlight lang="c" >
 +
 +
.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代码
 +
//保护现场,调用处理函数,恢复现场
 +
 
 +
</syntaxhighlight>
 +
 +
3-5都是硬件强制做的
 +
 +
6 这些函数做什么事情()软件做的
 +
a 保存现场(各种寄存器)
 +
b 处理异常(中断):
 +
分辨中断源
 +
再调用不同的处理函数
 +
c 恢复现场
 +
 +
对比母亲的处理过程来比较arm中断的处理过程
 +
 +
中断处理程序怎么被调用?
 +
CPU--->0x18 --跳转到其他函数->
 +
做保护现场
 +
调用函数
 +
分辨中断源
 +
调用对应函数
 +
恢复现场
 +
 +
cpu到0x18是由硬件决定的,跳去执行更加复杂函数(由软件决定)
 +
  
 
='''《《所有章节目录》》'''=
 
='''《《所有章节目录》》'''=
 
<categorytree mode=all background-color:white;">ARM裸机加强版</categorytree>
 
<categorytree mode=all background-color:white;">ARM裸机加强版</categorytree>
 
[[Category:ARM裸机加强版 ]]
 
[[Category:ARM裸机加强版 ]]

2018年1月17日 (三) 18:17的版本

第001节_概念引入与处理流程

取个场景解释中断

假设有个大房间里面有小房间,婴儿正在睡觉,他的妈妈在外面看书。 问:这个母亲怎么才能知道这个小孩醒? 1 过一会打开一次房门,看婴儿是否睡醒,让后接着看书

2 一直等到婴儿发出声音以后再过去查看,期间都在读书

第一种 叫做查询方式: 优点:简单 缺点: 累 写程序如何:

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

第二种叫中断方式: 优点:不累 缺点:复杂

写程序:

 

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

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

母亲的处理过程 1 平时看书 2 发生了各种声音,如何处理这些声音 有远处的猫叫(听而不闻,忽略) 门铃声有快递(开门收快递) 小孩哭声(打开房门,照顾小孩) 3 母亲的处理 只会处理门铃声和小孩哭声 a 现在书中放入书签,合上书(保存现场) b 去处理 (调用对应的中断服务程序) c 继续看书(恢复现场)

不同情况,不同处理 a 对于门铃:开门取快件 b 对于哭声:照顾小孩

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

对比我们得arm系统

---》图2 ![](https://i.imgur.com/Yg9tRdq.png)

有CPU 有中断控制器,我们的中断源发送 中断控制器可以发信号给CPU告诉它发生了那些紧急情况 中断源有 按键 定时器 有其它的(比如网络数据) 这些信号都可以发送信号给中断控制器,再由中断控制器发送信号给CPU表明有这些中断产生了,这些成为中断(属于一种异常)

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

重点在于 保存现场以及恢复现场

处理过程 a 保存现场(各种寄存器) b 处理异常(中断属于一种异常) c 恢复现场


arm对异常(中断)处理过程 1 初始化: a 设置中断源,让它可以产生中断 b 设置中断控制器(可以屏蔽某个中断,优先级) c 设置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都是硬件强制做的

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

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

中断处理程序怎么被调用? CPU--->0x18 --跳转到其他函数->

做保护现场
调用函数 

分辨中断源 调用对应函数

恢复现场

cpu到0x18是由硬件决定的,跳去执行更加复杂函数(由软件决定)