Updated
S3C2240 中断机制
Table of Contents
第一幕:角色介绍
- CPU(老板):负责执行主程序,单线程大脑,单次只能处理一件急事。
- 中断控制器(秘书):负责接收所有中断请求,决定是否打断老板的工作,并协调处理流程。
- 外设模块(各部门经理):负责管理具体的硬件设备,监控设备状态,并向秘书报告事件。
- 中断源(XX 部门员工):负责监控事件,当事件发生时,向上发出中断请求。
第二幕:中断全过程
场景:UART 部门的小郭(接收中断)收到了一个加急快递,需要找老板签字。
- 举手报告 (Source Pending)
小郭收到快递,在部门的小白板上画了一个钩,表示“我有事”。
- 硬件层:
SUBSRCPND(子源未决寄存器)的INT_RXD0位变 1。 - 含义:记录“接收数据”这件事发生。
- 部门汇总 (Composite Source)
UART 部门可能有三件事:收信(Rx)、送信(Tx)、出错(Err)。 不管哪件事发生了,UART 部门经理都会知道,并上报秘书处。
- 硬件层:
SRCPND(源未决寄存器)的INT_UART0位变 1。 - 含义:记录“UART 部门有事”发生。
- 查验黑名单 (Masking)
秘书处检查这件事是否在黑名单上(屏蔽寄存器 INTMSK 和子屏蔽寄存器 INTSUBMSK)。
- 如果在黑名单上,秘书处会忽略这件事,等待下一次报告。
- 如果不在黑名单上,秘书处会继续处理这件事。
- 争夺优先权 (Priority)
刚刚只是秘书确认了“UART 部门有事需要处理”,但同一时间会有很多部门也在报告。 秘书处必须根据 “优先级表” 决定谁先见老板。
- 硬件层:仲裁器根据
PRIORITY寄存器的设置进行PK。 - 含义:确保最紧急的事情先得到处理。
- 通知老板 (CPU Interrupt Pending)
秘书把 UART 事件放进唯一的“待见区”,并按下面前的红灯,告诉老板:“UART:有急事!”
- 硬件层:
INTPND寄存器的INT_UART0位变 1。 - 含义:老板知道有事需要处理。
- 注意:
SRCPND里面可能有好几个 1(多个事件),但INTPND里只有 1 个 1。
- 老板处理 (ISR)
老板看到红灯亮,放下手里的活(保存现场),查询 INTPND,发现是 UART。
于是老板拿出《UART 处理手册》(跳转到中断向量表),开始执行代码(读取数据)。
- 硬件层:CPU 根据中断向量表跳转到对应的中断服务程序(ISR)。
- 含义:老板专心处理这件事。
第三幕:事后善后
老板处理完快递了,现在要让大家回去工作。
- 清理源头:老板先在代码里把小李白板上的钩擦掉(向
SUBSRCPND写 1)。- “小郭,你的事办完了,别叫了。”
- 部门汇总:老板把经理的申请单撕了(向
SRCPND写 1)。- “UART 部门的事也办完了,别再报了。”
- 恢复工作:老板按灭桌上的红灯(向
INTPND写 1)。- “好了,继续干活吧。”