ZYNQ的中断系统

        ZYNQ和STM32等嵌入式的操作系统非常相似,但由于PL端的硬件可以自己编程,所以在中断信号的触发方面会有些区别。这篇文件将介绍一个最简单但完整的中断相应过程。

     ZYNQ的中断系统

PL-PS Interrupt Ports (来自PL到PS的中断)

PL-PS Interrupt Ports是指从Zynq的可编程逻辑(PL)发出并被处理系统(PS)接收的中断信号。这些中断使得PL可以通知PS某些事件已经发生或者需要注意的情况。

  • IRQ_F2P (Interrupt Request from Fabric to Processor)
    • 这个端口是可编程逻辑(PL)向处理器发送中断请求的信号。
    • 这些信号被映射到GIC的SPI(Shared Peripheral Interrupts)中断输入中。
    • 开发者需要在PS端对应的GIC配置中中断号并编写中断服务程序。

在Vivado设计工具中,开发者可以连接不同的硬件模块产生的中断到这些port上,并且配置信号到PS端的映射。

PS-PL Interrupt Ports (来自PS到PL的中断)

PS-PL Interrupt Ports是由处理系统(PS)发出并由可编程逻辑(PL)部分接收的中断信号。这些中断可以用于PS通知PL执行特定操作或触发某些事件。

  • IRQ_P2F (Interrupt Request from Processor to Fabric)
    • 这个端口允许PS向PL发出中断请求。
    • 在PL内,需要相应的逻辑来检测这一信号并作出响应,比如状态机的转换或触发数据处理流程。
  • Core_nFIQ:
    •  ​​FIQ​ 是 "Fast Interrupt Request" 的缩写,是一种用于高优先级中断的信号。
    • 每个处理器核心(Core_n,其中n代表核心编号)都有一个独立的 FIQ 输入,用来接收快速中断。
    • 这些 FIQ 通常由实时性要求很高的中断源驱动,因为它们会被处理器以极高的优先级处理。

在Vivado中配置PS到PL的中断意味着你在PS端生成中断信号,并设置合适的逻辑路径以便迅速地导向PL端需要处理中断的逻辑单元。

配置这些Ports时,开发者需要确保PL和PS的中断系统逻辑正确连接,并在系统中耦合相关的软件和硬件部分。例如,在PS端写对应的驱动程序和中断服务例程来响应PL发出的中断,以及在PL端对PS发出的中断信号编写适当的硬件逻辑。

如何使用中断

 PL端的配置

        首先需要在ZYNQ的IP核配置中断,比如这里选择了PL-PS的IRQ_P2F。

        这里一个重要的信息是ID号,之后在PS端编程的时候要用。        我这里用两个信号线连接上了其中的两个端口[1:0],对应的ID号也就是62和61。

PS端的配置

  然后我们看看PS端是怎么操作和这个联系起来的。

  • PS端首先要对中断进行初始化,这个很好理解,不管使用什么资源,第一步一般都是初始化。
  • 注册特定异常的处理程序,这是为了能够在发生中断或异常时,正确、有效地响应这些事件。
  • 连接中断和中断处理函数,这里要把中断ID,和具体的中断处理函数连接起来,比如我这里的SW1线连接到了IRQ_F2P[0],当它触发中断响应信号的时候,哪个函数响应。
  • 中断的配置,比如优先级,两个中断信号同时到达的是先响哪个,响应信号类型,是响应高电平或者上升沿等。
  • 中断使能,使能以后才能使用,也可以用此来关闭中断。

        下面是一个具体配置中断的代码,调用的都是自动生成的函数,这里不懂的可以去看看ZYNQ从入门到不放弃

int IntcInitFunction(u16 DeviceId)
{
    XScuGic_Config *IntcConfig;
    int status;

    // 这一步是对中断的初始化,首先通过设备ID去看看我们生成的硬件里面有没有中断
    IntcConfig = XScuGic_LookupConfig(DeviceId);
    status = XScuGic_CfgInitialize(&INTCInst, IntcConfig, IntcConfig->CpuBaseAddress);
    if(status != XST_SUCCESS) return XST_FAILURE;


    // 这一步是注册特定异常的处理程序,前两个输入的参数是自动生成的,最后一个是我们使用的中断实例的地址
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
                                 (Xil_ExceptionHandler)XScuGic_InterruptHandler,
                                 &INTCInst);
    Xil_ExceptionEnable();

   //这一步把中断号和中断函数连接起来,这里的中断号SW1_INT_ID设置为61,SW2_INT_ID为62,连接的函数为SW_intr_Handler。
    status = XScuGic_Connect(&INTCInst,
                             SW1_INT_ID,
                             (Xil_ExceptionHandler)SW_intr_Handler,
                             (void *)1);
    if(status != XST_SUCCESS) return XST_FAILURE;

    status = XScuGic_Connect(&INTCInst,
                             SW2_INT_ID,
                             (Xil_ExceptionHandler)SW_intr_Handler,
                             (void *)2);
    if(status != XST_SUCCESS) return XST_FAILURE;


    // 这里对中断的响应类型进行设置,上升沿触发信号
    IntcTypeSetup(&INTCInst, SW1_INT_ID, INT_TYPE_RISING_EDGE);
    IntcTypeSetup(&INTCInst, SW2_INT_ID, INT_TYPE_RISING_EDGE);

    // 对中断进行使能
    XScuGic_Enable(&INTCInst, SW1_INT_ID);
    XScuGic_Enable(&INTCInst, SW2_INT_ID);

    return XST_SUCCESS;
}

写在最后

        当时学的时候,只知道一会配置这个函数一会配置那个函数,非常的迷惑,特别是PL端的信号线怎么和最后的响应函数联系起来的。所以写这篇文章梳理一下,希望帮助到和我有一样问题的小伙伴。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值