0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ARM体系架构处理器的中断程序分析

454398 来源:CSDN博主 作者:husipeng86 2020-11-21 11:10 次阅读

基础知识

ARM体系架构的处理器中通常将低地址32字节作为中断向量表,当中断产生时会执行以下操作:

① 保存处理器当前状态,设置中断屏蔽位和各条件标志位
② 设置当前程序状态寄存器CPSR中相应位
③ 将lr_mode寄存器设置成返回地址
④ 跳转到中断向量地址执行,从而跳转到相应的中断程序中执行
⑤ 执行中断处理函数内容
⑥ 恢复被屏蔽的中断屏蔽位
⑦ 返回到被中断指令的下一条指令处继续执行

zynq中低32字节作为中断向量表,每个中断占据4字节,这4字节通常存储一个跳转指令,从而跳转到中断解析程序中。这低32字节中断向量表如:


本内容部分修改自《Xilinx Zynq SoC与嵌入式Linux设计实战指南——兼容ARM Cortex-A9的设计方法》

例程

vivado中ps部分配置如下图:


选中Fabric Interrupts和IRQ_F2P[15:0]

连接如下图:


其中Concat模块只是简单的将多个信号合并为一个总线连接到zynq;而Utility Vector Logic则是执行一些逻辑计算,这里选择not逻辑计算。

#include 
#include "platform.h"
#include "xscugic.h"
#include "xil_exception.h"

#define INT_CFG0_OFFSET 0x00000C00

// Parameter definitions
#define SW1_INT_ID              61
#define SW2_INT_ID              62
#define SW3_INT_ID              63
#define INTC_DEVICE_ID          XPAR_PS7_SCUGIC_0_DEVICE_ID
#define INT_TYPE_RISING_EDGE    0x03
#define INT_TYPE_HIGHLEVEL      0x01
#define INT_TYPE_MASK           0x03

static XScuGic INTCInst;

static void SW_intr_Handler(void *param);
static int InterruptSystemSetup(XScuGic *XScuGicInstancePtr);
static int IntcInitFunction(u16 DeviceId);

static void SW_intr_Handler(void *param)
{
    int sw_id = (int)param;
    printf("SW%d int/n/r", sw_id);
}

void IntcTypeSetup(XScuGic *InstancePtr, int intId, int intType)
{
    int mask;

    intType &= INT_TYPE_MASK;
    mask = XScuGic_DistReadReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4);
    mask &= ~(INT_TYPE_MASK << (intId%16)*2);
    mask |= intType << ((intId%16)*2);
    XScuGic_DistWriteReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4, mask);
}

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

    // Interrupt controller initialisation
    IntcConfig = XScuGic_LookupConfig(DeviceId);
    status = XScuGic_CfgInitialize(&INTCInst, IntcConfig, IntcConfig->CpuBaseAddress);
    if(status != XST_SUCCESS) return XST_FAILURE;

    // Call to interrupt setup
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
                                 (Xil_ExceptionHandler)XScuGic_InterruptHandler,
                                 &INTCInst);
    Xil_ExceptionEnable();

    // Connect SW1~SW3 interrupt to 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;

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

    // Set interrupt type of SW1~SW3 to rising edge
    IntcTypeSetup(&INTCInst, SW1_INT_ID, INT_TYPE_RISING_EDGE);
    IntcTypeSetup(&INTCInst, SW2_INT_ID, INT_TYPE_RISING_EDGE);
    IntcTypeSetup(&INTCInst, SW3_INT_ID, INT_TYPE_RISING_EDGE);

    // Enable SW1~SW3 interrupts in the controller
    XScuGic_Enable(&INTCInst, SW1_INT_ID);
    XScuGic_Enable(&INTCInst, SW2_INT_ID);
    XScuGic_Enable(&INTCInst, SW3_INT_ID);

    return XST_SUCCESS;
}

int main(void)
{
    init_platform();

    print("PL int test/n/r");
    IntcInitFunction(INTC_DEVICE_ID);
    while(1);
    cleanup_platform();
    return 0;
}

例程修改自z-turn例程

过程分析

