上图所示GIC左边的称为中断请求源,它们产生中断请求。所有的中断请求都可以发送到GIC通用中断控制器,所以它是一个集中式的中断请求中心。GIC根据请求源的属性(enables, disables, masks, and prioritizes)把请求派发给相应的中断执行者进行中断处理,一般指CPU。PL端也可以进行中断处理,这是个特例。
上图中 / 斜杠 的数字表示有多少路信号,GIC通过具体是哪条线来判断是哪个请求源产生了中断请求。

中断分发器将所有中断源集中起来,然后将优先级最高的中断源分配给各个cpu。GIC确保针对多个CPU的中断一次只能被一个CPU执行。所有中断源都由唯一的中断ID号标识。所有中断源都有自己可配置的优先级和目标cpu列表

下图是GIC中断控制器更加详细的中断源请求分配图,可以看到不同的中断类型的请求源如何进行分配的。

PL部分的中断请求,可以通过GIC也可以直通CPU,这部分如下图所示,通过寄存器 mpcore.ICCICR 选择。

共享的请求中断源,也就是说中断源发送中断后GIC可以发送给CPU0或者CPU1.


中断敏感信息说的是中断有谁处理,发送给谁,和 触发方式



所有中断请求(PPI, SGI和SPI)都被分配了一个唯一的ID号。控制器使用ID号进行仲裁。中断分发器保存每个中断的挂起中断列表
CPU,然后选择最高优先级的中断,然后将其发送到CPU接口。通过选择最低的ID来解决同等优先级的中断。
优先级逻辑在物理上是重复的,以便为每个CPU同时选择最高优先级的中断。中断分发器保存中断、处理器和激活信息的中心列表,并负责触发软件中断到cpu。

GPIO 中断

上图红色所示,MIO or EMIO的输入Input 信号是中断的触发信号。

简单可以看成5个部分
1.中断信号输入,输入来源GPIO 输入,GPIO引脚的电平状态为中断的输入信号
2.中断信号逻辑,解决的是什么样的信号满足中断条件,条件是我们通过设置三个寄存器来完成的,电平,边沿,极性。
3.中断状态,当输入的信号瞒住中断判断逻辑那么中断发生,这个事件通过一个中断状态来记录。
4.中断上报使能,中断状态是否要进行上报,在ZYNQ A9处理器架构下中断事件是先报给GIC。
5.中断上报线路,通过一条IRQ #25 上报给GIC。注意这里不是直接发给CPU。

需要注意的部分
中断事件报给的是GIC,GIC用来决定这个中断事件发给谁,这种架构在MCU中并不常见。
在Cortex M系列处理器中,中断事件经过NVIC直接报给CPU。然而Arm A9处理器并不是这样

ps7_cortexa9_0\libsrc\standalone_v6_8\src下asm_vectors.s
文件的目录会有少许不一样。

#include "xil_errata.h"
#include "bspconfig.h".org 0
.text.globl _vector_table.section .vectors
_vector_table:B _bootB  UndefinedB  SVCHandlerB PrefetchAbortHandlerB   DataAbortHandlerNOP /* Placeholder for address exception vector*/B  IRQHandlerB FIQHandlerIRQHandler:                   /* IRQ vector handler */stmdb   sp!,{r0-r3,r12,lr}      /* state save from compiled code*/
#if FPU_HARD_FLOAT_ABI_ENABLEDvpush {d0-d7}vpush {d16-d31}vmrs r1, FPSCRpush {r1}vmrs r1, FPEXCpush {r1}
#endif#ifdef PROFILINGldr   r2, =prof_pcsubs   r3, lr, #0str   r3, [r2]
#endifbl    IRQInterrupt            /* IRQ vector */#if FPU_HARD_FLOAT_ABI_ENABLEDpop   {r1}vmsr    FPEXC, r1pop    {r1}vmsr    FPSCR, r1vpop    {d16-d31}vpop    {d0-d7}
#endifldmia sp!,{r0-r3,r12,lr}      /* state restore from compiled code */subs  pc, lr, #4          /* adjust return */

_vector_table: 的栏目,没错只有这么几个,一共8行
那么几十个IRQ 号是什么回事,所以一定存在一对多的情况。
简单说就是对于CPU而言,第一级的中断跳转只有7个向量。


