有操作系统和无操作系统的应用程序执行+中断检测处理流程
中断检测 :硬件电路自动查信号 + 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、无操作系统(裸机开发):
代码下载到开发板后,上电第一步:硬件强制流程(硬件一上电就按照这个流程走)
- 开发板上电
- CPU 自动从 Flash 起始地址取第一条指令
- 执行 启动文件(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函数刚才被打断的位置继续执行
学习过程中的小总结,有错误欢迎指出!
更多推荐
所有评论(0)