ZYNQ异常与中断(一)


1.Arm架构的异常

1.1 异常原理

  • 异常是一个情况或事件,当异常发生时,它要求CPU停止当前执行的指令,转而去执行专用的软件程序(与每个异常相关的软件句柄)。异常可以是CPU自己产生的也可以时外部产生传给CPU的。
    在这里插入图片描述
    执行的过程大概就如上图所示,CPU产生一个异常,然后通知特权级软件系统采取弥补性的行为或对系统状态进行更新,从而恢复系统的正常状态,这个过程称为异常处理。
  • 在学习异常的时候,肯定绕不开中断,中断是特定类型的异常,其他架构将某些特定类型的异常称为中断或陷阱,然而在Arm架构中,他们都是异常,也保留这些术语用于指定类型的异常。

1.2 异常类型

1.2.1 中断

所有的微处理器都必须对外部的异常事件进行响应,如按下一个按键或时钟到达某个值,这里通常会有专门异常产生硬件用于激活连接到CPU的异常信号线,这种由外部产生的异常,称为中断
在Armv7核中,有两种类型的中断,分别为IRQ和FIQ。他们时连接CPU核的物理信号接口,统一受中断控制器GIC控制并根据优先级进行仲裁。
由于FIQ和IRQ并不直接与CPU核正在执行的软件相关联,因此将它们称为异步异常

1.2.2 异常终止

异常终止的产生是由于失败的取值或者失败的数据访问引起的。
如果异常终止的产生是由于尝试执行或执行指令流引起的,则称为同步的,返回地址将提供引起该异常终止的指令地址。

1.2.3 复位

所有的核都有复位输入,当核被复位时,将立即采纳复位异常。复位异常的优先级是最高的。

1.2.4 异常生成指令

执行某些指令可以产生异常。

  • 监控程序调用指令SVC,使能用户模式程序能请求一个操作系统服务。
  • 管理程序调用指令HVC,如果实现虚拟化扩展则可使用,使能客户操作系统请求管理程序服务。
  • 安全监控调用指令SMC,如果实现安全性扩展则可使用。
  • 尝试执行一个CPU核不识别的指令时,将产生一个未定义异常。

1.3 异常处理

1.3.1 常见异常处理

异常处理分为进入异常处理退出异常处理两个过程。

  • 进入异常处理
    当发生一个异常时,CPU会实现以下步骤:

    1. CPSR(程序状态寄存器Current Program Status Register) 的值复制到SPSR_< mode >分组寄存器(备份程序状态寄存器) 中进行保存
    2. 将返回地址保存到新模式的链接寄存器内。
    3. 将CPSR模式位修改为与异常类型相关的模式。
      (1) 由CP15系统控制寄存器确定其他CPSR模式位的值。
      (2) 由CP15TE比特位决定T位的值。
      (3)清除J比特位,以及将E比特位设置为EE比特位的值。
      (4) 将PC设置指向来自异常向量表的相关指令。
      在这里插入图片描述
  • 退出异常处理
    当从异常返回时,需要执行下面的步骤。

     1.将保存在SPSR中的值恢复到CPSR。
     2.将PC设置为返回地址的偏移。 
    

1.3.2 异常终止句柄

在不同的系统之间,异常终止的代码明显不同。在很多嵌入式系统中,一个异常终止表示一个不期望的错误,并且句柄会纪录任何诊断信息,报告错误。
CP15寄存器提供了引起访问异常终止的存储器地址和异常终止的原因。

1.3.3 未定义异常处理

如果CPU核尝试执行包含操作码的一条指令,这些指令在Arm规范架构中没有定义或执行一个协处理器没有识别出来的协处理器指令时,则采纳一个未定义指令异常。

1.3.4 SVC异常处理

SVC调用用于使用用户模式访问操作系统功能。

2.中断

2.1 中断原理

前面介绍过zynq的中断分为FIQ和IRQ,他们都是低电平有效输入。由中断控制器接收来自不同外设的中断请求,并将他们连接到FIQ和IRQ,使得CPU采纳一个异常。

2.2 中断处理

当产生一个异常后,一个可重入的中断句柄必须执行下面的步骤。

(1)中断句柄保存被打断程序的上下文(现场),即把可能被中断句柄破坏的寄存器压入其他内核模式堆栈,包括返回地址和SPSR_IRQ,
(2)确定所处理的中断源,在外部硬件内清除中断源。
(3)中断句柄改为CPU核SVC模式,保留设置CPSR的I比特位。
(4)中断地址将返回地址保存到堆栈,重新使能中断。
(5)调用合适的中断句柄代码。
(6)恢复现场。

2.3 ZYNQ7000中断环境

翻开UG585 中断部分, Zynq 中断大致可分为三个部分,

  • 1 为 SGI ,软件生成的中断,共 16个端口;
  • 2 为 PPI, CPU 私有外设中断,有 5 个;
  • 3 为 SPI ,共享外设中断,来自于 44 个 PS 端的IO 外设以及 16 个 PL 端的中断。
  • 中间部分为 GIC ,也即中断控制器,用于对中断进行使能、关闭、掩码、设置优先等。
    在这里插入图片描述

以下为中断控制器框图,主要的控制器部分为ICC 和 ICD ICD 连接 SGI 和 PPI ICD 连接 SPI可配置两者的寄存器来控制中断。
在这里插入图片描述

2.3.1 软件中断

SGI中断(软件产生中断),共 16 个 IRQ ID 号。
在这里插入图片描述

2.3.2 CPU私有外设中断

PPI中断, CPU 私有中断,共 5 个 IRQ ID 号。
在这里插入图片描述

2.3.3 共享外设中断

SPI中断部分,共 60 个 IRQ ID 号。
在这里插入图片描述
在这里插入图片描述

2.3.4 寄存器概述

用Xilinx 的 API 函数就可以很好的控制中断,如果有兴趣可以深入了解中断寄存器,可以对
其机制有更好的认识。
在这里插入图片描述

ICDICFR : 配置寄存器,用于配置触发方式,电平触发或边沿触发,共有 6 个,每个寄存器 32 位,
每两位表示一个中断, 32*6/2=96 个中断号,能覆盖所有中断。
ICDICFR0: IRQ ID#0~#15
ICDICFR1: IRQ ID#16~#31
ICDICFR2: IRQ ID#32~#47
ICDICFR3: IRQ ID#48~#63
ICDICFR4: IRQ ID#64~#79
ICDI CFR5: IRQ ID#80~#95
对于SPI 中断 0b01 :高电平触发 0b11 :上升沿触发
ICDIPR : 中断优先级寄存器,设置优先级,共 24 个寄存器,每 8 位代表一个中断号,共 96 个
中断号。
ICDIPTR : CPU选择寄存器, 24 个寄存器,每 8 位代表一个中断号,共 96 个
0bxxxxxxx1: CPU interface 0
0bxxxxxx1x: CPU interface 1
ICDICER : 中断关闭寄存器, 3 个寄存器,每 1 位代表一个中断号,共 96 个
ICDISER : 中断使能寄存器, 3 个寄存器,每 1 位代表一个中断号,共 96 个

代码实战

ZYNQ异常与中断(二)

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值