打个比方,中断号#40 ~#60(范围是随便写的,做示意) 都是归于IRQ Handler 这个中断向量表,只要上报了这个IRQ号,CPU都会执行IRQ Handler,IRQ Handler里面就需要去判断具体是什么外设发生的中断,从而执行对应外设的中断处理程序。所以出现了两次跳转。
详细内容可以参考一篇文章。
https://www.cnblogs.com/Hx1024/p/14437479.html

这个时候创建一个SDK自带的GPIO 中断例程,可以看到官方开发板zc702,所以比较推荐官方开发板。

 /** Setup the interrupts such that interrupt processing can occur. If* an error occurs then exit.*/Status = SetupInterruptSystem(Intc, Gpio, GPIO_INTERRUPT_ID);if (Status != XST_SUCCESS) {return XST_FAILURE;}

我们会注意到一个向量表,我们记作Gic_VectorTable。
XScuGic_VectorTableEntry
他表示的是GIC中断控制器的所以向量表,并不是CPU硬件跳转的中断向量表。

首先对这个 Gic_VectorTable进行初始化。

 /** Connect the interrupt controller interrupt handler to the hardware* interrupt handling logic in the processor.*/Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,GicInstancePtr);/*****************************************************************************/
/**
* @brief   Register a handler for a specific exception. This handler is being
*           called when the processor encounters the specified exception.
*
* @param   exception_id contains the ID of the exception source and should
*           be in the range of 0 to XIL_EXCEPTION_ID_LAST.
*           See xil_exception.h for further information.
* @param   Handler to the Handler for that exception.
* @param   Data is a reference to Data that will be passed to the
*           Handler when it gets called.
*
* @return  None.
*
* @note        None.
*
****************************************************************************/
void Xil_ExceptionRegisterHandler(u32 Exception_id,Xil_ExceptionHandler Handler,void *Data)
{XExc_VectorTable[Exception_id].Handler = Handler;XExc_VectorTable[Exception_id].Data = Data;
}

这里的XExc_VectorTable 是CPU的硬件跳转向量表,也是就是真正的向量表他只有 7 个

这个函数的一样是注册一个IRQ总的跳转函数,他对应所以IRQ事件。
所以具体的中断处理需要 Gic_VectorTable。

使用下面的函数

 /** Connect the device driver handler that will be called when an* interrupt for the device occurs, the handler defined above performs* the specific interrupt processing for the device.*/Status = XScuGic_Connect(GicInstancePtr, GpioIntrId,(Xil_ExceptionHandler)XGpioPs_IntrHandler,(void *)Gpio);if (Status != XST_SUCCESS) {return Status;}

再去设置非常常规的寄存器

/* Enable falling edge interrupts for all the pins in bank 0. */XGpioPs_SetIntrType(Gpio, GPIO_BANK, 0x00, 0xFFFFFFFF, 0x00);/* Set the handler for gpio interrupts. */XGpioPs_SetCallbackHandler(Gpio, (void *)Gpio, IntrHandler);/* Enable the GPIO interrupts of Bank 0. */XGpioPs_IntrEnable(Gpio, GPIO_BANK, (1 << Input_Pin));/* Enable the interrupt for the GPIO device. */XScuGic_Enable(GicInstancePtr, GpioIntrId);/* Enable interrupts in the Processor. */Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);

看到这里基本上没有问题了,难点在于
处理器的中断向量表,和GIC的中断向量表。

