中断优先级寄存器(IP)
IP寄存器结构
IP寄存器是一个8位寄存器,每个位控制一个中断源的优先级:
- IP.0: 外部中断0(PX0)
- IP.1: 定时/计数器0(PT0)
- IP.2: 外部中断1(PX1)
- IP.3: 定时/计数器1(PT1)
- IP.4: 串行口中断(PS)
当某位设置为1时,表示对应的中断源为高优先级;当设置为0时,表示低优先级。
当IP设置为0AH(0000 1010二进制)时,表示:
IP.3 (ET1) = 1:定时/计数器1高优先级
IP.2 (EX1) = 0:外部中断1低优先级
IP.1 (ET0) = 1:定时/计数器0高优先级
IP.0 (EX0) = 0:外部中断0低优先级
在这种情况下,定时/计数器0和定时/计数器1都是高优先级。根据中断优先级规则,如果两个中断有相同的优先级,则根据它们在硬件中的排列顺序,优先处理较早的中断。因此,定时/计数器0的优先级最高。
实例分析
假设我们有一个系统需要处理定时任务和串行通信。定时任务要求严格的实时性,因此我们将定时/计数器0设置为高优先级,而串行通信为低优先级。
示例代码
以下是一个简单的示例程序,演示如何设置和使用中断优先级:
ORG 0000H ; 程序起始地址
AJMP MAIN ; 跳转到主程序
ORG 0003H ; 外部中断0服务程序地址
AJMP EXT_INT0
ORG 000BH ; 定时/计数器0中断服务程序地址
AJMP TIMER0_ISR
ORG 0023H ; 串行口中断服务程序地址
AJMP SERIAL_ISR
MAIN:
MOV IE, #82H ; 使能外部中断0和全局中断
MOV IP, #02H ; 设置定时/计数器0为高优先级
MOV TMOD, #01H ; 定时器0模式1(16位定时器)
MOV TH0, #0FCH ; 定时初值高字节
MOV TL0, #18H ; 定时初值低字节
SETB TR0 ; 启动定时器0
SJMP $ ; 主程序进入无限循环
EXT_INT0:
; 外部中断0处理代码
RETI
TIMER0_ISR:
; 定时/计数器0中断处理代码
MOV TH0, #0FCH ; 重新加载初值
MOV TL0, #18H
CLR TF0 ; 清除定时器0溢出标志
RETI
SERIAL_ISR:
; 串行口中断处理代码
RETI
解释
- 在
MAIN
程序中,首先使能外部中断0和全局中断(MOV IE, #82H
)。 - 设置定时/计数器0为高优先级(
MOV IP, #02H
)。 - 配置定时器0为16位定时器模式,并加载初始值。
- 启动定时器0,并进入无限循环。
在中断处理程序中,定时/计数器0中断服务程序(TIMER0_ISR
)优先级高于串行口中断服务程序(SERIAL_ISR
)。因此,当定时/计数器0和串行口同时触发中断时,CPU会优先处理定时/计数器0中断。