中断检测 :硬件电路自动查信号 + CPU 每条指令末尾检查 + 跳转执行处理函数。CPU 不是一直盯着中断看,而是每执行完一条指令,就看一眼:有没有中断来。

1、有操作系统:

Linux操作系统启动流程:

1. 上电

2. CPU 执行固化代码(BootROM)

3. 启动 U-Boot(引导程序)

4. U-Boot 加载 Linux 内核到内存

5. Linux 内核启动!

内核启动后,操作系统做 5 件关键事情(操作系统接管 CPU)。

        1)初始化中断控制器(GIC)

        2)注册所有中断服务函数(全部由内核接管)

        3)初始化任务调度系统(任务队列、时钟中断,时钟中断则是设置一个任务执行的时间片长度,执行完后调度到下一个任务)

        4)挂载文件系统

        5)启动应用程序

在执行应用程序的过程中如果发生中断,则大致按照以下步骤执行(可能还有些细节没写到):

1. 外部设备产生事件

2. 设备向中断控制器发送中断信号

3. 中断控制器判断是否允许该中断

4. CPU 执行完当前指令

5. CPU 硬件检测到中断请求

6. 硬件自动保存现场(寄存器、PC)

7. 硬件查中断向量表

8. 跳转到操作系统的中断入口

9. 操作系统执行中断分发(所有中断全部由操作系统内核接管

10. 找到对应 ISR(中断处理函数) 并执行

11. 执行完毕后返回

12. 硬件恢复现场

13. 回到原程序继续执行

2、无操作系统(裸机开发):

代码下载到开发板后,上电第一步:硬件强制流程(硬件一上电就按照这个流程走)

  1. 开发板上电
  2. CPU 自动从 Flash 起始地址取第一条指令
  3. 执行 启动文件(startup.s 汇编代码)

           1)设置堆栈(SP 指针)

           2)初始化中断向量表(告诉 CPU 中断来了跳去哪里)

           3)初始化硬件(时钟、串口等)

           4)跳转到 C 语言的 main () 函数

如果执行main函数时,中断来了,CPU 则自动响应(没有操作系统,完全靠硬件自动实现)。

假设:按键按下 → 产生中断信号。

中断处理大致流程:

        1)按键按下

        2)硬件发出中断电信号

        3)中断控制器把信号发给 CPU

        4)CPU 执行完当前指令

        5)CPU 硬件自动检测到中断请求

        6)硬件自动保存现场:把当前运行位置(PC 指针)、寄存器压入栈

        7)硬件查中断向量表

        8)硬件自动跳转到 中断服务函数(ISR):中断函数

        9)执行中断里的代码

        10)中断执行完毕,执行中断返回指令

        11)硬件自动恢复现场:弹出栈里的寄存器、PC 指针

        12)回到main函数刚才被打断的位置继续执行

学习过程中的小总结,有错误欢迎指出!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