ZYNQ开发之PL-PS中断

1、说明
\qquad 本文叙述了ZYNQ芯片中断相关内容,并且例举了PL-PS中断实例。参考文献ug585.
2、系统中断架构
\qquad 每个CPU都有一组私有外围中断(PPIs),通过使用banked register进行私有访问。PPIs包括全局定时器、私有看门狗定时器、私有定时器和来自PL的FIQ/IRQ。
\qquad 软件产生的中断(SGIs)被路由到一个或两个cpu。SGIs是通过写入通用中断控制器(GIC)中的寄存器来生成的。
\qquad 共享外围中断(SPI)由PS和PL中的各种I/O和内存控制器生成。它们被路由到其中一个或两个cpu。来自PS外围设备的SPI中断也被路由到PL。
在这里插入图片描述
在这里插入图片描述
3. 通用中断控制器(GIC)
\qquad 通用中断控制器(GIC)用于管理来自PS和PL的发送到CPU的中断。当CPU接口接收到下一个中断时,控制器启用、禁用、屏蔽、对中断源进行优先排序,然后以编程的方式将它们发送到所选的CPU(或CPU)。此外,为了实现安全系统控制器还支持扩展为安全模式。
\qquad 寄存器通过CPU专用总线进行访问,以实现快速读/写响应,避免了互连中的临时阻塞或其他瓶颈。
\qquad 中断分发服务器将所有中断源集中起来,然后将具有最高优先级的中断源分派给各个CPU。GIC确保一个针对多个CPU的中断一次只能被一个CPU执行。所有中断源都由唯一的中断ID号标识。所有中断源都有自己的可配置优先级和目标CPU列表。

4、软件中断SGI
\qquad 每个CPU可以自己产生中断,也可以由其他CPU产生中断,或者使用软件生成中断(SGI),共有16个SGI。通过写SGI中断号到ICDSGIR寄存器和指定的目标CPU可以生成一个SGI。这个写操作通过CPU专用总线完成。每个CPU有至多16个SGI。中断的清除操作是通过读取ICCIAR寄存器或写1到ICDICPR寄存器的相应bit位。所有的SGI是边沿触发,敏感类型是固定不可更改的。ICDICFR0寄存器是只读的,因为它指定了所有16个SGIs的敏感性类型。

5、私有外设中断PPI
\qquad 每个CPU连接五个私有的外设中断。
\qquad PPI的敏感类型是固定不可更改的,因此ICDICFR1寄存器是只读模式。需要注意的是从PL来的快速中断信号(FIQ)和中断信号(IRQ)是被反向后送入中断控制器的。因此,尽管在ICDICFR1寄存器映射出它们是低有效,但它们在PS-PL接口是高有效的。

6、共享外设中断SPI
\qquad 可将来自各个模块的约60个中断路由到CPUs或PL。中断控制器为cpu管理这些中断的优先级和接收。
\qquad 除了IRQ #61到#68和#84到#91之外,所有的中断敏感类型(rising edge/High level)都是固定不能改变。GIC必须被编程来适应这一点。BootROM不会对这些寄存器进行编程,因此SDK设备驱动程序必须对GIC进行编程以适应这些敏感类型。
\qquad 对于电平敏感类型的中断,请求源必须为中断处理程序提供一种机制,以便在中断被确认后清除中断。这一要求适用于任何高电平敏感类型的IRQF2Pn
\qquad 对于边缘敏感类型的中断,请求源必须提供足够宽的脉冲以便GIC捕获。这通常至少是2个CPU_2x3x周期。这个要求适用于任何情况IRQF2Pn具有上升边缘灵敏度类型的中断。
\qquad ICDICFR2通过ICDICFR5寄存器配置所有SPI的中断类型。每个中断有一个2bit字段,它指定了敏感类型和处理模型。

7、中断敏感类型、目标和处理方式
\qquad 有三种类型的中断:SPI, PPI和SGI。一般来说,中断信号包括一个敏感类型设置,一个或两个CPU处理中断,以及哪些CPU是目标:0、1或两者都是。然而,大多数中断信号的功能包括固定的设置,而其他的是部分可编程的。
\qquad 有两个系列寄存器用于配置敏感类型、中断处理和触发目标: mpcore.ICDICFR[5:0]用于配置敏感类型和中断处理,mpcore.ICDIPTR[23:0]用于触发目标。

