色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    9104

    瀏覽量

    367794
  • Zynq
    +關注

    關注

    10

    文章

    610

    瀏覽量

    47193
收藏 人收藏

    評論

    相關推薦

    什么是ARM中斷事件?ARM中斷異常處理具體過程

    ARM處理器是一種流行的處理器架構,用于許多現代移動設備和嵌入式系統中。中斷和異常是ARM
    發表于 09-05 15:45 ?1924次閱讀
    什么是<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 16:10 編輯 ARM 體系結構是構建每個 ARM 處理器的基礎。ARM
    發表于 10-13 16:08

    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 ?886次閱讀
    <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 ?4277次閱讀
    <b class='flag-5'>ARM</b><b class='flag-5'>中斷</b><b class='flag-5'>處理</b>的研究

    ARM處理器編程模型之異常中斷處理分析

    3.4 異常中斷處理 異常或中斷是用戶程序中最基本的一種執行流程和形態。這部分主要對ARM架構
    發表于 10-18 13:29 ?1次下載

    淺談ARM處理器的特點和體系結構

    ARM處理器包括ARM7、ARM9、ARM9E、ARM10E、SecurCore、以及Int
    發表于 04-03 11:17 ?1.7w次閱讀

    米爾科技ARM處理器體系架構介紹

    ARM 體系結構是構建每個 ARM 處理器的基礎。ARM 體系結構隨著時間的推移不斷發展,其中包
    的頭像 發表于 11-20 10:04 ?4794次閱讀
    米爾科技<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 ?1478次閱讀

    中斷ARM體系中對中斷處理

    今天來看一下中斷ARM體系中對中斷處理,直接進入正題。 中斷是指計算機運行過程中,出現某些意
    的頭像 發表于 11-07 17:11 ?777次閱讀
    <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>
    主站蜘蛛池模板: 含羞草免费完整视频在线观看| 戳女人屁股流水羞羞漫画| 日本无码欧美激情在线视频| 久久精品中文字幕| 好姑娘社区在线视频| 国产精品久久久久久久人热| 俄罗斯1819y0u| 俄罗斯aaaa一级毛片| 大香交伊人| 动漫美女的禁| 高h肉文合集| 国产电影尺度| 国产精品久久久久久熟妇吹潮软件| 国产 亚洲 中文字幕 在线| 国产VA精品午夜福利视频| 国产不卡一卡2卡三卡4卡网站| 国产不卡在线观看视频| 国产精品欧美一区二区在线看| 国产色偷偷男人的天堂| 狠狠色综合久久婷婷| 精品久久久久中文字幕日本| 久久re视频这里精品09首页| 久久日本精品国产精品| 毛片网站在线观看| 欧美群交XXXCOM| 色多多污污下载| 午夜人妻理论片天堂影院| 亚洲精品天堂无码中文字幕影院| 亚洲午夜久久久久久久久电影网| 一个人在线观看视频| 中文字幕一区二区三区在线不卡 | 99re6热这里在线精品视频| 99热在线视频| 成年人视频在线免费| 国产精品国产三级国产AV麻豆| 国产一区91| 久久影院中文字幕| 青柠视频在线观看高清HD| 天天爽夜夜爽| 一个人在线观看视频| 99热久久这里只精品国产WWW|