📄 interrupt-priority_3.htm
字号:
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1"><FONT face=宋体><FONT
size=+0><FONT size=3><FONT
face="Times New Roman TUR">当一个Interrupt/Exception正在被处理时,如果又发生了其它Interrupts/Exceptions,CPU会去查看它们中间是否存在着比当前正在处理的Interrupt/Exception
优先级更高的,如果存在,则保留当前中断处理的Context,然后从这些Interrupts/Exceptions中挑选一个优先级最高的,并开始处理它。然后,剩下的那些未被处理的Exceptions将被丢弃,未被处理的Interrupts则继续处于Pending状态,等待被处理。那些被丢弃的Exceptions,都是由软件引起的(由硬件引起的Exceptions具有最高的Priority,永远不可能被丢弃),所以,等所有的Interrupts/Exceptions被处理结束时候,执行点会重新回到那些引起这些Exceptions的点,那时候,Exceptions会被重新生成并被处理。</FONT></FONT></FONT></FONT></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1">下图表现了CPU的指令循环(Instruction
Cycle):</SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"
align=center><FONT face="Times New Roman TUR"><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><FONT face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"><IMG src="interrupt-priority_3.files/flowchrt.gif"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/priority/flowchrt.gif"></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"
align=center><FONT face="Times New Roman TUR"><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><FONT face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></P>
<P>
<HR width="100%" SIZE=2>
<P></P>
<P></P>
<P><STRONG></STRONG></P><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1">
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR" size=5><STRONG>2.3.3 Control - Disable & Enable
Interrupts</STRONG></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1"><FONT face=宋体><FONT
size=+0><FONT size=3><STRONG><FONT
face="Times New Roman TUR"></FONT></STRONG></FONT></FONT></FONT></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1"><FONT face=宋体><FONT
size=+0><FONT size=3><FONT
face="Times New Roman TUR">依赖于状态寄存器EFLAGS的IF和RF位的设置,CPU可以禁止一些Interrupts的发生。</FONT></FONT></FONT></FONT></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=4><SPAN style="mso-tab-count: 1"><STRONG>2.3.3.1
Masking Maskable Hardware
Interrupts</STRONG></SPAN></FONT></SPAN></SPAN></SPAN></SPAN></FONT></SPAN></P></FONT></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1">
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1"><FONT face=宋体><FONT
size=+0><FONT size=3><FONT
face="Times New Roman TUR"></FONT></FONT></FONT></FONT></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1"><FONT face=宋体><FONT
size=+0><FONT size=3><FONT face="Times New Roman TUR"><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><SPAN lang=EN-US><FONT face="Times New Roman TUR"
size=4><SPAN style="mso-tab-count: 1"><FONT face="Times New Roman TUR"><SPAN
lang=EN-US><FONT face="Times New Roman" size=5><SPAN
style="mso-tab-count: 1"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><FONT face=宋体><FONT size=+0><FONT
size=3><FONT
face="Times New Roman TUR">EFLAGS寄存器的</FONT></FONT></FONT></FONT></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></SPAN></FONT></SPAN></SPAN></SPAN>IF位的设置可以决定是否屏蔽那些来自于INTR
pin的中断。</FONT></FONT></FONT></FONT></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1">如果IF位被清除,CPU会禁止外部中断传递给INTR
pin;</SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1">如果IF位被设置,CPU则允许外部中断传递给INTR pin。INTR
pin外接PIC-8259A。</SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1">IF位的设置不影响NMI,也不影响处理器产生的Exceptions。当CPU被Reset之后,IF位被清除。</SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN style="mso-tab-count: 1">通过STI(Set
Interrupt-Enable Flag)和CLI(Clear Interrupt
Flag)指令可以设置和清除IF位。但在执行这些指令时,必须保证当前CPL小于或等于IOPL;如果CPL > IOPL,则会产生一个General
Protection Exception。</SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1">我们可以使用C的Macro实现这两个操作:</SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN style="mso-tab-count: 1">#define sti()
__asm__ __volatile__ ("sti": :
:"memory")</SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN style="mso-tab-count: 1">#define cli()
__asm__ __volatile__ ("cli": :
:"memory")</SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -