“第五课. 中断系统中的设备树”的版本间的差异
第34行: | 第34行: | ||
=第01节_中断概念的引入与处理流程= | =第01节_中断概念的引入与处理流程= | ||
+ | 取个场景解释中断。 | ||
+ | |||
+ | 假设有个大房间里面有小房间,婴儿正在睡觉,他的妈妈在外面看书。 | ||
+ | |||
+ | 问:这个母亲怎么才能知道这个小孩醒?<br> | ||
+ | #过一会打开一次房门,看婴儿是否睡醒,让后接着看书<br> | ||
+ | #一直等到婴儿发出声音以后再过去查看,期间都在读书<br> | ||
+ | |||
+ | 第一种 叫做'''查询方式''': | ||
+ | *优点:简单 | ||
+ | *缺点: 累 | ||
+ | 写程序如何: | ||
+ | <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系统 | ||
+ | [[File:chapter14_lesson1_001.png|700px]] | ||
+ | |||
+ | 有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是由硬件决定的,跳去执行更加复杂函数(由软件决定) | ||
=第05节_示例_使用设备树描述按键中断= | =第05节_示例_使用设备树描述按键中断= | ||
=第06节_内核对设备树中断信息的处理过程= | =第06节_内核对设备树中断信息的处理过程= |
2018年11月15日 (四) 09:54的版本
这节课讲解如何在中断系统中使用设备树,也就是用设备树如何描述中断。
我发现给自己挖了一个大坑,如果我想设备树课程中我想把中断讲清楚, 就必须把中断体系讲清楚。
中断体系在4.x内核中变化很大,中断体系又跟pinctrl系统密切相关,pinctrl中又涉及GPIO子系统,这样讲下去的话,设备树课程就变成驱动专题了,所以我打算只讲中断体系统,对于pinctrl、gpio等系统留待以后在驱动课程中扩展。
这一课的参考资料如下:
基於tiny4412的Linux內核移植 --- 实例学习中断背后的知识(1)
Linux kernel的中断子系统之(二):IRQ Domain介绍
linux kernel的中断子系统之(三):IRQ number和中断描述符
linux kernel的中断子系统之(四):High level irq event handler
Linux kernel中断子系统之(五):驱动申请中断API
Linux kernel的中断子系统之(六):ARM中断处理过程
linux kernel的中断子系统之(七):GIC代码分析
本课视频预计分为五节。
其中第01节描述中断概念的引入与处理流程,这节视频来自"韦东山第1期裸板视频加强版", 如果已经理解了中断的概念, 请忽略该节。
第01节_中断概念的引入与处理流程
取个场景解释中断。
假设有个大房间里面有小房间,婴儿正在睡觉,他的妈妈在外面看书。
问:这个母亲怎么才能知道这个小孩醒?
- 过一会打开一次房门,看婴儿是否睡醒,让后接着看书
- 一直等到婴儿发出声音以后再过去查看,期间都在读书
第一种 叫做查询方式:
- 优点:简单
- 缺点: 累
写程序如何:
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
耳朵听到声音会发送信号给脑袋,声音来源有很多种,有远处的猫叫,门铃声,小孩哭声。这些声音传入耳朵,再由耳朵传给大脑,除了这些可以中断母亲的看书,还有其他情况,比如身体不舒服,有只蜘蛛掉下来,对于特殊情况无法回避,必须立即处理
有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是由硬件决定的,跳去执行更加复杂函数(由软件决定)