一个简单的生活场景:孩子在卧室睡觉,妈妈在客厅看书,那么,妈妈如何知道孩子醒了?
· 时时进房间查看:查询方式
· 进房间陪小孩一起睡觉,小孩醒了会吵醒她:休眠-唤醒
· 妈妈要干很多活,但可以定个闹钟陪小孩睡一会:poll方式
· 妈妈在房间干活,小孩自己醒了,走出房间告诉妈妈:异步通知
后面3中方式都需要小孩中断妈妈:中断她的睡眠、她的工作。
事实上能“中断”妈妈的事儿多着呢
· 远处猫叫:忽略
· 门铃,小孩哭声:对应不同处理
· 身体不舒服:赶紧休息
· 有蜘蛛掉下来:赶紧跑
妈妈正在看书。被中断后的流程:
· 正在看书
· 发生各种声音:中断源
o 远处猫叫
o 小孩哭声
o 门铃 ...
怎么处理
· 先在书中放上书签,合上书:保存现场
· 去处理:中断服务程序
· 回来继续看书:返回处理
嵌入式系统中的中断
CPU 在运行过程中会被各种“异常”打断:
· 未定义
· 指令、数据有问题
· SWI:软中断
· 快中断
· 中断
中断也是一种异常。导致中断的情况有很多:
· 按键
· 定时器
· ADC转换完成
· UART发送完数据、收到数据
· 等等
这些中断源,汇集到中断控制器,由中断控制器选择最高的中断并通知CPU
中断处理流程
· 初始化:
o 设置中断源:何种中断
o 设置中断控制器(屏蔽某个中断,中断优先级)
o 设置CPU总开关:使能中断
· 执行正常程序:
· 产生中断:比如按下按键 -> 中断控制器 -> CPU
· CPU 没执行一条命令都会检查有无中断/异常的产生
· CPU发现有中断/异常,开始处理:
o 对于不同的的异常,跳转到不同的地址执行程序
o 这个地址上,只是一条跳转指令,跳去执行某个函数,这个就是异常向量。
后3步都是硬件做的。软件做的:
· 保存现场(各种寄存器)
· 处理异常和中断
· 恢复现场