Return
Updated

S3C2240 中断机制

第一幕:角色介绍

  1. CPU(老板):负责执行主程序,单线程大脑,单次只能处理一件急事。
  2. 中断控制器(秘书):负责接收所有中断请求,决定是否打断老板的工作,并协调处理流程。
  3. 外设模块(各部门经理):负责管理具体的硬件设备,监控设备状态,并向秘书报告事件。
  4. 中断源(XX 部门员工):负责监控事件,当事件发生时,向上发出中断请求。

第二幕:中断全过程

场景:UART 部门的小郭(接收中断)收到了一个加急快递,需要找老板签字。

  1. 举手报告 (Source Pending)

小郭收到快递,在部门的小白板上画了一个钩,表示“我有事”。

  • 硬件层:SUBSRCPND(子源未决寄存器)的 INT_RXD0 位变 1。
  • 含义:记录“接收数据”这件事发生。
  1. 部门汇总 (Composite Source)

UART 部门可能有三件事:收信(Rx)、送信(Tx)、出错(Err)。 不管哪件事发生了,UART 部门经理都会知道,并上报秘书处。

  • 硬件层:SRCPND(源未决寄存器)的 INT_UART0 位变 1。
  • 含义:记录“UART 部门有事”发生。
  1. 查验黑名单 (Masking)

秘书处检查这件事是否在黑名单上(屏蔽寄存器 INTMSK 和子屏蔽寄存器 INTSUBMSK)。

  • 如果在黑名单上,秘书处会忽略这件事,等待下一次报告。
  • 如果不在黑名单上,秘书处会继续处理这件事。
  1. 争夺优先权 (Priority)

刚刚只是秘书确认了“UART 部门有事需要处理”,但同一时间会有很多部门也在报告。 秘书处必须根据 “优先级表” 决定谁先见老板。

  • 硬件层:仲裁器根据 PRIORITY 寄存器的设置进行PK。
  • 含义:确保最紧急的事情先得到处理。
  1. 通知老板 (CPU Interrupt Pending)

秘书把 UART 事件放进唯一的“待见区”,并按下面前的红灯,告诉老板:“UART:有急事!”

  • 硬件层:INTPND 寄存器的 INT_UART0 位变 1。
  • 含义:老板知道有事需要处理。
  • 注意:SRCPND 里面可能有好几个 1(多个事件),但 INTPND 里只有 1 个 1。
  1. 老板处理 (ISR)

老板看到红灯亮,放下手里的活(保存现场),查询 INTPND,发现是 UART。 于是老板拿出《UART 处理手册》(跳转到中断向量表),开始执行代码(读取数据)。

  • 硬件层:CPU 根据中断向量表跳转到对应的中断服务程序(ISR)。
  • 含义:老板专心处理这件事。

第三幕:事后善后

老板处理完快递了,现在要让大家回去工作。

  1. 清理源头:老板先在代码里把小李白板上的钩擦掉(向 SUBSRCPND 写 1)。
    • “小郭,你的事办完了,别叫了。”
  2. 部门汇总:老板把经理的申请单撕了(向 SRCPND 写 1)。
    • “UART 部门的事也办完了,别再报了。”
  3. 恢复工作:老板按灭桌上的红灯(向 INTPND 写 1)。
    • “好了,继续干活吧。”