FPGA 101:如何在Zynq SoC上使用中断
时间:07-09
来源:互联网
点击:
作者:Adam P. Taylor
e2v技术公司工程系统部负责人
aptaylor@theiet.org
实时计算经常要求中断针对事件快速做出响应。只要掌握Zynq SoC中断结构的工作原理,就不难设计出中断驱动型系统。
在嵌入式处理中,中断表示暂时停止处理器的当前活动。处理器会保存当前的状态并执行中断服务例程,以便对引起中断的原因进行寻址。中断可能来自下列三个地方之一:
无论中断的来源在何处,都可将中断的类别归为可屏蔽和不可屏蔽两种。您可通过在中断掩码寄存器中设置相应的位来安全地忽略可屏蔽中断。但不能忽略不可屏蔽中断,因为这类中断通常用于定时器和看门狗监控器。
中断的触发既可以是边缘触发也可以是水平触发。我们将在后面部分看到,赛灵思Zynq®-7000 All Programmable SoC支持中断的这两种配置方式。
为什么使用中断驱动方案?
实时设计通常要求采用中断驱动方案,因为众多系统都会有很多输入单元(如键盘、鼠标、按钮、传感器以及类似设备等)偶尔需要处理。这些设备的输入单元通常会被异步至当前正在执行的进程或任务,因而用户不可能始终准确预测事件的发生时间。
使用中断,处理器能继续进行处理,直到事件发生,这时处理器便可处理这一事件。此外,与轮询方案相比,中断驱动方案对事件的响应时间更短,在中断驱动方案中,程序会以同步的方式主动对外部设备的状态进行采样。
Zynq SoC的中断结构
随着处理器技术不断进步,中断的来源也多种多样。如图1所示,Zynq SoC可使用通用中断控制器(GIC)来处理中断。GIC可处理源自以下方面的中断:
图1 – 红圈显示的是通用中断控制器。
共享外设中断非常有趣,因为它们非常灵活。可将它们从I/O外设(共44个中断)或FPGA逻辑(共16个中断)路由至两个CPU中的一个,但也可以将中断从I/O外设路由至设备的可编程逻辑侧,参见图2。
在Zynq SoC上处理中断
在Zynq SoC中发生中断时,处理器会采取以下措施:
1. 将中断显示为挂起;
2. 处理器停止执行当前线程;
3. 处理器在协议栈中保存线程状态,以便在中断处理后继续进行处理;
4. 处理器执行中断服务例程,其中定义了如何处理中断;
5. 在处理器从协议栈恢复之前,被中断的线程继续运行;
中断属于异步事件,因此可能同时发生多个中断。为了解决这一问题,处理器会对中断进行优先级排序,从而首先服务于优先级别最高的中断挂起。
为了正确实现这一中断结构,需要编写两个函数:一是中断服务例程,用于定义中断发生时的应对措施;二是用于配置中断的中断设置。中断设置例程可重复使用,允许构建不同的中断。该例程适用于系统中的所有中断,将针对通用I/O(GPIO)设置和使能中断。
如何在SDK中使用中断
可使用赛灵思软件开发套件(SDK)中的独立板支持包(BSP)在物理硬件上支持并实现中断。BSP具备众多功能,可显著降低创建中断驱动系统的任务难度。它们位于带有以下报头的文件中:
为了对硬件外设进行寻址,我们需要知道想要使用的设备(也就是GIC)的地址范围和设备ID,这些信息大多位于BSP报头文件xparameters下。但是xparameters_ps.h(无需在您的源代码中申报该报头文件,因为它包含在xparameters.h文件中)提供了中断ID。我们可在源文件中使用这个标记有中断的“ID”(GPIO_Interrupt_ID),使用方式如下:
在这个简单的例子中,我们将配置Zynq SoC的GPIO,以便在按下按钮后生成中断。为了设置中断,我们需要两个静态全局变量以及上述定义的中断ID来执行以下操作:
图2 – 这些是处理系统与可编程逻辑之间可用的中断。
在中断设置功能中,我们需要初始化Zynq SoC异常;配置并初始化GIC;并将GIC连接到中断处置硬件。Xil_exception.h和Xscugic.h文件可提供完成这一任务所需的函数。结果生成以下代码:
当配置GPIO以使其在同一中断配置例程中发挥中断功能时,我们能够配置内存库或单个引脚。我们可通过使用在xgpiops.h中提供的函数来完成这项任务,比如:
当然,您还需要正确配置中断。例如,您希望采用边缘触发或水平触发吗?若答案为是,那么采用这个函数能实现何种边缘和水平呢?
在这里,xgpiops.h中五个定义中的其中一个可对IrqType定义。这五个定义是:
如果您决定使用 Bank 使能,那么您需要知道您希望使能中断的单个引脚或多引脚位于哪个 Bank 上。Zynq SoC最多支持118个GPIO。在这种配置下,所有MIO(54个引脚)都会与EMIO(64个引脚)一起被用作GPIO。我们能将这个配置分为四个Bank,每个Bank容纳32个引脚。
此外,这项设置功能还将定义中断服务例程,发生中断时,可用以下函数调用该例程:
中断服务例程的繁简程度由其应用定义。在该例中,每按一次按钮,它便会触发一个LED,打开和关闭这个LED。另外,在每次按下按钮时,中断服务例程还会向控制台打印一条信息。
e2v技术公司工程系统部负责人
aptaylor@theiet.org
实时计算经常要求中断针对事件快速做出响应。只要掌握Zynq SoC中断结构的工作原理,就不难设计出中断驱动型系统。
在嵌入式处理中,中断表示暂时停止处理器的当前活动。处理器会保存当前的状态并执行中断服务例程,以便对引起中断的原因进行寻址。中断可能来自下列三个地方之一:
- 硬件 – 直接连接处理器的电子信号
- 软件 – 处理器加载的软件说明
- 异常情况 – 发生错误或异常事件时处理器出现的异常情况
无论中断的来源在何处,都可将中断的类别归为可屏蔽和不可屏蔽两种。您可通过在中断掩码寄存器中设置相应的位来安全地忽略可屏蔽中断。但不能忽略不可屏蔽中断,因为这类中断通常用于定时器和看门狗监控器。
中断的触发既可以是边缘触发也可以是水平触发。我们将在后面部分看到,赛灵思Zynq®-7000 All Programmable SoC支持中断的这两种配置方式。
为什么使用中断驱动方案?
实时设计通常要求采用中断驱动方案,因为众多系统都会有很多输入单元(如键盘、鼠标、按钮、传感器以及类似设备等)偶尔需要处理。这些设备的输入单元通常会被异步至当前正在执行的进程或任务,因而用户不可能始终准确预测事件的发生时间。
使用中断,处理器能继续进行处理,直到事件发生,这时处理器便可处理这一事件。此外,与轮询方案相比,中断驱动方案对事件的响应时间更短,在中断驱动方案中,程序会以同步的方式主动对外部设备的状态进行采样。
Zynq SoC的中断结构
随着处理器技术不断进步,中断的来源也多种多样。如图1所示,Zynq SoC可使用通用中断控制器(GIC)来处理中断。GIC可处理源自以下方面的中断:
I/O外设 | 通用设置 | 应用处理器单元(APU) | ||
系统级控制寄存器 | 窥探控制单元 | 64b | ||
AXI | ||||
ACP | ||||
从系统 | ||||
512KB L2 高速缓存与控制器 | 端口 | |||
FLASH 存储器接口 | 中央互联 | DMA8 | 存储器接口 | |
通道 | ||||
CoreSight | DR2/3,LPDDR2控制器 | |||
SMC 时序计算Calulation | 组件 | |||
到存储器互联点的可编程逻辑 | ||||
复位 | 时钟生成 | |||
扩展MIO (EMIO) | PS-PL时钟端口 | 32b GP | 32b GP | |
AXI | AXI | |||
主系统端口 | 从系统端口 | |||
DMA 同步 | 配置 | 高性能 | 处理系统 (PS) | |
DMA 通道 | AES/ | AXI 32b/64b 从系统端口 | ||
SHA | 可编程逻辑 (PL) |
- 软件生成的中断 – 每个处理器有16个此类中断,能够中断一个或两个Zynq SoC的ARM®CortexTM-A9处理器内核;
- 共享外设中断 – 共计60个,这些中断来自I/O外围设备,或往返于设备的可编程逻辑(PL)侧。Zynq SoC的两个CPU共享这些中断;
- 专用外设中断 – 这种类型中包含的5个中断对每个CPU都属于专用中断,比如CPU定时器、CPU看门狗监视器定时器以及专属PL至CPU中断。
图1 – 红圈显示的是通用中断控制器。
共享外设中断非常有趣,因为它们非常灵活。可将它们从I/O外设(共44个中断)或FPGA逻辑(共16个中断)路由至两个CPU中的一个,但也可以将中断从I/O外设路由至设备的可编程逻辑侧,参见图2。
在Zynq SoC上处理中断
在Zynq SoC中发生中断时,处理器会采取以下措施:
1. 将中断显示为挂起;
2. 处理器停止执行当前线程;
3. 处理器在协议栈中保存线程状态,以便在中断处理后继续进行处理;
4. 处理器执行中断服务例程,其中定义了如何处理中断;
5. 在处理器从协议栈恢复之前,被中断的线程继续运行;
中断属于异步事件,因此可能同时发生多个中断。为了解决这一问题,处理器会对中断进行优先级排序,从而首先服务于优先级别最高的中断挂起。
为了正确实现这一中断结构,需要编写两个函数:一是中断服务例程,用于定义中断发生时的应对措施;二是用于配置中断的中断设置。中断设置例程可重复使用,允许构建不同的中断。该例程适用于系统中的所有中断,将针对通用I/O(GPIO)设置和使能中断。
如何在SDK中使用中断
可使用赛灵思软件开发套件(SDK)中的独立板支持包(BSP)在物理硬件上支持并实现中断。BSP具备众多功能,可显著降低创建中断驱动系统的任务难度。它们位于带有以下报头的文件中:
- Xparameters.h – 该文件包含处理器的地址空间和设备ID;
- Xscugic.h – 该文件包含配置驱动程序以及GIC的使用范围;
- Xil_exception.h – 该文件包含Cortex-A9的异常函数。
为了对硬件外设进行寻址,我们需要知道想要使用的设备(也就是GIC)的地址范围和设备ID,这些信息大多位于BSP报头文件xparameters下。但是xparameters_ps.h(无需在您的源代码中申报该报头文件,因为它包含在xparameters.h文件中)提供了中断ID。我们可在源文件中使用这个标记有中断的“ID”(GPIO_Interrupt_ID),使用方式如下:
在这个简单的例子中,我们将配置Zynq SoC的GPIO,以便在按下按钮后生成中断。为了设置中断,我们需要两个静态全局变量以及上述定义的中断ID来执行以下操作:
图2 – 这些是处理系统与可编程逻辑之间可用的中断。
在中断设置功能中,我们需要初始化Zynq SoC异常;配置并初始化GIC;并将GIC连接到中断处置硬件。Xil_exception.h和Xscugic.h文件可提供完成这一任务所需的函数。结果生成以下代码:
当配置GPIO以使其在同一中断配置例程中发挥中断功能时,我们能够配置内存库或单个引脚。我们可通过使用在xgpiops.h中提供的函数来完成这项任务,比如:
当然,您还需要正确配置中断。例如,您希望采用边缘触发或水平触发吗?若答案为是,那么采用这个函数能实现何种边缘和水平呢?
在这里,xgpiops.h中五个定义中的其中一个可对IrqType定义。这五个定义是:
如果您决定使用 Bank 使能,那么您需要知道您希望使能中断的单个引脚或多引脚位于哪个 Bank 上。Zynq SoC最多支持118个GPIO。在这种配置下,所有MIO(54个引脚)都会与EMIO(64个引脚)一起被用作GPIO。我们能将这个配置分为四个Bank,每个Bank容纳32个引脚。
此外,这项设置功能还将定义中断服务例程,发生中断时,可用以下函数调用该例程:
中断服务例程的繁简程度由其应用定义。在该例中,每按一次按钮,它便会触发一个LED,打开和关闭这个LED。另外,在每次按下按钮时,中断服务例程还会向控制台打印一条信息。
SoC 嵌入式 电子 看门狗 赛灵思 传感器 ARM Cortex FPGA LED 比较器 相关文章:
- 基于Spartan-3A DSP的安全视频分析(05-01)
- 基于Actel FPGA的PWM IP的应用(09-17)
- FPGA中的处理器IP概述(04-14)
- 用于测试SDRAM控制器的PDMA(07-01)
- 设计工具是FPGA在SoC设计中继续应用的关键(07-19)
- 基于FPGA的软件验证推动ASIC与SoC原型设计技术的发展(07-22)