|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
研究 linux 内核 - 中断, S ?' ~5 t0 j# p+ r& _. f
$ y/ A9 ^' O) N% d: F5 j
1 ^4 F- b4 l& q- B& [3 M# D! g
$ |# C8 C- k+ M2 t! H
1,还是惯例,本节将用一个小例子来说明中断的工作原理和过程以及如何在驱动中使用中断。6 B" r" v$ N4 G
& P. f/ \. n& k; o
2,说在前面
5 o d' }4 t9 y9 d1》中断和异常是有区别的。异常是一种同步中断。上一节说到的系统调用使用的内核陷入就是异常(软中断)。9 Y4 z3 V4 L( J- H
2》中断的实现需要硬件的支持,比如要让硬件工程师把设备的某个引脚连接到CPU的跟中断相关的某个引脚。
2 p+ r9 t. \+ N6 k, x3》中断比较特殊,不能占用太多时间,所以有必要把需要处理很多事情的ISR分成中断上下文,上文负责必须的处理,剩下的交给下文。
, c# W& K/ W! K2 D4》中断处理程序不能重入,如果你确定没有SMP情况,可以暂时不加竞争保护措施。 n) F7 N# L/ V9 e/ J
- J1 y6 R V7 T9 I0 B3,中断,先参考下图,图中只有一个键盘,现在假设还有一个鼠标和键盘共用一根中断线。" A* g1 U }) }/ g
1》 你按下键盘上的一个键,这时硬件会产生一个电信号' A% x: v: h: K1 b/ ]3 A
2》这个电信号传给中断控制器1 X6 h; u4 G6 A: b$ ?0 Q9 l, M$ m
3》中断控制器产生一个电信号,给CPU的某个引脚
2 e# }+ J3 a+ o0 v+ J k" r. n! t! s, c4》CPU发现这个引脚的电信号,PC(程序计数器)指向对应的地址8 I; m+ ~, ?4 A4 `& m
' I9 n9 }4 d+ Z* {1 m
好硬件完成的工作到此为止,剩下的交给软件1 r$ W4 F; n6 u) X, p
5》这个地址上有内核事先填充的中断向量(一般情况是一条跳转指令) f+ b. A) n' g8 N
6》内核检查这条中断线上有没有注册中断处理程序。
I3 [+ i0 V5 p/ U# m' {7》如果没有,中断返回。
- X; \7 k: |# m/ u d0 q8》如果有,依次运行这条中断线上注册的所有中断处理函数。
F7 n5 D0 A4 l8 B' q4 F& e8 X9》中断返回。& ]0 t; S+ ]* |6 Q* q, i0 p8 n1 d, h
% } U, e6 r! z5 a. M9 g2 ^- \4,在驱动程序中如何使用中断* B7 `& x! ~7 Q
1》先让硬件工程师帮忙弄一根中断线(有时候不用)。: b' F3 M7 E; E7 A( \9 d, o# `+ k
2》向内核注册中断。其中一个参数是ISR函数指针。/ K$ s' R! u: q) o+ c
3》实现ISR。需要注意的是,你的ISR,必须知道这次中断是不是你的设备产生的,具体如何知道,自己想办法,呵呵。, p$ U* u8 _8 N9 y# k- S# q. B
" a ?4 i0 D1 K# U2 S6 z! O. ]3 [0 x) g1 V+ S5 W
; Q0 y& B+ V* b" A
" r7 d$ E% e( b G/ b+ e
0 Z( l$ i5 {- E* e
|
|