查看U585第231页,可以看到从PL部分输入的中断号为{[91:84],[68:61]}对应IRQ_F2P[15:0],这里使用IRQ_F2P[2:0],所以才有SW1_INT_ID到SW3_INT_ID定义为61到63。

分析中断执行要从中断执行开始的中断向量表开始,查找.org 0,可以在BSP目录下/ps7_cortexa9_0/libsrc/standalone_v5_2/src下asm_vectors.s文件中的第64行可以找到,其下便是中断向量表,作为IRQ中断,在中断向量表中为第5条(地址:0x18)指令,对应第77行B IRQHandler,跳转到IRQHandler标签,其后第99行再次跳转到IRQInterrupt,从BSP目录下/ps7_cortexa9_0/libsrc/standalone_v5_2/src下vectors.c文件中可以找到IRQInterrupt函数,其中调用XExc_VectorTable[XIL_EXCEPTION_ID_IRQ_INT].Handler(XExc_VectorTable[XIL_EXCEPTION_ID_IRQ_INT].Data);即IRQ中断最终调用了XExc_VectorTable数组中第XIL_EXCEPTION_ID_IRQ_INT(即5)个成员的Handler函数,并传入Data作为参数

回到以上例程中有Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,&INTCInst);从BSP目录下/ps7_cortexa9_0/libsrc/standalone_v5_2/src下xil_exception.c中可找到此函数,其将(Xil_ExceptionHandler)XScuGic_InterruptHandler和&INTCInst赋值给XExc_VectorTable第XIL_EXCEPTION_ID_INT(即5)个成员的Handler和Data成员,结合上一段中说明,则IRQ中断最终执行了:XScuGic_InterruptHandler(&INTCInst)。

再看以上例程有status = XScuGic_Connect(&INTCInst,SW1_INT_ID,(Xil_ExceptionHandler)SW_intr_Handler,(void *)1);,可以从BSP目录下/ps7_cortexa9_0/libsrc/standalone_v5_2/src下xscugic.c中可找到此函数,可以看到(其中InstancePtr对应&INTCInst;Int_Id对应SW1_INT_ID;Handler对应SW_intr_Handler;CallBackRef对应1,当然其它中断分别为2,3):

InstancePtr->Config->HandlerTable[Int_Id].Handler = Handler;        //  即参数SW_intr_Handler
InstancePtr->Config->HandlerTable[Int_Id].CallBackRef = CallBackRef;//  即参数1

即将处理函数(SW_intr_Handler)及其参数(1)放到&INTCInst中,
再次回到IRQ中断后会执行的XScuGic_InterruptHandler函数(在BSP目录下/ps7_cortexa9_0/libsrc/standalone_v5_2/src下xscugic_intr.c)中有以下语句:

TablePtr = &(InstancePtr->Config->HandlerTable[InterruptID]);
if(TablePtr != NULL) {
    TablePtr->Handler(TablePtr->CallBackRef);
}

即当TablePtr不为空时就执行了InstancePtr->Config->HandlerTable[InterruptID]->Handler(InstancePtr->Config->HandlerTable[InterruptID]->CallBackRef);结合上一段说明即执行了SW_intr_Handler(1)或参数为2、3。

综上,IRQ中断产生后跳转到0x18执行B IRQHandler执行,在IRQHandler下执行bl IRQInterrupt;在函数IRQInterrupt中XExc_VectorTable[XIL_EXCEPTION_ID_IRQ_INT].Handler(XExc_VectorTable[XIL_EXCEPTION_ID_IRQ_INT].Data);经过Xil_ExceptionRegisterHandler函数后即XScuGic_InterruptHandler(&INTCInst)再经过XScuGic_Connect函数这也即SW_intr_Handler(1)或参数为2、3。最终IRQ中断执行了SW_intr_Handler函数。

编辑:hfy


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8643

    浏览量

    361659
  • Zynq
    +关注

    关注

    9

    文章

    598

    浏览量

    46594