8、中断优先级
\qquad 所有的中断请求(PPI、SGI和SPI)都被分配一个惟一的ID号。控制器使用ID号进行仲裁。中断分发服务器持有每个中断的挂起中断列表然后选择最高优先级的中断,然后将它发送给CPU接口。具有同等优先级的中断通过选择最低的ID来解决。
\qquad 优先级逻辑在物理上进行了复制,以允许为每个CPU同时选择最高优先级的中断。中断分发程序保存中断、处理器和激活信息的中心列表,并负责向cpu触发软件中断。
\qquad 存储SGI和PPI分发器寄存器,为每个连接的处理器提供单独的副本。硬件确保了针对多个CPU的中断一次只能被一个CPU占用。
\qquad 中断分发服务器向CPU接口传输最高的挂起中断。它接收回已被确认的中断,然后可以改变相应中断的状态。只有确认中断的CPU才能结束中断。

9、中断处理
\qquad 如果在GIC中的中断是挂起的,并且IRQ是失效的,那么GIC中的中断将变为非活动的(CPU永远不会看到它)。
\qquad 如果在GIC中中断是有效的(因为CPU接口已经确认了中断),那么软件ISR首先通过检查GIC寄存器判断中断源,然后轮询I/O外设中断状态寄存器来确定原因。

10、中断程序设计实现步骤
1) 设置中断向量表和解析程序;
2) 对中断源进行配置;
3) 中断分配器(ICD)初始化;
4) 中断控制器(ICC)初始化;
5) 中断分配器(ICD)配置;
6) CPSR寄存器进行配置;
7) 中断服务程序设计;

11、PL-PS中断实例
\quad PL触发PS中断,中断为电平敏感。
1)BD配置及连线
\quad 在中断窗口中选中PL-PS通用中断
在这里插入图片描述
\quad 将接口连接到PL端
在这里插入图片描述
2)PS端代码

void Init_Gic_Int(void) // 中断寄存器配置
{
	int Int_Id = 61; // PL中断为中断列表的第61号

	Xil_Out32(0xf8f01184,0xffffffff);//GIC屏蔽中断     ICDICER1
	Xil_Out32(0xF8F00108,0x0000000f);// ICCBPR 中断优先级的二进制小数
	Xil_ExceptionEnable(); //CPSR中设置允许 IRQ中断
	Xil_Out32(0xF8F00110,Int_Id);// ICCEOIR 写中断结束寄存器 PL中断 #61
	Xil_Out32(0xF8F0183D,0x00000200);// ICDIPTR 分配中断的CPU接口  #CPU1
	Xil_Out32(0xF8F01400+(Int_Id/4)*4,0x000000a0);// ICDIPR 中断优先级  Int_Id=61,优先级设置为0xa0
	Xil_Out32(0xF8F00100,0x00000007);// ICCICR  CPU接口控制    使用IRQ中断,开所有中断
	Xil_Out32(0xF8F00104,0x00000000);//ICCPMR   中断优先级屏蔽  设为0
	Xil_Out32(0xf8f01c0c,0x55555555);//中断敏感类型 高电平   ICDICFR3

	//  注册中断回调函数 void call_back()

	Xil_Out32(0xf8f01104,0xffffffff);//GIC使能中断位      ICDISER1
}
void call_back()
{
	// 函数主体
	Xil_Out32(0xf8f01284,0x10000000);//ICDICPR1   清中断标志   #61号 PL中断
}

12、寄存器表

