第五章中断及中断处理;提纲;CPU与外部设备之间的数据交换,可以采用无条件传送,查询传送,也可以采用中断方式。当CPU正常运行程序时,由于微处理器内部事件或外部请求,引起CPU中断真在运行的程序,转去执行请求中断的外设(或内部事件)的中断服务子程序,中断程序执行完毕,再返回被终止的程序,这个过程被称为中断。利用中断可以避免不断检测外部设备状态,提高CPU的利用率。;中断的例子;这是一个二级中断系统的例子。包括主函数、中断服务函数1和中断服务函数2,函数1被函数2中断的过程也常常被称为中断嵌套。如果有更高级别的中断申请,CPU将保护断点2的位置(该指令后面一条运行指令的位置)和保护现场。响应更高级别的中断,将中断服务函数2的地址送给程序计数器(PC),CPU开始执行中断服务函数2的程序,执行完该程序,中断返回。先是恢复现场(包括相关的寄存器、计数器和相关的变量和数据结构),然后是中断返回,返回地址是在断点2压入堆栈的断点地址,继续执行中断服务函数1,执行完中断服务函数1。恢复断点1处的现场,接着中断返回到断点1处执行主函数。至此,二级中断系统执行完毕。;CPU对中断的响应;链式优先权排队电路;编码器和译码器的优先权排队电路
;提纲;通用中断控制器(GIC)逻辑分区
;分发器是多输入、多输出电路,输入信号是中断源,输出信号连接到CPUinterface0或者CPUinterface1。分发器收集所有的中断源,执行中断优先级排序,它将优先级最高的中断事件发送到CPU接口端,同时选择是哪一个CPU接口端,以进行优先级屏蔽和抢占处理。分发器寄存器由GICD_前缀标识。模块功能如下:
全局中断使能控制;
控制每一个中断的使能或者关闭;
设置每个中断的优先级;
设置每个中断的目标处理器列表;
设置每个外部中断的触发模式:电平触发或边沿触发;
设置每个中断属于组0还是组1;
每个中断状态的可见;
软件可以设置或清除外设中断挂起状态。;i.MX6Solo/6DL共160个中断源,可分为三类:
SPIs:共享中断。ID159~ID32,这128个ID分配给SPIs。这是由外设产生,可以发送给一个或多个核心处理的中断源。
PPIs:专用外设中断。ID31~ID16,这16个ID分配给PPIs。这是由外设产生,是专由特定核心处理的中断。
SGI:软件中断。ID15~ID0,这16个ID分配给SGI。软件中断的产生是通过软件写入到一个专门的寄存器:软中断产生中断寄存器(ICDSGIR)。它常用在核间通信。软中断能以所有核心为目标或选中一组系统中的核心为目标。
常见的中断源有:数据输入/输出外设请求中断、定时时间到申请中断、满足规定状态申请中断、电源掉电申请中断、故障报警申请中断、程序调试申请中断等。;CPUInterfaces和CPUCore相连接的,因此每个CPUCore都可以在GIC中找到一个与之对应的CPUInterface。CPUInterface是Distributor和CPUCore之间的桥梁。执行优先屏蔽和抢占处理系统中连接的处理器。CPU接口是有时称为物理CPU接口,以避免可能与虚拟CPU接口混淆。CPU接口块寄存器由GICC_前缀标识。模块功能如下:
使能或者关闭发送到CPUCore的中断请求信号;
设置优先级掩码,通过掩码来设置哪些中断不需要上报给CPUCore;
当多个中断到来的时候,选择优先级最高的中断通知给CPUCore;
定义抢占策略;
应答中断;
通知中断处理完成。;中断状态转换图
;GIC中断处理流程
;提纲;GIC寄存器
;GICC_PMR寄存器只有低8位有效,这8位最多可以设置256个优先级。256个优先级 128个优先级64个优先级 32个优先级16个优先级
i.MX6Solo/6DL最多支持32个优先级,所以GICC_PMR要设置为8
设置抢占优先级和子优先级。GICC_BPR寄存器决定抢占优先级和子优先级的比例,寄存器GICC_BPR只有低3位有效。
000:7级抢占优先级,1级子优先级。 001:6级抢占优先级,2级子优先级。
010:5级抢占优先级,3级子优先级。 011:4级抢占优先级,4级子优先级。
100:3级抢占优先级,5级子优先级。 101:2级抢占优先级,6级子优先级。
110:1级抢占优先级,7级子优先级。 111:0级抢占优先级,8级子优先级。;GIC应用举例
;(2)voidmx6_enable_interrupt(uint32_tirq_id,uint32_tcpu_id,uint32_tp