xilinx zynq 7010/7020 中断/中断向量/GIC向量/GPIO中断相关推荐

  1. Xilinx zynq 7010/7020 GPIO - EMIO,MIO

    有条件的可以买一块xilinx zc702官方开发板,能够从中受益匪浅. EMIO 是Exrended IO 如上图所示,当PS端的通过MIO分配物理引脚不够用的时候,EMIO也是属于PS端的,但是它 ...

  2. Xilinx zynq 7010/7020 GPIO - MIO

    有条件的可以买一块xilinx zc702官方开发板,能够从中受益匪浅. GPIO外围设备提供软件可控的54个IO的MIO模块.也可以提供PL端64个IO的输入和128个输出的EMIO. GPIO作为 ...

  3. ZYNQ从放弃到入门(三)- 中断(一)

    在检查PS端IO口状态时,常用的就是轮询,但是实际工程中很少用这种方式,主要是运行复杂逻辑时,轮询方式效率太低,CPU需要等待IO口状态变化,这种肯定不符合大多数应用,所以多数情况下都是使用中断方式进 ...

  4. ARM通用中断控制器GIC(generic Interrupt Controller)简介

    参考文档: Documentation – Arm Developer  ARM Generic Interrupt Controller Architecture Specification 目录 ...

  5. ARM通用中断控制器GIC之中断处理简介

    在阅读本章之前,可以参考笔者之前关于GIC的一些描述: ARM通用中断控制器GIC(generic Interrupt Controller)简介 ARM架构Generic Interrupt Con ...

  6. 【正点原子Linux连载】第十七章GPIO中断试验-摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  7. 中断触发流程三(中断控制器)

    这一篇主要说说中断控制器,及GPIO中断触发与中断号的识别,为什么GPIO引脚的触发最后调用特定的中断例程,这中间是怎么联系起来的.现在知道的是request_irq只是在特定的中断号 链表中注册了一 ...

  8. linux 应用层gpio中断_树莓派官方自带gpio中断驱动bcm2708_gpio.c原理分析 linux 中断架构 中断子系统...

    上一篇记录了树莓派自带的gpio驱动(外链网址已屏蔽),在bcm2708_gpio.c实现gpio驱动的同时其实也实现了中断控制器的驱动,本文记录bcm2708_gpio.c中驱动的实现. 一·bcm ...

  9. 树莓派移植SX1278 LoRa通信--使用wiringPi 移植GPIO中断

    一.SX1278 数字接口状态映射 从官方文档可知sx1278的数字接口状态映射明细,移植的代码中主要用查询的方式来判断在连续模式下是否接收和发送完成,因此只需要用到DIO0.如果要用到CAD,则需要 ...

最新文章

  1. POJ1276Cash Machine
  2. Python混淆矩阵可视化:plt.colorbar函数自定义颜色条的数值标签、配置不同情况下颜色条的数值范围以及数据类型(整型、浮点型)
  3. python超出列表范围,(Python)列表索引超出范围 - 迭代
  4. JIRA 5.0.1 发布
  5. POJ 3928 amp; HDU 2492 Ping pong(树阵评价倒数)
  6. Linux多线程实践(2) --线程基本API
  7. mysql的number类型对应的db2_【转】oracle数据库NUMBER数据类型
  8. 校友录管理系统设计c语言,校友录管理系统分析设计分析.doc
  9. 2018.10.04 NOIP模拟 航班(tarjan+树形dp)
  10. p6spy监测mysql_Spring使用p6spy监控sql
  11. 基于MIMO讲解信道估计基本原理
  12. js遍历(js遍历json对象)
  13. TA入门笔记(十五)
  14. html语法在线检测,HTML语法检测
  15. TI C2000 刷flash意外锁芯片的解决办法
  16. (20181111)Fortran 产生随机数
  17. 社保包括哪些保险?社保和五险一金有什么区别?
  18. 最强文献下载神器——SCI-HUB客户端v7.0
  19. matlab fromstream,matlab安装问题求助
  20. FT2000盒子运行ubuntu20.04系统

热门文章

  1. JavaWeb学习-AJAX-3-练习:验证用户名是否存在
  2. Flutter-解决Try catch出现异常:type ‘_TypeError‘ is not a subtype of type ‘Exception‘ in type cast
  3. Ruby cannot load such file -- zlib和openssl(LoadError)及gem No rule to make target `/include/ruby.h‘解决
  4. P1039 侦探推理
  5. springboot2学习笔记:mvnw相关文件生成
  6. SaaS的中国版图,SaaS的中国问题
  7. 计算机类ei期刊,【2017年整理】电子类通信类和计算机类EI期刊(大部分免费).docx...
  8. mmdetection目标检测训练过程参数解读
  9. 新奥创:多APP场景端到端的技术体系探索与突破
  10. Kinect for Windows SDK v2.0 开发笔记 (十三) 高清面部帧(4) 面部模型构建器