名字寄存器描述绝对地址
ICCICRCPU接口控制0xf8f00100
ICCPMR中断优先级屏蔽0xf8f00104
ICCBPR用于中断优先级的二进制小数点0xf8f00108
ICCIAR中断响应0xf8f0010c
ICCEOIR中断结束0xf8f00110
ICCRPR运行优先级0xf8f00114
ICCHPIR最高待处理的中断0xf8f00118
ICCABPR非安全二进制小数点寄存器别名0xf8f0011c
ICCIDR(ro)CPU 接口实现者识别寄存器0xf8f001fc
ICDDCR发布控制寄存器0xf8f01000
ICDICTR(ro)控制器实现0xf8f01004
ICDIIDR(ro)控制器实现0xf8f01008
ICDISR0中断安全0xf8f01080
ICDISER0中断设置使能00xf8f01100
ICDISER1中断设置使能10xf8f01104
ICDISER2中断设置使能20xf8f01108
ICDICER0中断清除00xf8f01180
ICDICER1中断清除10xf8f01184
ICDICER2中断清除20xf8f91188
ICDISPR0中断设置待处理0xf8f01200
ICDISPR1中断设置待处理0xf8f01204
ICDISPR2中断设置待处理0xf8f01208
ICDICPR0清除待处理0xf8f01280
ICDICPR1清除待处理0xf8f01284
ICDICPR2清除待处理0xf8f01288
ICDABR0中断活动0xf8f01300
ICDABR1中断活动0xf8f01304
ICDABR2中断活动0xf8f01308
ICDIPRn中断优先级0xf8f01400 ~ 0xf8f01428
ICDIPTRn(ro)中断目标0xf8f01800 ~ 0xf8f0185c
ICDICFR0(ro)SGI触发敏感类型配置0xf8f01c00
ICDICFR1PPI触发敏感类型配置0xf8f01c04
ICDICFR2~5SPI触发敏感类型配置0xf8f01c08 ~ 0xf8f01c14
ICDSGIRSGI寄存器0xf8f01f00
  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Zynq是一款Xilinx公司的片上系统(SoC),它将传统的处理系统(PS,即Processing System)和可编程逻辑(PL,即Programmable Logic)集成在一起。PSPL之间的通信是通过DMA(Direct Memory Access)实现的。 DMA是一种高效的数据传输方式,它可以在不经过处理器的情况下直接将数据从一个设备传输到另一个设备的内存中。在Zynq中,DMA控制器可以在PSPL之间进行数据传输,以实现高速的数据交换。 在使用ZynqPSPL之间进行通信时,首先需要在PL中实例化一个DMA控制器,并将其配置为与PS内存进行交互。然后,在PS中通过相应的软件驱动程序或API接口配置和控制DMA控制器。通过设置合适的寄存器和缓冲区,可以实现从PSPL的数据传输或从PLPS的数据传输,以及在传输过程中的中断处理。 PSPL之间的DMA通信可以实现快速的数据交换,因为数据可以直接在PL中进行处理,无需经过PS的干预。这对于需要高速数据处理的应用非常有用,比如图像处理、信号处理等。 需要注意的是,使用DMA进行PSPL之间的通信需要合理地配置和管理DMA控制器的缓冲区和寄存器,以及在PSPL之间的数据传输过程中进行正确的同步和互斥操作,以避免数据冲突和错误。 总之,Zynq PSPL之间的通信使用DMA可以实现高速的数据传输和处理,为嵌入式应用带来了更大的灵活性和高效性。 ### 回答2: Zynq系统中的PS(Processing System)与PL(Programmable Logic)之间的通信可以通过DMA(Direct Memory Access)实现。 DMA是一种特殊的数据传输机制,它可以在不需要CPU的干预下,在内存和外设之间直接传输数据。在Zynq系统中,PSPL之间的DMA通信可以通过AXI(Advanced eXtensible Interface)总线实现。 首先,在Zynq系统中,PS可以使用AXI DMA控制器来设置数据传输的源地址、目的地址、传输长度等参数。这些参数可以通过PS的程序来配置。 然后,在PL中,我们可以使用AXI接口来设计自定义的IP(Intellectual Property)核,该IP核可以与AXI DMA进行通信。这个IP核可以通过PL开发工具进行开发和配置。 接下来,通过适当的设计和配置,我们可以在PL中连接AXI DMA核和其他IP核,以实现PSPL之间的数据传输。例如,我们可以将一个读取数据的IP核连接到AXI DMA的输入端口,将一个写入数据的IP核连接到AXI DMA的输出端口。这样,当AXI DMA启动数据传输时,读取数据的IP核将从PL的某个存储器中读取数据,然后通过DMA传输到PS的某个存储器中,而写入数据的IP核将从PS的某个存储器中读取数据,然后通过DMA传输到PL的某个存储器中。 总之,通过使用AXI DMA和适当的设计和配置,Zynq系统中的PSPL之间可以进行高效的数据传输和通信。这种方式可以提高系统的性能和可扩展性,并且降低了CPU的负载,提供了更好的系统整合能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值