实时核算常常要求中止针对事情快速做出呼应。只需把握Zynq SoC中止结构的作业原理,就不难规划出中止驱动型体系。
在嵌入式处理中,中止表明暂时中止处理器的当时活动。处理器会保存当时的状况并履行中止服务例程,以便对引起中止的原因进行寻址。中止或许来自下列三个当地之一:
硬件 – 直接衔接处理器的电子信号
软件 – 处理器加载的软件阐明
反常情况 – 产生过错或反常事情时处理器呈现的反常情况
不管中止的来历在何处,都可将中止的类别归为可屏蔽和不行屏蔽两种。您可经过在中止掩码寄存器中设置相应的位来安全地疏忽可屏蔽中止。但不能疏忽不行屏蔽中止,由于这类中止一般用于守时器和看门狗监控器。
中止的触发既可所以边际触发也可所以水平触发。咱们将在后边部分看到,赛灵思Zynq®-7000 All Programmable SoC支撑中止的这两种装备方法。
为什么运用中止驱动计划?
实时规划一般要求选用中止驱动计划,由于许多体系都会有许多输入单元(如键盘、鼠标、按钮、传感器以及相似设备等)偶然需求处理。这些设备的输入单元一般会被异步至当时正在履行的进程或使命,因而用户不或许一直精确猜测事情的产生时刻。
运用中止,处理器能持续进行处理,直到事情产生,这时处理器便可处理这一事情。此外,与轮询计划比较,中止驱动计划对事情的呼应时刻更短,在中止驱动计划中,程序会以同步的方法主动对外部设备的状况进行采样。
Zynq SoC的中止结构
跟着处理器技能不断进步,中止的来历也多种多样。如图1所示,Zynq SoC可运用通用中止操控器(GIC)来处理中止。GIC可处理源自以下方面的中止:
软件生成的中止 – 每个处理器有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。别的,在每次按下按钮时,中止服务例程还会向操控台打印一条信息。
专有守时器举例
Zynq SoC具有许多可用的守时器和看门狗监督器。它们既可作为一个CPU的专用资源也可作为两个CPU的同享资源。如需在您的规划中高效运用这些组件,则需求中止。这些守时器和看门狗监督器包括:
CPU 32位守时器(SCUTIMER),以CPU频率的一半计时
CPU 32位看门狗监督器(SCUWDT),以CPU频率的一半计时
同享64位大局守时器(GT),以CPU频率的一半计时(每个CPU都有其自己的64位比较器;它与GT合作运用,能驱动各个CPU的专用中止)
体系看门狗监督时钟(WDT),可经过CPU时钟或外部来历进行计时
一对三重守时器计数器(TTC),每个包括三个独立守时器。在可编程逻辑中,可经过CPU时钟或来自MIO或EMIO的外部来历对TTC进行计时。
为了经过可用的守时器和看门狗监督器取得最大优势,咱们需求运用Zynq SoC中止。其间装备最简略的便是专有守时器。和Zynq SoC的大多数外设相同,该守时器带有许多预界说的函数和宏指令,能协助您高效运用这一资源。这些函数和宏指令坐落:
这个文件中的函数(宏指令)可以供给许多功用,包括初始化和自测试等。此外,文件中的函数还能发动和中止守时器并对其进行办理(重启;查看是否过期;加载守时器;使能/禁用主动加载)。它们的另一项作业便是设置、使能、禁用、铲除和办理守时器中止。最终,这些函数还能获取并设置预分频器。
守时器自身经过以下四个寄存器来操控:
专用守时器加载寄存器 – 可将该寄存器用于主动从头加载形式,包括在使能主动从头加载时被从头加载到专用守时器计数器寄存器中的数值。
专用守时计数寄存器 (Private Timer Counter Register) – 这是实在计数器自身。使能后,一旦寄存器到达零,则会设置中止事情标志。
专用守时器操控寄存器 – 操控寄存器可使能或禁用守时器、主动从头加载形式以及中止生成,还包括守时器的预分频器。
专用守时器中止状况寄存器 – 该寄存器包括专用守时器中止状况事情标志。
就运用GPIO而言,设置守时器所需的守时器设备ID和守时器中止ID都包括在XParameters.h文件中。在本例中,咱们将运用从前开发的按钮中止。当按下按钮时,守时器将加载并开端运转(选用非主动从头加载形式)。一旦守时器过期,将生成能经过STDOUT输出一条音讯的中止。然后铲除该中止,以便等候下一次按下按钮。在本例中,将一直向计数器加载相同的数值;因而,在文件顶部的布告中发布了守时器计数值,如下所示:
下一步是装备和初始化专用守时器并在其间加载守时器计数值。
此外,咱们还需求更新中止设置子例程,然后将守时器中止衔接至GIC并使能守时器中止。
产生中止时,需求调用TimerIntrHandler函数,这时必须在G%&&&&&%上以及守时器自身使能守时器中止。
守时器中止服务例程十分简略。它仅需铲除挂起的中止,并经过STDOUT输出一条音讯,如下所示:
完结该操作后,最终还要修正GPIO中止服务例程,然后在每次按下按钮后发动守时器,如下所示:
首要,咱们要将守时器值加载到守时器中,然后调用守时器发动函数。现在,咱们可以再次铲除按钮中止并康复处理,如图3所示。
在开端着手规划中止驱动体系时,许多工程师都会意生害怕。可是,Zynq SoC架构以及通用中止操控器(与装备SDK的驱动器相结合)可协助您快速、高效地发动和运转中止驱动体系。
图3 – GPIO与守时器中止事情输出的界面示例。