收藏 人收藏

    评论

    相关推荐

    什么是ARM中断事件?ARM中断异常处理具体过程

    ARM处理器是一种流行的处理器架构,用于许多现代移动设备和嵌入式系统中。中断和异常是ARM
    发表于 09-05 15:45 807次阅读
    什么是<b class='flag-5'>ARM</b><b class='flag-5'>中断</b>事件?<b class='flag-5'>ARM</b><b class='flag-5'>中断</b>异常<b class='flag-5'>处理</b>具体过程

    ARM体系结构对应处理器

    本帖最后由 i2c 于 2014-10-13 10:52 编辑 ARM处理器内核列表 ARM体系架构
    发表于 10-13 10:49

    ARM处理器体系架构详细说明

    本帖最后由 i2c 于 2014-10-13 16:10 编辑 ARM 体系结构是构建每个 ARM 处理器的基础。ARM
    发表于 10-13 16:08

    怎么区分ARM Cortex系列的处理器

    ARM7TDMI, ARM9), Cortex-M处理器有一个非常不同的架构。例如:—仅支持ARM Thumb指令,已扩展到同时支持16位
    发表于 09-13 10:01

    Cortex系列处理器是从ARM哪个架构开始的?

    Cortex系列处理器是从ARM哪个架构开始的?arm架构和x86架构有什么区别?
    发表于 07-06 10:49

    谈谈嵌入式处理器体系架构

    当我们谈及嵌入式处理器体系架构时,一般都是想到Intel的X86架构ARM公司的ARM
    发表于 12-15 06:59

    ARM处理器的特点及其架构解析

    如下:1.3 ARM处理器系列1.3.1 Classic ARM Processors (经典 ARM 处理器)•
    发表于 04-13 12:08

    基于ARM处理器的SOC系统讲解

    处理器的区别。ARM体系架构的发展体系架构的定义:体系
    发表于 08-17 15:20

    ARM体系结构、处理器和设备开发文章

    ARM产品必须如何运行的体系结构规范。 此外,一些合作伙伴还授权实施符合架构规范的自己的ARM处理器。 这导致了分层划分为三个级别的规范,这
    发表于 08-21 07:28

    ARM处理器中断处理的编程实现

    摘要:本文首先简要概述了ARM处理器的异常中断种类、响应和返回过程;然后重点讨论了中断解析程序的原理和实现,并分别给出了普通
    发表于 03-11 12:18 765次阅读
    <b class='flag-5'>ARM</b><b class='flag-5'>处理器</b><b class='flag-5'>中断</b><b class='flag-5'>处理</b>的编程实现

    ARM9系列微处理器软件体系架构工具

    本内容提供了ARM9系列微处理器软件体系架构工具
    发表于 04-29 16:50 187次下载
    <b class='flag-5'>ARM</b>9系列微<b class='flag-5'>处理器</b>软件<b class='flag-5'>体系</b><b class='flag-5'>架构</b>工具

    ARM中断处理的研究

    ARM处理器的普通中断处理、任务切换中断处理、可重人中断
    发表于 07-06 12:08 4174次阅读
    <b class='flag-5'>ARM</b><b class='flag-5'>中断</b><b class='flag-5'>处理</b>的研究

    米尔科技ARM处理器体系架构介绍

    ARM 体系结构是构建每个 ARM 处理器的基础。ARM 体系结构随着时间的推移不断发展,其中包
    的头像 发表于 11-20 10:04 1135次阅读
    米尔科技<b class='flag-5'>ARM</b><b class='flag-5'>处理器</b><b class='flag-5'>体系</b><b class='flag-5'>架构</b>介绍

    arm处理器有哪些中断源?arm处理器对异常中断的响应过程

    arm处理器有哪些中断源?arm处理器对异常中断的响应过程 
    的头像 发表于 10-19 16:35 800次阅读

    中断ARM体系中对中断处理

    今天来看一下中断ARM体系中对中断处理,直接进入正题。 中断是指计算机运行过程中,出现某些意
    的头像 发表于 11-07 17:11 258次阅读
    <b class='flag-5'>中断</b>及<b class='flag-5'>ARM</b><b class='flag-5'>体系</b>中对<b class='flag-5'>中断</b>的<b class='flag-5'>处理</b>